主要思想
主要为了标记下java关于静态变量,静态方法,静态块,静态嵌套类,内部类之间的关系
参考
Java 静态类、静态方法和静态变量
http://hongyubox.com/2016/08/05/Java%20%E9%9D%99%E6%80%81%E7%B1%BB%E3%80%81%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%E5%92%8C%E9%9D%99%E6%80%81%E5%8F%98%E9%87%8F/
Java 静态变量、方法、快,(非)静态内部类 https://www.jianshu.com/p/8cb87b7177ef
为什么Java内部类要设计成静态和非静态两种? https://www.zhihu.com/question/28197253
静态对象
- 全局唯一的,一改全改,保持数据的唯一性;
- 引用时只需 类名.静态变量 或 类名.静态方法 即可,无需get,set;
- 与final联合使用,可以视为 全局常量,即一旦赋值不能更改;
静态变量
- 属于类而非对象或实例;
静态方法
- 只能访问或调用其他静态变量或方法;
- 不能引入this,super(this);
静态块
- 仅在类被加载时执行一次;
- 不能访问非静态变量,方法;
静态嵌套类
- 在类的内部使用static修饰一个类;
- 只能访问外部类的静态方法或变量;
- 可以直接创建,无需先创建外部类对象;
- 我是静态内部类,只不过是想借你的外壳用一下。本身来说,我和你没有什么“强依赖”上的关系。没有你,我也可以创建实例。那么,在设计内部类的时候我们就可以做出权衡:如果我内部类与你外部类关系不紧密,耦合程度不高,不需要访问外部类的所有属性或方法,那么我就设计成静态内部类。而且,由于静态内部类与外部类并不会保存相互之间的引用,因此在一定程度上,还会节省那么一点内存资源,何乐而不为呢;
内部类
- 嵌套在类的内部;
- 可以访问外部类的变量和方法和外部类中的其他内部类;
- 创建对象时必须依赖于外部类的创建;
- 如果设计类B的目的只是为了给类A使用,就可以将B设定为内部类,没必要将B设置成单独的java文件,防止与其他类产生依赖关系;
- 不能含有静态内容,inner classes cannot have static declaration;
public class Outter {
private int variable0 = 0;
private static int variable1 = 1;
private final static int variable2 = 3;
static {
variable1 = 4;
}
public void solution1(){
System.out.println(variable0 + " " + variable1 + " " + variable2);
}
public static void solution2(){
System.out.println(variable1 + " " + variable2);
}
public void solution5(){
InnerTwo two = new InnerTwo();
two.solution4();
}
class InnerOne{
private int variable3 = 5;
public void solution3(){
solution1();
solution2();
System.out.println(variable0 + " " + variable1 + " " + variable2 + " " + variable3);
}
}
class InnerTwo{
InnerOne one = new InnerOne();
public void solution4(){
one.solution3();
}
}
static class InnerThree{
private int variable4 = 6;
private static int variable5 = 7;
private final static int variable6 = 8;
public void solution5(){
solution2();
System.out.println(variable1 + " " + variable2 + " " + variable4 + " " + variable5 + " " + variable6);
}
public static void solution6(){
solution2();
System.out.println(variable1 + " " + variable2 + " " + variable5 + " " + variable6);
}
}
public static void main(String[] args){
System.out.println(Outter.variable1 + " " + Outter.variable2 + " " + InnerThree.variable5 + " " + InnerThree.variable6);
Outter.solution2();
Outter.InnerThree.solution6();
Outter.InnerThree three = new Outter.InnerThree();
System.out.println(three.variable4);
three.solution5();
Outter out = new Outter();
System.out.println(out.variable0);
out.solution1();
Outter.InnerOne one = out.new InnerOne();
System.out.println(one.variable3);
one.solution3();
}
}