static关键字:
a、使用static与非static属性声明的区别?
b、static声明的属性或方法可以直接由类名称调用(用非static声明的属性和方法只能是实例化对象来调用,不能直接用类名来调用其属性或方法。这样如果一个属性或方法经常使用就不用实例化对象了,直接通过类名来调用了。不用一遍遍创建对象,提高了效率)
c、static方法只能访问static声明的属性或方法,不能访问非static
d、静态代码块是用static声明的代码块,以及他的执行顺序是怎样的
1、Java中常用的内存区域
(1)栈内存:保存所有的对象名称(保存引用的堆内存空间的地址);由编译器自动分配释放方法执行结束后,系统自动释放JVM内存资源。
(2)堆内存:保存每个对象的具体属性内容;由程序员分配(new创建)释放,jvm不定时查看这个对象,如果没有引用指向这个对象就回收。
(3)全局数据区(静态区):保存全局变量/静态变量(static类型的属性)、字符串常量;不释放。
(4)全局数据区(代码区):存放所有方法的二进制代码,多个对象共享一个代码区域。
2、static声明属性
每个对象都有自己的属性,如果现在有些属性希望被所有对象共享,必须声明为static属性,可直接用类名称调用。
例如,定义一个Person类,含有属性:name、age、city,打印输出实例化后的对象。如果我们要修改city信息的话,之前我们已经产生了100个对象了,把city改了这样就会修改100次,效率可想而知。改进:我们把city(可能要经常修改的属性)声明为static,在全局数据区其他的所有对象都可以访问这个属性。这样我们通过“类名称”.city="";为他修改值,其他的对象就都对应改了,只改一次。
具体实现如下:
public class Person {
String name;
int age;
static String city = "A城";//使用static定义城市属性
// 使用构造方法设置name和age,不用设置静态区地城市了
public Person(String name, int age){
this.name = name;
this.age = age;
}
public String toString(){
return "姓名:"+this.name+",年龄:"+this.age+",城市:"+city;
}
}
public class StaticDemo01 {
public static void main(String[] args) {
Person p1 = new Person("张三",22);
Person p2 = new Person("李四",24);
Person p3 = new Person("王五",33);
System.out.println("--------修改之前-------");
System.out.println(p1+"\n"+p2+"\n"+p3);
Person.city = "B城";//修改static属性,用类名称直接调用
System.out.println("--------修改之后-------");
System.out.println(p1+"\n"+p2+"\n"+p3);
}
}
输出结果:
--------修改之前-------
姓名:张三,年龄:22,城市:A城
姓名:李四,年龄:24,城市:A城
姓名:王五,年龄:33,城市:A城
--------修改之后-------
姓名:张三,年龄:22,城市:B城
姓名:李四,年龄:24,城市:B城
姓名:王五,年龄:33,城市:B城