static关键字

static关键字

静态的,作为普通修饰符

  1. 修饰成员变量/方法 --->静态变量/方法||类变量/类方法

在普通方法里面可以访问静态方法,但是静态方法中不能方法非静态成员,如果非要访问的话可以创建类的对象来访问成员(例如:new Test().name;),且不能使用this,当class被加载时,static也被加载,但是static只被加载一次。对于静态成员,推荐使用:类名.静态成员变量/方法,这种语法在本类和其他类均可使用,例如:Math.pow(a,b)用的就是类和方法

如果静态属性外部也可以访问,一般都是:public static final 常量名称,例如:常数pi的底层代码public static final PI=3.14159

由于当类被加载的时候static也被加载,那就说明static代码块优先级高于普通代码块,普通代码块优先级高于构造方法。

public Demo1() {
        System.out.println("构造方法代码块");
    }
    {
        System.out.println("普通代码块");
    }
    static{
        System.out.println("static代码块");
    }
public static void main(String[] args) {
    Demo1 demo=new Demo1();
}

输出结果

static代码块
普通代码块
构造方法代码块

而且如果创建两次对象的话

public static void main(String[] args) {
        Demo1 demo=new Demo1();
        Demo1 demo1=new Demo1();
    }

static的代码块只被加载一次,输出结果:

static代码块
普通代码块
构造方法代码块
普通代码块
构造方法代码块

例子:

利用static保证有且只有一个对象

public class Demo1 {
    public static Demo1 ob;//创建一个Demo1类的实例对象
    private Demo1() {
        System.out.println("构造方法代码块");
    }//因为只能创建一个对象,所以构造方法得是私有的
    
    static{
        //在static里面给对象开辟空间,并且初始化数据,保证对象只被new一次
        ob=new Demo1();
    }
}
  1. static修饰类-->内部类

    在类的内部:

    1. 成员内部类:
      1. 静态内部类
      2. 非静态内部类
    2. 方法内部类
    3. 匿名内部类
@Setter
@Getter
public class MyClass {
    private int num;
    public static class Child{
        public int a=200;
        public void b(){
            System.out.println("hello,b"+a);
        }
        public static void  c(){
            System.out.println("hello,c");
        }
    }
}
public class Demo1Test {
    public static void main(String[] args) {
       //目的:访问child类的属性和方法
        MyClass myClass = new MyClass();
        MyClass.Child childclass=new MyClass.Child();
        //创建child类的对象,child在myclass下,需要加上myclass
        System.out.println(childclass.a);
        childclass.b();//对象调用public方法
        MyClass.Child.c();//用类名直接调用static成员
    }
}
posted @ 2022-10-17 16:52  Liku007  阅读(41)  评论(0编辑  收藏  举报