相关知识:
内部类继承自某个接口或实现某个接口,内部类的代码操作创建他的外围类的对象。内部类提供了进入外围类的窗口。
每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类没有影响。
内部类提供的、可以继承多个具体或抽象的类的能力,这是解决多重继承的解决方案。
因为内部类可以随意使用外部类的成员变量(包括私有)而不用生成外部类的对象,这也是内部类的唯一优点。可以访问外围类的所有成员。
如同心脏可以直接访问身体的血液,而不是通过医生来抽血。
外部类将有一个方法,该方法返回一个指向内部类的引用。
如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象,那么必须像在main()方法中一样,具体指明这个对象的类型:OuterClassName.InnerClassName.
需要生成对外部类对象的引用,可以使用外部类的名字后和.this。
用其他对象创建内部类对象,new语法
public class DotNew{
public class Inner{}
public static void main(String[] args){
DotNew dot = new DotNew();
DotNew.Inner dd = dot.new Inner();
}
}
内部类的好处:
实现了某类型的接口,于是可以创建并返回对其的引用。
要解决复杂的问题,想创建一个类来辅助解决方案,但不希望这个类是公共可用的。
匿名内部类:
public class testA{
public Contents Contents{
return new Contents{
private int i =11;
public int value(){
return i;
}
}
}
public static void main(String[] args){
testA aa = new testA()
Contents cc = p.Contents();
}
}
//等价
public class test{
class Myclass implements Contents{
private int i =11;
public int value(){
return i;
}
}
public Contents contents(){
return new Myclass ();
}
public static void main(String[] args){
test tt = new test();
Contents c = tt.contents();
}
}
如果不需要内部类对象与其外围类对象之间有联系,可以将内部类声明为static,嵌套类。
创建嵌套类的对象,并不需要外围类的对象。
不能从嵌套类的对象中访问非静态的外围对象。
接口内的类:
创建某些公共代码,使得他们可以被某个接口的所有不同实现所共有,那么使用接口内部的嵌套类会显得方便。
内部类的一些特征:
内部类可以有多个实例,每个实例都有自己的状态信息。并且与其外围类对象的信息相互独立。
在单个外围类中,可以让不同的内部类以不同的方式实现同一个接口,或继承同一个类。
创建内部类对象并不依赖外围类对象。内部类就是一个独立的实体。
闭包:一个可调用的对象,记录了一些信息,这些信息来自于创建它的作用域。
回调:对象能够携带一些信息,这些信息允许他在稍后的某个时刻用初始的对象。