标签(空格分隔): static
- static 关键字:
用于修饰成员(成员变量和成员函数)- 被修饰的成员具有以下的特点:
1.随着类的加载而加载
2.优先于对象存在
3.被所有对象所共享
4.可以直接被类名调用- 使用注意:
静态方法只能访问静态成员
静态方法中不可以写this,super关键字
主函数是静态的
class Person { String name; String country ="CN"; public void sho(){ System.out.println(name+"::"+country); } } class StaticDemo{ public static void main(String[] args){ Person p=new Person(); p.name="zhangsan"; p.sho(); } }
- 对于上述的案例解释说明一下:存在堆内存中
例如:Person p=new Person()
new Person()
name=null
country="cn"
第二个对象:存在堆内存中
new Person()
name=null
country="cn"
- 问题对象越多,内存的存储的共同数据就会越多,如果我们这么这么也可以,对象越多,内存中的country越多,因为country每个人都一样,问题来了,我们能不能country拿出来,作为一个共同 的,谁用谁来调用即可了,没有必要每个人都要具备一个,比较浪费内存空间;
static String country ="CN";
- 静态static
用法:是一个修饰符,用于修饰成员(成员变量和成员函数),不能修饰局部,被静态修饰后,不在堆内存中,这样static修饰内容被静态所共享,不是每个对象,在堆内存中产生一个,这样就节约了内存;
class Person { String name; static String country ="CN"; public void sho(){ System.out.println(name+"::"+country); } } class StaticDemo{ public static void main(String[] args){ // Person p=new Person(); // p.name="zhangsan"; // p.sho(); System.out.println(Person.country); } }
- 当成员被静态修饰后,就多了一种调用方式,除了可以被对象调用外,还可以直接被类名调用,写法格式类名.静态成员
class Person { String name; static String country ="CN"; public void sho(){ System.out.println(name+"::"+country); } } class StaticDemo{ public static void main(String[] args){ Person p=new Person(); // p.name="zhangsan"; // p.sho(); System.out.println(p.country); } }
问题:那我们能补能所有的都是用静态呢?
答案不能:姓名不可能定义为static
static的利弊:
- 利处:对于共享的数据进行单独空间的存储,节省空间,没有必要每个对象都存储一份,可以直接使用类名调用;
- 弊端:声命周期过长,访问出现局限性(静态虽好,只能访问静态,访问不了非静态)
- 主函数是静态的;