修饰符-static

一、static静态修饰符

static修饰符能够修饰属性,方法,初始代码块,不能修饰局部变量和类。

静态的变量叫常量,非静态的变量叫实例变量。

1、修饰属性

package gc.test.java.cs2;

public class Info{
    
    public static String NAME = "张三";
    public String addr = "湖北武汉";
}
package gc.test.java.cs2;

public class Main {

    public static void main(String[] args) {
        Info info1 = new Info();
        System.out.println("name:" + info1.NAME);
        System.out.println("addr:" + info1.addr);
        
        info1.NAME = "李四";
        info1.addr = "北京";
        
        Info info2 = new Info();
        System.out.println("name:" + info2.NAME);
        System.out.println("addr:" + info2.addr);
    }
}

运行结果:

name:张三
addr:湖北武汉
name:李四
addr:湖北武汉

通过上面的运行结果可以看出,Info在第一次被实例化之后,修改Info中的静态变量NAME和变量addr,在第二次实例化之后,静态变量NAME被修改了,但是变量addr被初始化了。可以看出,静态变量是所有实例对象共享的,它属于类,不属于某个实例对象。

2、修饰方法

package gc.test.java.cs2;

public class Info{
    
    public static String NAME = "张三";
    public String addr = "湖北武汉";
    public String sex = "男";
    
    public static void showName(){
        System.out.println("我的名字叫" + NAME);
    }
    
    public static void showAddr(){
        System.out.println("我住在" + addr);//编译错误
    }
    
    public void showSex(){
        System.out.println("我是" + sex + "生");
    }
}
package gc.test.java.cs2;

public class Main {

    public static void main(String[] args) {
        Info.showName();
        //Info.showSex();//编译错误
        Info info = new Info();
        info.showSex();
    }
}

上面代码中出现第一处编译错误的地方,可以看出静态方法只能访问静态成员。

在第二处出现编译错误的地方,可以看出非静态方法只能通过实例化对象来调用,而静态方法可以直接通过类名.方法名来调用。

package gc.test.java.cs2;

public class Info{
    
    public static String NAME = "张三";
    public String addr = "湖北武汉";
    public String sex = "男";
    
    public static void showName(){
        String name = this.NAME;//编译错误
        System.out.println("我的名字叫" + NAME);
    }
    
    public void showSex(){
        String name = this.NAME;
        System.out.println("我是" + sex + "生");
    }
}

上面代码中,一个静态方法和一个非静态方法中,同时使用了this关键字,在静态方法中出现编译错误。

package gc.test.java.cs2;

public class Info{
    
    public static void showName(){
        
    }
    
    public void showSex(){
        
    }
    
}
package gc.test.java.cs2;

public class Member extends Info{

    public static void showName(){
        
    }
    
    public  void showSex(){
        
    }
}

上面代码中是编译正常,如果将Member中的代码改为

package gc.test.java.cs2;

public class Member extends Info{

    public void showName(){//编译错误
        
    }
    
    public static void showSex(){//编译错误
  } 
}

可以看出,静态方法只能重写静态方法,非静态方法只能重写非静态方法。

3、修饰代码块

package gc.test.java.cs2;

public class Info{
    
    Info(){
        System.out.println("Info的无参构造函数");
    }
    
    static{
        System.out.println("Info中的静态代码块");
    }
}
package gc.test.java.cs2;

public class Main {

    public static void main(String[] args) {
        Info info = new Info();
    }
}

运行结果:

Info中的静态代码块
Info的无参构造函数

通过上面的结果,可以看出,静态代码块在实例化对象的时候就执行了,而且执行顺序是在无参构造函数之前。

原文地址:https://www.cnblogs.com/guochang/p/9555385.html