Java中 按有无 static 划分,只有两类
- 实例成员(无 static):实例变量、实例方法
- 静态成员(有 static):静态变量、静态方法
1. 实例成员(无 static)
只要 new 创建出实例对象:
- 每个对象会生成独一份实例变量,不同对象互不干扰;
- 只有通过对象才能调用实例方法,类名无法直接调用;
- 实例方法内部自带
this,指代当前调用该方法的对象; - 实例方法内可以直接访问实例变量、实例方法,也能直接访问静态变量/静态方法。
2. 静态成员(static,归属类,不归对象)
- 全局仅一份,所有对象共享;
- 推荐调用方式:
类名.静态方法/静态变量;语法上允许对象调用,但编码规范不推荐; - 静态方法内没有 this,不能直接调用实例方法、直接使用实例变量;
- 静态方法只能直接访问静态变量、静态方法;想使用实例成员,必须手动 new 对象。
实例方法里完全可以用 this 调用静态方法 ,只是语法不推荐,底层本质还是 类名.静态方法;
真正限制是:静态方法里不能使用 this。
极简总结
new出来的对象,独占全部实例变量、拥有全部实例方法的调用权;- 静态资源属于类,和对象本身无关,只是 Java 语法允许对象点调用;
- 有无
this是实例方法与静态方法最核心的分界线。 - 只要
new出来对象,这个对象就具备本类全部非静态成员(变量+方法);静态成员跟对象无关,只属于类。
配套小示例
java
public class Demo {
// 实例变量
private String name;
// 静态变量
public static String addr = "北京";
// 实例方法
public Demo setName(String name) {
this.name = name;
// 实例方法中可以用this调用静态方法,合法但不规范
this.showStatic();
return this;
}
// 静态方法
public static void showStatic() {
// 报错!静态方法没有this,拿不到实例变量
// System.out.println(this.name);
System.out.println(addr);
}
public static void main(String[] args) {
Demo d = new Demo();
d.setName("张三");
// 标准写法
Demo.showStatic();
// 语法允许,不推荐
d.showStatic();
}
}