1.static修饰方法
static修饰的方法不能被重写,可以被继承
Test1
Test2
可以看到,被static修饰的方法可以被继承
而下面的代码
从这个打印结果可以看出,父类Test1的方法并没有被重写
这也解释了为什么抽象类中的方法不能被static修饰
抽象类是不能被实例化的,也就是不能被分配内存的,而static在类被加载之前就会分配内存,这样就会很矛盾,所以抽象类中的方法不能被static修饰
2.static修饰成员变量
static修饰的成员变量在类被加载的时候初始化,静态变量和非静态变量存放的位置不一样,静态变量存放在数据区中,非静态变量如类的属性存放在对象中,而对象存放在堆中,所以非静态变量可以有多个副本并且互不影响,静态变量被所有对象共享,只有一个副本
例如下面的代码
打印的结果为
可见,flag有多个副本,互不影响
3.static修饰代码块
用static修饰代码块会提高程序的性能,节省内存
例如:
package Day4;
public class Person {
private int age;
public Person(int age) {
this.age = age;
}
void printInfo() {
Integer initialAge = 20;
if ((initialAge - this.age) == 0) {
System.out.println("年龄等于20岁");
return;
}
if ((initialAge - this.age) >= 0) {
System.out.println("年龄小于20岁");
return;
}
if ((initialAge - this.age) < 0) {
System.out.println("年龄大于20岁");
return;
}
}
public static void main(String[] args) {
Person p1 = new Person(20);
p1.printInfo();
}
}
这段代码在每次调用printInfo()方法的时候都会创建Integer对象
下面这段代码用静态代码块优化了后,就不用在每次调用方法后都创建对象,可以节省内存
package Day4;
public class Person1 {
private int age;
private static Integer initialAge;
public Person1(int age) {
this.age = age;
}
static {
initialAge = 20;
}
void printInfo() {
if ((initialAge - this.age) == 0) {
System.out.println("年龄等于20岁");
return;
}
if ((initialAge - this.age) >= 0) {
System.out.println("年龄小于20岁");
return;
}
if ((initialAge - this.age) < 0) {
System.out.println("年龄大于20岁");
return;
}
}
public static void main(String[] args) {
Person1 p1 = new Person1(20);
p1.printInfo();
}
}