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

继承

什么叫继承

继承: 继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
通过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这些关键字以后再讲.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值