第十章 内部类

来源:互联网 发布:如何看淘宝搜索关键词 编辑:程序博客网 时间:2024/06/05 08:58

[1]   内部类,将一个类的定义放到另一个类的定义的内部。

[2]   当生成一个内部类对象时,该对象与制造它的外围对象有一种联系,它能访问其外围对象的所有成员。内部类拥有外部类的所有元素访问权限。

[3]   .this 和 .new的用法  DotThis.Inner dtii = dt.new Inner(); 内部和外部的通信方法。不能直接创建内部类的对象,要通过外部类的对象来.new创建。

[4]   在方法和作用域中定义内部类,注意其可用范围。if语句中定义类。

[5]   匿名内部类

public static GameFactory factory =new GameFactory(){

              public Game getGame(){return new Checkers();}//匿名内部类

       };

[6]   嵌套类,就是static的内部类。普通的内部类对象隐式的保存了一个引用(指向创建它的外围类对象),static的内部类则没有。普通的内部类也不能含有static对象。

[7]   static内部类,可以脱离外部类,独立创建对象。

 

10.8 为什么需要内部类

[1]   内部类的优势:每个内部类都能独立的继承自一个接口实现,外围类是否实现,对内部类没有任何影响。

[2]   接口解决了部分多重继承问题,内部类帮助解决。实现多继承的一种方式,基类为非接口时:

class D{}

abstract class E{}

class Z extends D{

    E makeE(){ return new E(){};}//匿名内部类

}

[3]   闭包和回调,内部类是面向对象的闭包,包含外围类对象的信息,还自动拥有一个指向外围类对象的引用。

[4]   控制框架,一类特殊的应用程序框架。变化的事物和不变的事物分隔开来。

10.9 内部类继承

内部类的继承:要有特殊的语法。 首先导出类的默认构造函数不适用,必须是以其所继承的内部类的外部类为参数,外部类调用.super(),来初始化。因为内部类构造器必须连接到指向其外围类对象的引用,导出类中不存在默认的连接对象,必须显式定义出出来。

 

10.10 内部类可以被覆盖吗

覆盖之后没有任何的效果,当继承某个外围类的时候,内部类没有变化。两个内部类是完全独立的两个实体,各自在自己的命名空间中。(例子中,继承中导出类构造时,要先构造基类的方法(成员初始化,构造函数调用))。

 

10.11 局部内部类

在某个方法体里边创建内部类:效果基本等同于匿名类,但是匿名类只能用于实例初始化return newAnonymousClassName(){ //… };

局部内部类,有名字,可以定义不只一个对象。

 

10.12 内部类标识符

OuterClassName$1InnerName.class, 匿名的OuterClassName$1(数值).class

 

接口和内部类结合,解决C++中的多重继承问题。
0 0
原创粉丝点击