1、内部类
内部类的主要优点是内部类实例与外部类实例共享一种特殊关系。这种特殊关系为内部类中的代码提供对外部类成员的访问。
内部类是外部类的一部分不仅仅是一部分,而且是外部类带有卡片的成员。这样内部实例作为外部类的成员,可以访问外部类的成员变量,甚至private成员。
1)、常规内部类
//1、从外部类代码内实例化内部类
class MyOuter{
private int x=7;
public void makeInner(){
MyInner in = new MyInner();
in.seeOuter();
}
class MyInner{
public void seeOuter(){
System.out.println("Outer x is"+x);
}
}
}
//2、从外部类实例代码之外创建内部类实例
public static void main(String[] args){
MyOuter mo=new MyOuter();
MyOuter.MyInner inner=mo.new MyInner();
inner.seeOuter();
}
new MyOuter().new MyInner()
从内部类中引用内部或外部实例
- 关键字 this 只能从实例代码内部使用,也就是说它不能用在静态代码内。
- this引用是对当前执行对象的引用。
- this引用是对对象把对自己的引用作为方法参数传递给其他方法。
eg:new Myclass().dostuff(this);
内部类代码引用自身:this
内部类代码引用外部this:<NameOfOuterClass>.this
2、本地方法内部类
- 如果想实际引用这个内部类,则必须在这个方法内,但是在该内部类定义下面的某个地方为他建立实例。
- 方法本地内部类与外部类共享一种关系。访问外部的成员变量。但内部类对象不能访问所在方法的局部变量。除非方法是final。也就是成员变量是final的。
- 唯一能应用于方法本地内部类的修饰符是abstract和final
- 静态方法内的内部类只能访问外部类的静态方法
//匿名内部类
//样式1:popcorn子类的实例
class Popcorn{
public void pop(){
System.our.println("pp");
}
}
class Food{
Popcorn p = new Popcorn(){
public void pop(){
System.out.println('any');
}
};
}
//如果调用父类中没有定义的任何方法,编译器都会抱怨。
//样式2:创建指定接口类型的匿名设计类
interface Cookable{
public void cook();
}
class Food{
Cookable c= new Cookable(){//Cookable是接口(接口是不能实例化的)
public void cook(){
System.out.println('any');
}
};//因为匿名内部类是实现接口设计类可以new
}
//匿名内部类只能设计一个接口
//匿名内部类不能同时扩展一个类和实现一个接口
3、静态方法内部类
非内部类,只能访问静态方法,不能访问外部类的实例变量和方法,是外部类的静态成员。
class BigOuter{
static void Nested{}
}
class Broom{
public static void main(String[] args){
BigOuter.Nested n=new BigOuter.Nested();
}
}