名词解释
- 组合:在新的类中产生现有类的对象。由于新的类由现有类的对象组成,所以称之为组合。
- 继承:按照现有类的类型来创建新类。无需改变现有类的形式,采用现有类的形式并在其中添加新代码。最重要的方面是用来表现新类和基类之间的关系,”新类是现有类的一种类型“。
- 组合和继承的区别(使用范围):
(1)组合:现有类中可以实现新类中的某一个功能,
(2)继承:在使用一个通用类,并为了某种特殊需要而将其特殊化。
(3)“is-a”(是一个)的关系用继承来表达,如车子是一种交通工具。”has-a“(有一个)的关系则用组合来表达。如车子(类)中有一个轮子(类),就用组合。 - 超集:如果一个集合S2中的每一个元素都在集合S1中,且集合S1中可能包含S2中没有的元素,则集合S1就是S2的一个超集,反过来S2是S1的子集。
- toString():每一个非基本类型的对象都有一个toString()的方法,而且当编译器需要一个String而你却只是一个对象时,该方法便会被调用。
- 编译器并不是简单地为每一个引用都创建默认对象(意思:引用的默认值为null,而不是对象),初始化引用的方法:
(1)在定义对象的地方。(在构造器被调用之前被初始化)
(2)在类的构造器中
(3)就在正要使用这些对象之前,这种方式称为惰性初始化。
(4)使用实例初始化(实例代码块)
继承(要慎用继承)
使用继承的环境:是否需要从新类向基类进行向上转型,如果必须向上转型,则继承是必要的
- 创建一个类是,总是在继承。因此,除非已明确指出要从其他类中继承,否则就是在隐式地从Java的标准根类Object进行继承。
- super:表示超类的意思(父类)。子类中super.f():指的是调用父类中的f()方法。
- 继承中的初始化顺序:
(1)先初始化父类的静态域
(2)在初始化子类的静态域
(3)初始化父类的域
(4)加载父类的构造函数
(5)初始化子类的域
(6)子类的构造函数 - 如果想调用一个带参数的父类构造器,就必须用关键在super显示的编写调用父类构造器的语句。并且配以适当的参数列表。
- 子类对父类中的方法有重载和重写。
- “覆盖”只有在某方法是基类的接口的一部分时才会出现。即,必须能将一个对象向上转型为它的基本类型并调用相同的方法。如果某方法为private,它就不是基类的接口的一部分。
向上转型
- 传统的继承图的绘制方法:将根置于页面的顶端,然后逐渐向下。有导出类转型成基类,在继承图上是向上移动的,所以称之为向上转型。
- 对某个对象的引用视为对其基类型的引用的做法称为向上转型。
- 由于继承可以确保基类中所有的方法在导出类中也同样有效,所以能够向基类发送的所有信息同样也可以向导出类发送。这意味着我们可以准确的说dog也是一种类型的Animal。(传入的那个对象,调用的是那个对象中的方法)
- 在向上转型的过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取它们。
代理
- 代理:是继承与组合之间的中庸之道。因为我们将一个成员置于所要构建的类中(就像组合),但与此同时我们在心累中暴露了该成员对象的所有方法(就像继承)。
- 代理中不能使用继承的原因:会将父类中的所有方法都暴露出来。而使用代理时可以拥有更多的控制力,因为我们可以选择只提供在成员对象中的方法的某个子集。
注意
-
一个程序中含有多个类,每个类中都可以由main()方法。但每次只有一个main方法会执行。即使一个类具有包访问权限,其public mian()仍然是可访问的。
-
一般规则是将所有的数据成员都指定为private,将所有的方法都指定为public。
-
在清理方法中,还必须注意对基类清理方法和成员对象清理方法的调用顺序,以防止某个子对象依赖于另一个子对象情形的发生。
(1)执行类的所有特定的清理动作,其顺序同生成顺序相反。
(2)调用基类的清理方法。 -
System.out.println(Object obj)的实现方法: