内部类
定义:所谓内部类,不是指在一个java源文件中编写两个平行的类,而是在一个类的内部再定义另外一个类。再外部的类称为外部类,其内部编写的类称为内部类
内部类分为四种
一、成员内部类(实例内部类,非静态内部类)
注:成员内部类中不能写静态属性和静态方法
public class Test {
private String name;
private static int age;
public void say(){}
public static void go(){}
public class InstanceInner{
public void run() {
System.out.println(Test.age);
System.out.println(new Test().name);
}
}
}
成员内部类访问外部类的成员变量:
静态变量:外部类名.属性名
非静态:外部类名.this.属性名(new 外部类().属性名)
生成成员内部类对象:
外部类名.内部类名 变量名= new 外部类().new 成员内部类()
二、静态内部类
注:静态内部类中可以写静态属性和静态方法
public class Test {
public static class InstanceInner{
}
}
静态内部类访问外部类的成员变量:
静态:外部类名.属性名
非静态:new 外部类().属性
生成静态内部类对象
在外部类中: new 内部类()
在其他类中: new 外部类.内部类()
三、局部内部类
局部内部类是在方法内部声明的一个类
局部内部类中可以访问外部类的成员变量及方法
局部内部类中如果要访问该内部类所在方法中的局部变量,那这个局部变量必须是final修饰的
public class LocalOutterClass{
public static void main(String[] args) {
new LocalOutterClass().test(10);
}
private String name="bob";
private static int age=10;
public void say(){}
public static void go(){}
public void test(final int j){
final int i = 10;
class LocalInnerClass{
private String name="jack";
private int age=20;
public void say(){
System.out.println(name);//jack
System.out.println(this.name);//jack
System.out.println(LocalInnerClass.this.name);//jack
System.out.println(LocalOutterClass.this.name);//bob
System.out.println(LocalOutterClass.age);//10
System.out.println(LocalInnerClass.this.age);//20
LocalOutterClass.this.say();
LocalOutterClass.go();
System.out.println(i);//10
System.out.println(j);//10
}
}
LocalInnerClass lic = new LocalInnerClass();
lic.say();
}
}
局部内部类访问外部类的成员变量
静态:类名.属性
非静态:类名.this.属性
无法在外部类和其他类中生成内部类对象。
四、匿名内部类
匿名内部类是最常用的一个内部类
1.匿名内部类需要依托于其他类或者接口来创建,如果依托于类那么默认创建的匿名内部类就是这个类的子类,如果依托于接口那么创建的这个匿名内部类就是折光接口的实现类。
2.匿名内部类的声明必须是在使用new关键字的时候。匿名内部类声明及创建对象的时候必须一气呵成,并且之后不能反复使用,因为他没有名字。
A a = new A(){
//实现A中的抽象方法
//或者重写A中的普通方法
};
//B是一个接口
//依托于B接口创建一个匿名内部类对象
B b = new B(){
//实现B中的抽象方法
};
3.匿名内部类除了依托的类或者接口之外,不能指定继承或者实现其他类或者接口,同时也不能被其他类所继承,因为没有名字。
4.匿名内部类中,我们无法写构造器,因为没有名字。
5.匿名内部类中我们一般除了重写上面的方法不会写其他的方法,因为外部不能直接调用。
public interface Test{
void run();
}
public class OutterClass{
private String name;
private static int age;
public void say(){}
public static void go(){}
public void test(){
final int i = 90;
Test t = new Test(){
public void run(){
System.out.println(OutterClass.this.name);
System.out.println(OutterClass.age);
OutterClass.this.say();
OutterClass.go();
System.out.println(i);
}
};
t.run();
}
}