Java static关键字的使用详解


一、static关键字概述

功能

1.用来修饰类属性和类变量。
2.加载静态代码块。

特点

1.类变量的生命周期和类相同,在整个应用程序执行期间都有效
2.static修饰的成员变量和方法,属于类,可以直接通过类来调用
3.静态方法不能调用非静态(方法/变量),编译会报错
4.被static修饰的成员方法、变量没有this关键字 (不依赖于任何对象)

意义

1.在不创建对象时,可以直接使用类名.(方法/变量)
2.当一个类的某一属性内容固定时,可以节约资源开销
举个栗子:
假设一个类的某一属性为:国籍
那么为中国14亿人口创建14亿个对象,存入数据,那么就会有14亿个"中国"被重复存储,浪费大量资源。而static关键字正可以避免这种重复存储的"尴尬"。
static直接将属性信息存储到 “类” 中,可以直接通过类名.静态属性来实现读取修改即可

public class Chinese{
     
     
   private String ID;//身份证号码
   private String name;//姓名
   static String nationality = "中国";//国籍
   
   构造方法,setter和getter方法 略
}

二、被static关键字修饰的属性和方法

1.被static修饰的属性

定义格式

class Chinese{
    
    
static String nationality;//国籍
}

使用 — 赋值

//======(推荐)直接使用类名赋值=========
Chinese.nationality = "中国";

//======(不推荐)使用对象名赋值=========
Chinese peopleOne = new Chinese("37**************11","张 __ __ ");
peopleOne.nationality = "中国";

使用 — 调用

扫描二维码关注公众号,回复: 12797005 查看本文章
//======(推荐)直接使用类名调用=========
System.out.println(Chinese.nationality);

//======(不推荐)使用对象名调用=========
Chinese peopleTwo = new Chinese("37**************22","李 __ __ ");
System.out.println(peopleTwo.nationality);

完整代码示例

class Chinese{
    
    
    private String ID;//身份证号码
    private String name;//姓名

    //使用static修饰国籍
    static String nationality;//国籍

    public Chinese() {
    
    }
    public Chinese(String ID, String name) {
    
    this.ID = ID;this.name = name;}
    public String getID() {
    
    return ID;}
    public void setID(String ID) {
    
    this.ID = ID;
    public String getName() {
    
    return name;}
    public void setName(String name) {
    
    this.name = name;}
    public static String getNationality() {
    
    return nationality;}
    public static void setNationality(String nationality) {
    
    Chinese.nationality = nationality;}
}

public class Test {
    
    
    public static void main(String[] args) {
    
    

        //(推荐)使用类名.变量名进行赋值
        Chinese.nationality = "中国";
        //(推荐)使用类名.setter方法赋值
        Chinese.setNationality("中国");

		//=======静态属性未被private修饰时两种赋值方式

        //创建第一个对象
        Chinese peopleOne = new Chinese("37**************11","张 __ __ ");
        //(不推荐)使用对象名.变量名进行赋值
        peopleOne.nationality = "中国";
        //(不推荐)使用对象名.setter方法赋值
        peopleOne.setNationality("中国");
        System.out.println(
                "身份证号码为:"+peopleOne.getID()+","+
                "姓名:"+peopleOne.getName()+","+
                //(推荐)使用类名.变量名获取变量值
                "国籍:"+Chinese.nationality+"。");

        //创建第二个对象
        Chinese peopleTwo = new Chinese("37**************22","李 __ __ ");
        System.out.println(
                "身份证号码为:"+peopleTwo.getID()+","+
                        "姓名:"+peopleTwo.getName()+","+
                        //(不推荐)使用对象名.变量名获取变量值
                        "国籍:"+peopleTwo.nationality+"。");
    }
}

程序运行截图
在这里插入图片描述

2.被static修饰的方法

定义格式

[权限修饰符] static [返回值类型] 方法名称([参数列表]){
    
    
	[方法体;]
}

使用 — 调用

类名.方法名([参数列表]);

完整代码示例

class MyClass {
    
    
    public void memberMethod(){
    
    
        System.out.println("这是一个成员方法!");
        //必须创建一个对象来调用!
    }

    public static void staticMethod(){
    
    
        System.out.println("这是一个静态方法!");
        //可以使用类名直接调用(推荐)
        //也可以使用对象名调用(不推荐)
    }
}

public class Test {
    
    
    public static void main(String[] args) {
    
    
    
        //使用对象调用成员方法和静态方法
        MyClass my = new MyClass();
        //使用对象调用成员方法
        my.memberMethod();
        
        //(不推荐)对象调用静态方法
        my.staticMethod();
        System.out.println("============");
        //(推荐)使用类名调用静态方法
        MyClass.staticMethod();
    }
}

3.static在内存中运行的过程

1.方法区加载类的相关信息(被static修饰的变量和方法会被放入方法区中的静态区)
2.main()方法进入栈内存
3.程序开始按顺序执行
在这里插入图片描述

三、静态代码块

只有第一次执行静态代码块所在的类时
静态代码块会执行唯一一次
以后再用到静态代码块所在的类时,
静态代码块不会再执行

静态代码块的使用

public class Test {
     
     
   static {
     
     
       System.out.println("静态代码块执行了!");
   }
   public Test(){
     
     
       System.out.println("构造方法执行了!");
   }
}
public class TestDemo{
     
     
   public static void main(String[] args) {
     
     
       Test t1 = new Test();
       Test t2 = new Test();
       Test t3 = new Test();
   }
}

运行结果
在这里插入图片描述

典型用法:

用来一次性的对静态成员变量进行赋值。

猜你喜欢

转载自blog.csdn.net/weixin_44580492/article/details/106057234