面向对象语言特性之继承

2017-12-11  本文已影响0人  Jason_M_Ho

继承(inheritance)指从已有的类中派生出新的类,新的类能吸收已有的类的属性和方法,并能扩展新的能力。
继承的好处是可以解决编程中的代码冗余的问题,是实现代码重用的重要手段之一。

JAVA只支持单根继承,也就是一个类只能有一个直接父类。

继承的特点

继承表达的是" xxx is a xxx "的关系,如Dog is a Animal;
继承使用关键字extends,语法格式:

访问修饰符 class SubClass extends SuperClass {
}
//例如
public class Dog extends Animal{
}
class.png

Pet是父类,Dog和Cat是子类,子类继承了父类的name属性和print方法,又各有自己的属性和方法。

在JAVA中,子类可以从父类继承以下内容:

this 和 super

super代表父类对象,this代表当前对象;
访问父类构造方法:super(参数)
访问父类属性:super.<父类属性或方法>

继承条件下的构造方法:

  1. 子类构造方法创建对象时,没有通过super显示调用父类有参构造,也没有通过this显式调用自身其他构造方法时,默认调用父类无参构造方法。
  2. 子类构造方法通过super显示调用父类有参构造方法时,执行父类相应的构造方法,而不执行父类的无参构造。
  3. 子类调用自身其他构造方法时遵循以上两条。

示例:

class Pet {  //父类Pet
    private String name;//父类私有属性
    private int age;
    public Pet() {//父类无参构造
    }
    public Pet(String name, int age) {//父类有参构造
        this.name = name;
        this.age = age;
    }
    void showInfo(){  //父类中的方法,显示宠物名字和年龄
        System.out.println("宠物名字是"+name+"年龄是"+age);
    }
}

class Dog extends Pet{ //Dog类继承Pet类
    String strain;  //扩展自己的属性

    public Dog() {
    }
    public Dog(String name, int age,String strain) {
        super(name,age);  //super调用父类有参构造
        this.strain = strain;
    }
    
    void showDog(){
        super.showInfo();//super调用父类中的方法
        System.out.println("宠物是一狗狗,品种是"+strain);
    }
}

class Cat extends Pet{
    String sex;

    public Cat() {
    }
    public Cat(String sex) {//没有显示调用父类有参构造,将默认调用父类无参构造
        this.sex = sex;
    }
    
    //重写了父类中的同名方法,而没有用super调用父类中的同名方法,父类中的方法就被覆盖了
    void showInfo(){
        System.out.println("我是一只小猫");
    }
}

class Tests{
    public static void main(String[] args) {
    //狗狗并没有继承Pet的name和age属性,而是通过父类public的构造方法间接访问
        Dog dog = new Dog("旺财",3,"哈士奇");
        Cat cat = new Cat("公");
        dog.showInfo();
        System.out.println("*********");
        dog.showDog();
        System.out.println("*********");
        cat.showInfo();
    }
}

以上代码将输出:

宠物名字是旺财年龄是3
*********
宠物名字是旺财年龄是3
宠物是一狗狗,品种是哈士奇
*********
我是一只小猫

方法的重写

在子类中根据自身需要对从父类继承来的方法进行重新编写,称为方法的重写,或是方法的覆盖(overriding)。
final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写。

方法重写必须满足以下要求:

方法重写与方法重载的区别:

  1. 方法重写是在父子类中的同名方法,而且参数列表要相同,返回值类型也要相同
  2. 方法重载是在同一个类中,同名不同参,与返回值无关

Object类

Object类的部分方法 说明
toString( ) 返回当前对象的有关信息,一个字符串对象
equals( ) 比较两个对象是不是同一个对象,比较的是指针当(对象的内存地址),返回boolean值
clone( ) 生成当前对象的一个副本,并返回
hashCode( ) 返回当前对象的哈希代码值,默认为对象的32位内存地址
getClass( ) 获取当前对象的所属类的信息,返回class对象

Object类是所有类的父类。在JAVA中,所有的JAVA类都直接或者间的继承了java.lang.Object类。在定义一个类时,如果没有显示继承某个类,那么这个类就直接继承Object类,所有对象都继承这个类的方法。

Object类的部分方法 说明
toString( ) 返回当前对象的有关信息,一个字符串对象
equals( ) 比较两个对象是不是同一个对象,比较的是指针当(对象的内存地址),返回boolean值
clone( ) 生成当前对象的一个副本,并返回
hashCode( ) 返回当前对象的哈希代码值,默认为对象的32位内存地址
getClass( ) 获取当前对象的所属类的信息,返回class对象

注意:Object类equals( )方法比较的是两个对象的引用或者说地址,String类重写了equals( )方法,比较的是两个对象的值

上一篇 下一篇

猜你喜欢

热点阅读