一、类的继承
-一种由已有的类创建新类的机制,是面向对象程序设计的基石之一
–通过继承,可以根据已有类来定义新类,新类拥有已有类的所有功能
–Java只支持类的单继承,每个子类只能有一个直接父类
–父类是所有子类的公共属性及方法的集合,子类则是父类的特殊化
–继承机制可以ᨀ高程序的抽象程度,ᨀ高代码的可重用性
1.基类(base class)
也称超类(superclass)
是被直接或间接继承的类
2.派生类(derived-class)
也称子类(subclass)
继承其他类而得到的类
继承所有祖先的状态和行为
派生类可以增加变量和方法
派生类也可以覆盖(override)继承的方法
3.派生类产生的对象
从外部来看,它应该包括
a.与基类相同的接口
b.可以具有更多的方法和数据成员
其内包含着一个基类类型的子对象
4.隐藏和覆盖
子类对从父类继承来的属性变量及方法可以重新定义
(1)属性的隐藏
–子类中声明了与父类中相同的成员变量名,则从父类继承的变量将被隐藏
–子类拥有了两个相同名字的变量,一个继承自父类,另一个由自己声明
–当子类执行继承自父类的操作时,处理的是继承自父类的变量,而当子类执行它自己声明的方法时,所操作的就是它自己声明的变量
(2)如何访问被隐藏的父类属性
–调用从父类继承的方法,则操作的是从父类继承的属性
–使用super.属性
(3)方法覆盖
–如果子类不需使用从父类继承来的方法的功能,则可以声明自己的同名方法,称为方法覆盖
–覆盖方法的返回类型,方法名称,参数的个数及类型必须和被覆盖的方法一摸一样
–只需在方法名前面使用不同的类名或不同类的对象名即可区分覆盖方法和被覆盖方法
–覆盖方法的访问权限可以比被覆盖的宽松,但是不能更为严格
a.必须覆盖的方法
–派生类必须覆盖基类中的抽象的方法,
否则派生类自身也成为抽象类.
b.不能覆盖的方法
–基类中声明为final的终结方法
–基类中声明为static 的静态方法
c.调用被覆盖的方法
–super.overriddenMethodName();
5.有继承时的构造方法
–子类不能从父类继承构造方法
–好的程序设计方法是在子类的构造方法中调用某一个父类构造方法,调用语句必须出现在子类构造方法的第一行,可使用super关键字
–如子类构造方法的声明中没有明确调用父类构造方法,则系统在执行子类的构造方法时会自动调用父类的默认构造方法(即无参的构造方法)
二、Object类
–Java程序中所有类的直接或间接父类,类库中所有类的父类,处在类层次最高点
–包含了所有Java类的公共属性,其构造方法是Object( )
Object类定义了所有对象必须具有的状态和行为,较主要的方法如下
– public final Class getClass() //获取当前对象所属的类信息,返回Class对象
– public String toString() //返回当前对象本身的有关信息,按字符串对象返回
– public boolean equals(Object obj) //比较两个对象是否是同一对象,是则返回true
– protected Object clone( ) //生成当前对象的一个拷贝,并返回这个复制对象
– public int hashCode() //返回该对象的哈希代码值
– protected void finalize() throws Throwable //定义回收当前对象时所需完成的资源释放工作
(你的类不可以覆盖终结方法,即有final修饰的方法)
equals 方法
(1)相等和同一的概念
–两个对象具有相同的类型,及相同的属性值,则称二者相等(equal)
–如果两个引用变量指向的是同一个对象,则称这两个变量(对象)同一(identical)
–两个对象同一,则肯定相等
–两个对象相等,不一定同一
–比较运算符“==”判断的是这两个对象是否同一
(2)equals 方法
public boolean equals(Object x) {
return this == x;
}
–由于Object是类层次结构中的树根节点,因此所有其他类都继承了equals()方法
–Object类中的equals() 方法也是判断两个对象是否同一
(3)equlas方法的重写
–要判断两个对象各个属性域的值是否相同,则不能使用从Object类继承来的equals方法,而需要在类声明中对equals方法进行重写
–String类中已经重写了Object类的Equals方法,可以判别两个字符串是否内容相同
三、终结类与终结方法(final)
–被final修饰符修饰的类和方法
–终结类不能被继承
–终结方法不能被当前类的子类重写
(1)终结类
终结类的特点
–不能有派生类
终结类存在的理由
–安全: 黑客用来搅乱系统的一个手法是建立一个类的派生类,然后用他们的类代替原来的类
–设计: 你认为你的类是最好的或从概念上你的类不应该有任何派生类
(2)终结方法
终结方法的特点
–不能被派生类覆盖
终结方法存在的理由
–对于一些比较重要且不希望子类进行更改的方法,可以声明为终结方法。可防止子类对父类关键方法的错误重写,增加了代码的安全性和
正确性
–高运行效率。通常,当java运行环境(如java解释器)运行方法时,它将首先在当前类中查找该方法,接下来在其超类中查找,并一直沿类层次向上查找,直到找到该方法为止
四、抽象类和抽象方法(abstract)
(1)抽象类
–代表一个抽象概念的类
–没有具体实例对象的类,不能使用new方法进行实例化
–类前需加修饰符abstract
–可包含常规类能够包含的任何东西,例如构造方法,非抽象方法
–也可包含抽象方法,这种方法只有方法的声明,而没有方法的实现
(2)抽象方法
–声明的语法形式为
public abstract <returnType> <methodName>(...);
–仅有方法头,而没有方法体和操作实现
–具体实现由当前类的不同子类在它们各自的类声明中完成
–抽象类可以包含抽象方法