内部类:类里面再声明类
1》默认内部类
class Outer{
private int a = 12;
class Inner{
public void test2(){
//"内部类"可以直接访问"外部类"的成员,包括私有。
System.out.println("内部类访问外部的变量a=" + a);
}
}
}
创建内部类方式:Outer.Inner inner = new Outer().new Inner();
在内部类方法中访问外部类成员变量 Outer.this.a
访问内部类成员变量 this.a
访问方法内变量 a
2》私有内部类
class Outer{
private int a = 12;
private class Inner{
public void test2(){
System.out.println("内部类访问外部的变量a=" + a);
}
}
public void test1(){
Inner inner = new Inner();
inner.test2();
}
}
私有内部类外部无法访问
3》静态内部类
class Outer{
private int a = 12;
static class Inner{
public void test2(){
System.out.println("内部类访问外部的变量a=" + a);
}
}
}
创建方式:Outer.Inner inner =new Outer.Inner();
4》局部内部类
class Outer{
public void test1(){
final int a = 10;//局部变量
class Inner{//局部内部类
public void test2(){
System.out.println(a);
}
}
Inner inner = new Inner();
inner.test2();
}
}
面试题:局部内部类访问该方法内局部变量时,变量要加final修饰,为什么?
因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。
这里存在一个疑问,那就是它的引用如何能被传递出去,我试过在外部类中定义该内部类的引用,结果是无法找到该类。
jdk1.8,不加final代码不会报错,jdk1.7以下的版本不写final会报错
其实就是在jdk1.8的环境下,系统帮你默认添加了final关键字
匿名内部类
记住,这种匿名内部类的内部是相对于外部类而言的,不是相对于接口或者抽象类
》抽象类的匿名内部类
》接口的匿名内部类
》new 抽象类 或者接口,都必须实现里面的所有未实现的方法
java接口中可以定义类,也不仅限于抽象类。只是接口本身不能被实例化,接口内部的类是可以实例化的。
调用接口的内部类有两种方法:
1.接口名.类名 Outer.Inner inner =new Outer.Inner();
2.创建实现类implements接口,再直接实例化内部类
网友评论