实例成员、静态成员

Java中 按有无 static 划分,只有两类

  1. 实例成员(无 static):实例变量、实例方法
  2. 静态成员(有 static):静态变量、静态方法

1. 实例成员(无 static)

只要 new 创建出实例对象:

  1. 每个对象会生成独一份实例变量,不同对象互不干扰;
  2. 只有通过对象才能调用实例方法,类名无法直接调用;
  3. 实例方法内部自带 this,指代当前调用该方法的对象;
  4. 实例方法内可以直接访问实例变量、实例方法,也能直接访问静态变量/静态方法。

2. 静态成员(static,归属类,不归对象)

  1. 全局仅一份,所有对象共享;
  2. 推荐调用方式:类名.静态方法/静态变量;语法上允许对象调用,但编码规范不推荐;
  3. 静态方法内没有 this,不能直接调用实例方法、直接使用实例变量;
  4. 静态方法只能直接访问静态变量、静态方法;想使用实例成员,必须手动 new 对象。

实例方法里完全可以用 this 调用静态方法 ,只是语法不推荐,底层本质还是 类名.静态方法

真正限制是:静态方法里不能使用 this

极简总结

  1. new 出来的对象,独占全部实例变量、拥有全部实例方法的调用权;
  2. 静态资源属于类,和对象本身无关,只是 Java 语法允许对象点调用;
  3. 有无 this 是实例方法与静态方法最核心的分界线。
  4. 只要 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();
    }
}