第十章 内部类
可以将一个类的定义放在另一个类的定义内部,这就是内部类。
10.3使用.this与.new
练习4:在Sequence.SequenceSelector类中增加一个方法,它可以生成对外部类Sequence的引用。
/**
* 作者:LKP
* 时间:2018/8/24
*/
public class Sequence {
class SequenceSelector{
public Sequence getSequence(){
return Sequence.this;
}
}
}
练习5:创建一个包含内部类的类,在另一个独立的类中,创建此内部类的实例。
/**
* 作者:LKP
* 时间:2018/8/24
*/
public class PracticeDemo {
public static void main(String[] args){
Practice p = new Practice();
Practice.PracticeSequence ps = p.new PracticeSequence();
ps.show();
}
}
class Practice{
public class PracticeSequence{
public void show(){
System.out.println("我是内部类!");
}
}
}
10.4内部类与向上转型
练习6:(2)在第一个包中创建一个至少有一个方法的接口。然后在第二个包内创建一个类,在其中增加一个protected的内部类以实现那个接口。在第三个包中,继承这个类,并在一个方法中返回该protected内部类的对象,再返回的时候向上转型为第一个包中的借口和类型。
第一个包:
/**
* 作者:LKP
* 时间:2018/8/25
*/
public interface Practice6_1 {
int show();
}
第二个包:
/**
* 作者:LKP
* 时间:2018/8/25
*/
public class Practice6_2 {
public class Pra6_2 implements Practice6_1{
@Override
public int show() {
return 0;
}
}
}
第三个包:
/**
* 作者:LKP
* 时间:2018/8/25
*/
public class Practice6_3 extends Practice6_2 {
public static void main(String[] args){
Practice6_3 p = new Practice6_3();
Practice6_1 pra = p.getPra();
System.out.println(pra.show());
}
public Practice6_1 getPra(){
return new Pra6_2();
}
}
10.8为什么需要内部类
即必须在一个类中以某种方式实现两个接口。由于借口的灵活性,你有两种选择:使用单一类,或者使用内部类。
如果使用内部类,还可以获得其他一些特性:
1.内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立。
2.在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个类。
3.创建内部类对象的时刻并不依赖于外围类对象的创建。
4.内部类并没有令人疑惑的“is-a”关系;它就是为一个独立的实体。