静态与非静态

什么是静态?

被static修饰的为静态,static可用来修饰变量、方法、内部类、代码块。


注意:

1、static不能用来修饰外部类、接口、抽象类、抽象方法。

2、接口中的变量可以不用明确的声明为静态的,但必须赋值,因为变量默认为public static final。

3、接口中的方法不能被声明为静态的,接口中的方法默认为public abstract,属于抽象方法。


静态与非静态的区别

1、变量

static修饰的变量称为类变量静态变量,该变量为该类的所有实例所共享;当某个类的实例修改了静态成员变量时,其修改值对该类的其它实例可见。

调用方法:直接通过类名访问

没有static修饰的变量称为实例变量,该变量为该类的各对象独立所有;当某个类的实例修改了非静态成员变量时,其修改值对该类的其它实例不可见。

调用方法:必须创建对象,之后才能访问。

2、方法

情况与变量类似。

3、类 

static修饰的类只能是内部类,叫做静态内部类。详见静态内部类详解


ClassA代码:

public class ClassA {
    public static String s1 = "this is s1 in A";
    public String s2 = "this is s2 in A";
}

测试:

public class MainClass {
    public static void main(String[] args) {
        ClassA a1 = new ClassA();
        System.out.println(ClassA.s1);// this is s1 in A
        System.out.println(a1.s1);// this is s1 in A
        System.out.println(a1.s2);// this is s2 in A
        a1.s1 = "a1 modified s1";// 修改静态变量
        a1.s2 = "a1 modified s2";// 修改非静态变量
        ClassA a2 = new ClassA();
        System.out.println(ClassA.s1);// a1 modified s1
        System.out.println(a2.s1);// a1 modified s1
        System.out.println(a2.s2);// this is s2 in A
    }
}

从测试中可以看出:

1、在对象a1中修改了静态变量s1,在对象a2中s1的值被改变了;可知当某个类的实例修改了静态成员变量时,其修改值对该类的其它实例可见

2、在对象a1中修改了非静态变量s2,在对象a2中s2的值没有改变;可知当某个类的实例修改了非静态成员变量时,其修改值对该类的其它实例不可见

3、静态变量s1可通过ClassA.s1访问,也可以通过a1.s1访问,其结果是一样的;可知静态变量并不依赖与实例,可直接通过类名进行访问

4、非静态变量s2只能通过对象进行访问;可知非静态变量依赖于实例,访问前必须先创建实例。

原文地址:https://www.cnblogs.com/SQP51312/p/6112567.html