首先介绍一下静态成员和实例成员
1.1 什么是静态成员
- 静态成员也叫做共享成员,静态成员包括:静态属性、静态方法、静态块(静态字段)
- 静态成员是通过 static 修饰的属性、方法、字段
public class Person{
//静态属性
static String name;
static int age;
//静态方法
public static void sayHello(){
System.out.println(name);
}
//静态块(静态字段),为static变量初始化,静态块在首次类名出现时调用,但后于分配静态变量。
static{
age = 20;
}
}
1.2 什么是实例成员
- 没有通过 static 修饰的属性、方法就是实例成员
public class Person{
//实例属性
String name;
int age;
//实例方法
public void sayHello(){
System.out.println(name);
}
}
1.3 区别
- 静态成员需要通过 static 修饰,实例成员不需要通过 static 修饰
- 静态成员属于类,可以直接通过“类名.静态成员”的方式访问(类名可以省略不写),也可以通过“对象.静态成员”的方式访问
(不推荐此用法,容易与实例访问方法混淆)
。 - 实例成员属于对象,必须实例化对象后,才能够通过“对象.实例成员”的方式访问。
- 当程序首次运行到类时,该类下的所有静态成员都会在方法区中被分配内存,且只分配一次,直到程序退出时才会被释放;
当类实例化对象时,才会为对象的实例成员在堆中分配内存,且实例化几个对象就会为其分配几个内存 - 静态方法中不允许调用实例成员,而实例方法可以调用静态成员。
因为静态成员在首次运行到所在类时就会分配空间,实例成员在类实例化时才会分配内存,不实例化就不会分配内存。所以此时让静态方法去调用一个不知道存不存在的实例成员(也就是内存),这显然是不合理的。
静态方法和实例方法的访问权限:
静态变量 | 静态方法 | 实例变量 | 实例方法 | |
---|---|---|---|---|
静态方法 | ||||
实例方法 |
`
1.4 常见的问题---判断代码编写是否正确
例1:
public class Test {
static int age;
public static void main(String[] args) {
age = 2;
}
}
正确
分析:此时是静态方法调用静态属性,age = 2 等同于 Tset.age = 2 代码正确
例2:
public class Test {
int age;
public static void main(String[] args) {
age = 2;
}
}
错误
分析:此时是静态方法调用实例属性,代码错误
修改方法:
public class Test {
int age;
public static void main(String[] args) {
Test test = new Test();
test.age = 2;
}
}
例3:
public class Test {
public static void main(String[] args) {
}
public void sayHello(){
}
public static void sayHi(){
sayHello();
}
}
错误
分析:静态方法 sayHi() 调用实例方法 sayHello() 代码错误
修改方法:去掉sayHi()方法的static,或在sayHello ()方法添加static修饰符
例4:
public static void main(String[] args) {
}
public void sayHello(){
this.sayHi(null);
}
public static void sayHi(Test t){
t.sayHello();
}
正确
分析:静态方法 sayHi() 调用实例方法 sayHello(),但因为实例方法 sayHello() 又调用静态方法 sayHi(),相当于静态方法 sayHi()自己调自己。代码正确
例5:
public class Test {
int age;
public static void main(String[] args) {
new Test().age = 2;
}
public static void sayHi(){
}
public static void sayHello(){
this.sayHi();
}
}
正确
分析:静态方法 sayHi() 调用静态方法 sayHello(),第四行代码等同于 例2修改方法中的 4、5 行,代码正确