Day06

本文介绍了Java中的继承机制,包括定义、优点、特点、注意事项,以及super关键字的使用。同时详细讲解了方法的重写规则,帮助读者理解面向对象编程中的继承和多态概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.继承

1.1 定义

让类与类之间产生子父类关系,有了继承性之后,子类就获取到了父类中声明的所有属性和方法。

1.2 优点

  1. 继承的出现减少了代码冗余,提高了代码的复用性。
  2. 继承的出现,更有利于功能的扩展。
  3. 继承的出现让类与类之间产生is-a关系,为多态的使用提供了前提。
  4. 继承描述事物之间的所属关系,可见父类更通用、更一般,子类更具体。

1.3 继承特点

  1. Java只支持单继承(针对于类)(一个父类可以声明多个子类,但是一个子类只能有一个父类),不支持多继承
  2. Java支持多层继承,可以划分为直接父类和间接父类。

1.4 注意事项

  1. 子类只能继承父类的所有非私有成员。
  2. 子类不能继承父类的构造方法,但可以通过super关键字访问父类构造方法。

1.5 默认的父类

Java中声明的类如果没有显式声明其父类时,则默认继承于java.lang.Object类

2. super关键字

2.1 为什么需要super

  • super:代表对当前父类的引用
    在子类中需要调用父类中被重写的方法以及在子类中区分子类和父类同名的属性。

2.2 super可以调用的结构

2.2.1 属性和方法

子类继承父类以后,就可以在子类的方法或构造器中,调用父类中声明的属性或方法(满足封装性的前提下)。调用时,需要使用"super."的结构,表示调用父类的属性或方法。子类中重写了父类的方法或子父类中出现了同名的属性时,则必须使用"super."的声明,显式地调用父类被重写的方法或父类中声明的同名的属性。

2.2.2 构造器

  1. 子类继承父类时,不会继承父类的构造器,只能通过"super(形参列表)"的方式调用父类指定的构造器。
  2. "super(形参列表)"必须声明在构造器的首行。
  3. 在构造器的首行,super和this关键字只可以出现一个。
  4. 如果在子类构造器的首行既没有显式调用"this(形参列表)“,也没有显式调用"super(形参列表)”,则子类此构造器默认调用"super()",即调用父类中空参的构造器。
  5. 结合3和4可以得到结论:子类的任何一个构造器中,要么会调用本类中重载的构造器,要么会调用父类的构造器,只能是这两种情况之一。
  6. 由5可以得到结论:一个类中声明有n个构造器,最多有n-1个构造器中使用了"this(形参列表)“,则剩下的那一个一定使用"super(形参列表)”。

区别

  1. this既可以调用本类成员变量,也可以调用父类成员变量,而super只可以调用父类的成员变量
  2. this调用本类构造方法,super调用父类构造方法
  3. this既可以调用本类成员方法,也可以调用父类成员方法,而super只可以调用父类的成员方法

练习题

public class demo34 {
    public static void main(String[] args){
        Cat c1 = new Cat("白色",4);
        System.out.println(c1.getColor() + " " + c1.getLeg());
        c1.eat();
        c1.catMouse();
        System.out.println("-----------------------");
        Dog d1 = new Dog("黑色",4);
        System.out.println(d1.getColor() + " " + d1.getLeg());
        d1.eat();
        d1.lookHome();
    }
}

/*
猫狗练习
属性:毛的颜色,腿的个数
行为:吃饭
猫特有行为:抓老鼠
狗特有行为:看家
 */

class Animals{
    private String color;
    private int leg;
    public Animals(){

    }
    public Animals(String color,int leg){
        this.color = color;
        this.leg = leg;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getColor() {
        return color;
    }

    public void setLeg(int leg) {
        this.leg = leg;
    }

    public int getLeg() {
        return leg;
    }
    public void eat(){
        System.out.println("吃饭");
    }
}

class Cat extends Animals{
    public Cat(){

    }
    public Cat(String color,int leg){
        super(color, leg);
    }
    public void eat(){
        System.out.println("猫吃鱼");
    }
    public void catMouse(){
        System.out.println("抓老鼠");
    }
}

class Dog extends Animals{
    public Dog(){

    }
    public Dog(String color,int leg){
        super(color, leg);
    }
    public void eat(){
        System.out.println("狗吃肉");
    }
    public void lookHome(){
        System.out.println("看家");
    }
}

3.方法的重写(overwrite/override)

3.1 为什么需要方法的重写

子类在继承父类以后,就获得了父类中声明的所有的方法。但是,父类中的方法可能不太适用于子类。即子类需要对父类继承过来的方法进行覆盖、覆写的操作(定义)。

3.2 方法重写应遵循的规则

  1. 父类被重写的方法与子类重写的方法的方法名和形参列表必须相同。
  2. 子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符。注意:子类不能重写父类中声明为private权限修饰符的方法。
  3. 父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型必须是void。
  4. 父类被重写的方法的返回值类型是基本数据类型,则子类重写的方法的返回值类型必须与被重写的方法的返回值类型相同。
  5. 父类被重写的方法的返回值类型是引用数据类型(),则子类重写的方法的返回值类型可以与被重写的方法的返回值类型相同或是被重写的方法的返回值类型的子类
  6. 子类重写的方法抛出的异常类型可以与父类被重写的方法抛出的异常类型相同,或是父类被重写的方法抛出的异常类型的子类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值