0426 java内部类
静态内部类
使用static修饰的内部类我们称之为静态内部类,我们要知道只要是static修饰的类那它一定是内部类,不可能是外部类。 静态内部类与非静态内部类之间存在一个最大的区别,非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类的对象,但是静态内部类却没有。没有这个引用就意味着:
- 它的创建不需要依赖于外围类的对象
- 它不能使用任何外围类的非static成员变量和方法(因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象)见下面例子
- 静态内部类内允许有static属性、方法;
public class OuterClass {
String outerField = "Outer field";
static String staticOuterField = "Static outer field";
class InnerClass {
void accessMembers() {
System.out.println(outerField);
System.out.println(staticOuterField);
}
}
static class StaticNestedClass {
void accessMembers(OuterClass outer) {
// Compiler error: 不能访问Outer class的非static变量
// System.out.println(outerField);
System.out.println(outer.outerField);
// 可以通过创建外部类的对象来访问外部类的非static变量
System.out.println(staticOuterField);
}
}
}
为什么只有成员内部类能加static,外部类不能加?
静态内部类的应用场景??
成员内部类 (非静态成员内部类)
- inner和outer有相同名称变量或方法时,默认使用的是谁的?
inner的。 - 第一题中,如何调用outer的变量或方法?
外部类.this.成员变量
外部类.this.成员方法
- 如何创建一个inner对象?
一般有以下两种:
public class OutClass {
private InnerClass getInner() {
return new InnerClass();
}
public class InnerClass{}
public static void main(String... str) {
OutClass out = new OutClass();
InnerClass inner1 = out.getInner();
InnerClass inner2 = out.new InnerCLass();
}
}
参考:
添加链接描述