面向对象的三大特性之继承

来源:互联网 发布:奥兰多安全知乎 编辑:程序博客网 时间:2024/04/28 11:09

继承

什么叫继承

继承: 继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
通过extends关键字产生继承关系. 继承的类被称为子类(派生类),被继承的类称为父类(超类、基类).子类可以访问父类不被private修饰的属性和方法.但构造方法不能被继承

继承的好处

  • 提高代码的复用性
  • 使类与类之间产生关系

继承的限制性

  • 子类与父类之间只存在单继承关系,就是一个类同时只能继承一个类.但类与类之间可以存在多重继承关系.即AextendsB,BextendsC,A类与C类之间就是多重继承关系
  • 当子类继承父类时,不会继承父类的构造方法
  • 当父类中的属性和方法被private修饰时,子类是不能访问的

方法的覆盖(重写)

方法的覆盖: 重写就是子类完全继承父类的方法,在子类中创建一个名称、返回值类型和参数列表与父类中的方法完全相同就叫做重写.被覆盖的方法在子类中只能通过super调用。

覆盖的原则

  • 覆盖方法的返回类型、方法名称、参数列表必须与原方法的相同。
  • 覆盖方法不能比原方法访问性差(即访问权限不允许缩小)。
  • 覆盖方法不能比原方法抛出更多的异常。
  • 被覆盖的方法不能是final类型,因为final修饰的方法是无法覆盖的。
  • 被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
  • 被覆盖的方法不能为static。如果父类中的方法为静态的,而子类中的方法不是静态的,但是两个方法除了这一点外其他都满足覆盖条件,那么会发生编译错误;反之亦然。即使父类和子类中的方法都是静态的,并且满足覆盖条件,但是仍然不会发生覆盖,因为静态方法是在编译的时候把静态方法和类的引用类型进行匹配。

方法的重载

方法的重载: 在Java中,同一个类中的多个方法可以有相同的名字,只要它们的参数列表不同就可以,这被称为方法重载

重载的原则

  • 参数列表不同包括:个数不同、类型不同和顺序不同。
  • 仅仅参数变量名称不同是不可以的。
  • 跟成员方法一样,构造方法也可以重载。
  • 声明为final的方法不能被重载。
  • 声明为static的方法不能被重载,但是能够被再次声明。

简单实例:

父类:

public class Person {    /**     * 年龄     */    private int age;    /**     * 性别     */    private String sex;    /**     * 电话号     */    private String phoneNumber;    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }    public String getPhoneNumber() {        return phoneNumber;    }    public void setPhoneNumber(String phoneNumber) {        this.phoneNumber = phoneNumber;    }}

我们在父类Person里定义了age、sex、phoneNumber三个属性,对三个属性进行了封装,只能通过get(),set()方法进行访问.

子类:

public class Student extends Person {    /**     * 学校     */    private String school;    /**     * 年级     */    private String grade;    private Student student;    public Student() {        super();        student = new Student();        student.setAge(10);//通过继承,可以访问到父类的setAge()方法    }    /**     * 方法的重写     * @return     */    @Override    public int getAge() {        return student.getAge();    }    /**     * 方法的重载     * @param s     * @return     */    public int getAge(int s){        return student.getAge();    }    public String getSchool() {        return school;    }    public void setSchool(String school) {        this.school = school;    }    public String getGrade() {        return grade;    }    public void setGrade(String grade) {        this.grade = grade;    }}

我们通过代码可以看到Student extends Person,那Student就是子类,而Person为父类.在Student类中可以访问Person非私有的方法和属性.也可以添加自己特有的属性和方法即school和grade.关于this、super这些关键字以后再讲.

1 0