静态和实例的区别

首先介绍一下静态成员和实例成员

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 区别

  1. 静态成员需要通过 static 修饰,实例成员不需要通过 static 修饰
  2. 静态成员属于类,可以直接通过“类名.静态成员”的方式访问(类名可以省略不写),也可以通过“对象.静态成员”的方式访问(不推荐此用法,容易与实例访问方法混淆)
  3. 实例成员属于对象,必须实例化对象后,才能够通过“对象.实例成员”的方式访问。
  4. 当程序首次运行到类时,该类下的所有静态成员都会在方法区中被分配内存,且只分配一次,直到程序退出时才会被释放;
    当类实例化对象时,才会为对象的实例成员在堆中分配内存,且实例化几个对象就会为其分配几个内存
  5. 静态方法中不允许调用实例成员,而实例方法可以调用静态成员。
    因为静态成员在首次运行到所在类时就会分配空间,实例成员在类实例化时才会分配内存,不实例化就不会分配内存。所以此时让静态方法去调用一个不知道存不存在的实例成员(也就是内存),这显然是不合理的。

静态方法和实例方法的访问权限:

静态变量 静态方法 实例变量 实例方法
静态方法 \color{green}{直接访问} \color{green}{直接访问} \color{red}{不能直接访问} \color{red}{不能直接访问}
实例方法 \color{green}{直接访问} \color{green}{直接访问} \color{green}{直接访问} \color{green}{直接访问}

`

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 行,代码正确

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容