java入门基础 static final 关键字 修饰符 解释(通俗易懂)

  • finalstaticfinal static 区别解释?

    • static是用来修饰静态资源的(包括类、方法、变量等),final 是用来保证当前变量为常量,final static即保证为静态常量(意思就是不依赖于对象去调用,也不可以被改变)
    • final 可以用在方法参数声明中,保证引用变量不会被改变(只读)。
  • 这其中也需要看所修饰的为对象还是变量或者常量

首先解释一下static所修饰的变量、方法、类它们都是可以单独存在,静态类一定是静态内部类

  1. 静态内部类可以声明普通成员变量和方法,而普通内部类不能声明static变量和方法(final static为除外,他本质也是常量)。

  2. 静态内部类使用场景一般是当外部类需要使用内部类,而内部类无需依赖于外部类资源,并且内部类可以单独创建的时候

可修饰的位置介绍:

  1. 静态内部类和静态变量可无限套娃:static 可修饰成员变量和方法和内部类。
class T1 {
    static int n;
    public static void t() { }
    static class T2{
        static int n;
        static class T3{
            static int n;
        }
    }

    public static void main(String[] args) {
        System.out.println(T1.n);
        System.out.println(T1.T2.n);
        System.out.println(T1.T2.T3.n);
    }
}

不可修饰的位置注意点:

  1. 内部类(非静态)不能有静态声明(成员变量、方法)原因:非静态内部类需要实例化外部类去调用该类,
class C1 {
    static int n;
    class C2 {
        static int n;   // 编译报错: Inner classes cannot have static declarations
    }
}
  1. 非静态变量、方法、类不可以被静态方法实例化引用

    由于 this(main函数)为静态方法,相当于一定存在,但是 类C2 非静态(说明他为类C1的成员),静态方法main() 一定存在,编译器也需要方法内的实例化对象或者说引用的对象一定存在,但是类C2存在的前提是类C1实例也存在(无法保证)。

    如下列代码中,可通过本类的非静态方法去实例化内部类调用方法,因为这样保证了C1类实例一定是存在的。

class C1 {
    
    class C2 {
        private int id;
        private String name;
        public void test2(){ }
    }
   
    public static void main(String[] args) {
        C2 c2 = new C2(); // 编译不通过, java: 无法从静态上下文中引用非静态 变量 this
        C1 c1 = new C1(); // 正确调用C2.test2()
        c1.test1();
    }

    public void test1() {
        C2 c2 = new C2();
        c2.test2();
    }
}

总结:无论是变量、方法、类。它们都可称为资源,所谓资源的静态和非静态。即静态资源就是可单独存在,非静态资源需要依赖于实例对象去调用,他不可单独存在。

posted @ 2022-10-04 14:02  lam要努力  阅读(78)  评论(0编辑  收藏  举报