今天就内部类做一些简单的复习
内部类:在 Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。
广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。下面就先来了解一下这四种内部类的用法。
1、成员内部类
public class Outer {
private static String outstr = "外部类";
static class Inner{
private String innerstr="内部类";
public void print(){
System.out.println(innerstr);
}
}
public void fun(){
//在外部类内部创建内部类 一般对象创建方法
Inner in = new Inner();
in.print();
}
public static void main(String[] args) {
//内部类可以访问外部类的私有属性
//内部类可以方便的访问彼此的私有域(包括私有方法,私有属性)
Outer out = new Outer();
out.fun();
//在外部类外部创建非静态内部类
//外部类.内部类 内部对象 = new 外部对象().new 内部对象()
// Outer.Inner inner = new Outer().new Inner();
// System.out.println("外部类调用内部类");
//inner.print();
/*//在外部类外部创建静态内部类
Outer.Inner inner = new Outer.Inner();
inner.print();*/
}
}
成员内部类,当内部类前面无static修饰时,内部类作为外部类的一个成员,内部类可以无条件的访问外部类的所有属性,(包括private成员和静态成员)。当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。
在外部类创建非静态外部类
外部类.内部类 内部对象 = new 外部对象().new 内部对象() 例如 Outer.Inner inner = new Outer().new Inner();
非静态内部类是依附外部类存在的,要想创建内部类,就要先创建出外部类,在通过外部类创建出内部类。
解释:将所创建的文件进行编译,编译出来后产生两个文件,
反编译Outter$Inner.class,就会发现,里面含有一个指向外部类的一个引用。
因此通过这个引用,成员内部类可以无条件的访问成员外部类。
2、局部内部类
局部内部类是定义在一个方法里面或者作用域里面,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
注意: 局部内部类就像是方法里面的一个局部变量一样,是不能有 public、protected、private 以及 static 修饰符的。
3、匿名内部类
//匿名内部类
/* public void test(final int b) {
final int a = 10;
//匿名内部类 匿名内部类和方法内部类完全一致
// 匿名内部类必须继承一个抽象类或者实现一个接口
//匿名内部类 没有类名,因此没有构造方法
new Thread(){
public void run() {
System.out.println(a);
System.out.println(b);
};
}.start();
}*/
匿名内部类也是不要有访问修饰符或者static修饰的。方法内部类如果想调用方法的形参的话,形参必须声明是final形式。
4、静态内部类
静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法,这点很好理解,因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象。
静态内部类的访问方式:
Outer.Inner inner = new Outer.Inner();
静态内部类只能访问外部静态的成员变量,不能访问非静态的变量。静态内部类是不依赖于外部类的,也就说可以在不创建外部类对象的情况下创建内部类的对象。另外,静态内部类是不持有指向外部类对象的引用的。
注意:访问不同区域的变量访问方式
结果:3 2 1