java入门基础 static final 关键字 修饰符 解释(通俗易懂)
-
final
和static
和final static
区别解释?- static是用来修饰静态资源的(包括类、方法、变量等),final 是用来保证当前变量为常量,final static即保证为静态常量(意思就是不依赖于对象去调用,也不可以被改变)
- final 可以用在方法参数声明中,保证引用变量不会被改变(只读)。
-
这其中也需要看所修饰的为对象还是变量或者常量
首先解释一下static所修饰的变量、方法、类它们都是可以单独存在,静态类一定是静态内部类
-
静态内部类可以声明普通成员变量和方法,而普通内部类不能声明static变量和方法(final static为除外,他本质也是常量)。
-
静态内部类使用场景一般是当外部类需要使用内部类,而内部类无需依赖于外部类资源,并且内部类可以单独创建的时候
可修饰的位置介绍:
- 静态内部类和静态变量可无限套娃: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);
}
}
不可修饰的位置注意点:
- 内部类(非静态)不能有静态声明(成员变量、方法)原因:非静态内部类需要实例化外部类去调用该类,
class C1 {
static int n;
class C2 {
static int n; // 编译报错: Inner classes cannot have static declarations
}
}
-
非静态变量、方法、类不可以被静态方法实例化引用
由于 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();
}
}
总结:无论是变量、方法、类。它们都可称为资源,所谓资源的静态和非静态。即静态资源就是可单独存在,非静态资源需要依赖于实例对象去调用,他不可单独存在。