上一章已经介绍了内部类中的成员内部类,可点击下方链接查看
内部类(一)—成员内部类
这一章节将介绍静态内部类
1 静态内部类
1.1 初步了解
一个类的静态成员独立于这个类的任何一个对象存在,只要在具有访问权限的地方,我们就可以通过 类名.静态成员名 的形式来访问这个静态成员;
同样,静态内部类也是作为一个外部类的静态成员而存在,并且创建一个类的静态内部类对象不需要依赖其外部类对象。
例如:
public class OuterClass {
static String name = "张三";
public static class InnerClass{
Integer age = 18;
public void print() {
System.out.println("name:"+name+" age:"+age);
}
}
public static void main(String[] args) {
InnerClass innerClass = new InnerClass();//直接通过关键字new创建一个静态内部类对象
innerClass.print();
}
}
输出结果: name:张三 age:18
从上述例子中可以直观的看出,当内部类被static修饰时,创建对象就不需要依赖外部类进行创建了,直接new就行了。
可以直观的看出,静态内部类就像外部类的一个静态成员一样,创建其对象无需依赖外部类对象(访问一个类的静态成员也无需依赖这个类的对象,因为它是独立于所有类的对象的)。
静态对象的加载在类加载的时候就已经加载了。
而外部类依然可以访问静态内部类对象的所有访问权限的成员,这一点和普通内部类无异。
1.2 调用外部类中的变量
1.2.1 外部类中的属性用static修饰
静态内部类中也无法访问外部类的非静态成员,因为外部类的非静态成员是属于每一个外部类对象的,而本身静态内部类就是独立外部类对象存在的,所以静态内部类不能访问外部类的非静态成员,
public class OuterClass {
String name = "张三";//没有用static修饰
public static class InnerClass{
Integer age = 18;
public void print() {
System.out.println("name:"+name+" age:"+age);//此处报有编辑错误,原因是静态类中不能调用非静态成员
}
}
public static void main(String[] args) {
InnerClass innerClass = new InnerClass();
innerClass.print();
}
}
1.2.2 在静态内部类中创建外部类对象
public class OuterClass {
String name = "张三";//没有用static修饰
public static class InnerClass{
OuterClass outerClass = new OuterClass();//创建外部类对象
Integer age = 18;
public void print() {
System.out.println("name:"+outerClass.name+" age:"+age);//通过外部类对象调用其成员属性
}
}
public static void main(String[] args) {
InnerClass innerClass = new InnerClass();
innerClass.print();
}
}
输出结果: name:张三 age:18
1.3 外部类调用内部类中的对象
1.3.1 静态内部类属性为非静态
public class OuterClass {
String name = "张三";
public void print2() {
InnerClass innerClass = new InnerClass();//创建内部类对象
System.out.println("调用内部类中的属性:"+innerClass.age);
}
public static class InnerClass{
Integer age = 18;//非静态内部类属性
}
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
outerClass.print2();
}
}
**输出结果:**调用内部类中的属性:18
1.3.2 静态内部类属性为静态
public class OuterClass {
String name = "张三";
public void print2() {
System.out.println("调用内部类中的属性:"+InnerClass.age);//直接通过类名.属性调用即可
}
public static class InnerClass{
static Integer age = 18;//静态内部类中的静态属性
}
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
outerClass.print2();
}
}
输出结果: 调用内部类中的属性:18