Java继承机制

继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。

Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

Java继承是面向对象的最显著的一个特征。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。

类和类之间的继承关系可以用UML符号表示,其中父类又叫超类或基类,子类又叫派生类。父类是子类的一般化,子类是父类的特化(具体化)。

JAVA不支持多继承,单继承使JAVA的继承关系很简单,一个类只能有一个父类,易于管理程序,同时一个类可以实现多个接口,从而克服单继承的缺点。

继承分类

Java继承分为单继承和多重继承。单继承是指一个子类最多只能有一个父类。多继承是一个子类可以有二个以上的父类。由于多继承会带来二义性,在实际应用中应尽量使用单继承。Java语言中的类只支持单继承,而接口支持多继承。Java中多继承的功能是通过接口(interface)来间接实现的。

java 类的继承上机编程 java类的继承机制_超类

继承的作用

继承机制主要具有双重作用:一是作为类的构造机制,二是作为类型的构造机制。

作为类的构造机制,继承通过扩充、组合现有的类来构造新的类。扩充是指形成现有类的特例——派生类,组合是指抽取出若干现有类的共性形成新的抽象层次——基类。

作为类型的构造机制,如果子类继承父类,则所有要求对象为父类类型的地方也可以接受子类类型的对象。也就是说父类对象出现的地方可以用子类对象替代。

作为类的构造机制,继承是面向对象程序设计语言中支持软件重用的一种重要方式,而作为类型构造机制,继承是实现动态多态性的基础。

继承的语法

Java中用保留字extends表示继承关系。继承的语法格式为:

public class 子类 extends 父类{
    //子类新增的数据成员和方法
    //子类重写父类的成员和方法
}

重定义

当子类要用到超类中的一个方法,而超类的这个方法有不适合子类时,我们可以选择在子类中重定义这个方法。子类重定义超类的方法是指的方法是指在子类中定义一个与超类的某个方法有完全相同接口的方法,这是称子类的这个方法重定义了超类同接口的方法。所为方法接口完全相同是指返回类型、方法名和方法参数列表完全相同。向以上例子中,Manager类的getSalary()方法就是重定义了超类Employee的getSalary()方法。

在重定义超类(祖先类)的方法时,不允许降低方法的访问控制权限。如在超类中是public的方法,在子类重定义时不能定义成protected或private。不过java允许在子类中重定义成员数据是降低其访问控制权限。如在超类中是public的数据成员,在子类可重定义为protected或private的数据成员。

对于成员数据来说,只要子类定义了与祖先类同名的成员数据就是重定义了祖先类的成员数据,而且屏蔽了祖先类的成员数据,子类及子类的使用者再也不能访问该祖先类的成员数据。

this与super

java中的this与super都是每一个对象实例中的特殊私有成员,是一个引用变量,this的类型是该对象实例所属的类类型,super的类型是它所属的对象实例的超类类型。

它们有两种使用方式:

第一种:调用类的数据或方法成员。this是调用自身的成员,而super则是调用其超类(祖先类)中的数据成员。

public class Employee {
        private String name;
        ......
        public Employee(String name,double s,int year,int month,int day){
            this.name=name;
            .........
        }
        .......
    }

在构造函数中用到了this.name=name;,this指明了name是它所在的类(Employee)中定义的name,而不是参数列表中的那个name。这种使用方法的格式总结为:this.本类成员 和 super.超类成员。其中超类成员不能是私有成员。

第二种:调用构造函数。this是在自身的构造函数中调用自身的另一个构造函数,而super则是在自身的构造函数中调用其超类的构造函数。例如Manager类的构造函数:

public Manager(String name,double s,int year,int month,int day){
        super(name, s, year, month, day);//必须放在第一句
        this.bonus=0;
    }

其中有super(name, s, year, month, day);,这是Manager的构造函数调用了其超类Employee的构造函数,初始化了继承成员name、salary、hireDay。这种使用方法的格式总结为:this(参数列表);和 super(参数列表);。注意,他们都必须放在构造方法的第一句。

总结

子类拥有父类非private的属性,方法。

子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。

子类可以用自己的方式实现父类的方法(重定义)。

Java的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就是C类是B类的父类,B类是A类的父类,这是java继承区别于C++继承的一个特性。但接口允许多继承。

提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系)。