Loading

什么是继承?

继承的概念

继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,同时还可以在子类中重新定义以及追加属性和方法。
格式:class 子类 extends 父类 { }

猫猫狗狗 举个例子:猫猫狗狗 猫猫与狗狗都有相同的属性特征,他们都是动物,所以可以把相同的属性特征抽出来做成一个动物类。 代码如下:
// 动物类(父类)
class Animal {
    public void eat() {
        System.out.println("动物吃东西");
    }
}

// 狗狗类(子类)
class Dog extends Animal {
}

// 猫猫类(子类)
class Cat extends Animal {
}

// Demo类
public class InheritanceDemo {
    public static void main(String[] args) {
        Dog erha = new Dog();
        erha.eat();

        Cat tom = new Cat();
        tom.eat();
    }
}

运行结果

// erha.eat();
动物吃东西
// tom.eat();
动物吃东西

代码解读

  1. 首先我们定义了一个父类Animal类,所有动物都有个相同的属性就是吃东西,因此我们再定义一个eat()方法。
  2. 然后我们再定义两个子类Dog类与Cat类,猫猫与狗狗也是动物的一种,因此我们在Dog类与Cat类后使用extends关键字继承了Animal类。
  3. 最后在测试的时候,我们直接new的是子类,子类对象被new出来后,因为继承了父类Animal类,因此这个子类对象可以直接访问父类Animal类的eat()方法,这就是继承。

继续探究

既然可以访问到父类的方法,那父类的变量是不是也可以访问到呢?
答案是肯定的,上代码

// 动物类(父类)
class Animal {
    public int age = 2;
    public void eat() {
        System.out.println("动物吃东西");
    }
}

// 狗狗类(子类)
class Dog extends Animal {
}

// 猫猫类(子类)
class Cat extends Animal {
}

// Demo类
public class InheritanceDemo2 {
    public static void main(String[] args) {
        Dog erha = new Dog();
        erha.eat();
        System.out.println(erha.age);

        Cat tom = new Cat();
        tom.eat();
        System.out.println(tom.age);
    }
}

运行结果

// erha.eat();
动物吃东西
2
// tom.eat();
动物吃东西
2

新问题

在上面例子中,子类调用eat()方法,输出的都是是“动物吃东西”,但是,猫猫与狗狗爱吃的东西是不一样的,能不能把猫猫狗狗吃的东西详细表现出来呢?直接修改父类里面的方法显然是不行的,在子类里面新添加一个新的方法显然也违背了继承的本意。那么这时候就是方法重写登场的时候了,具体可以参考再来个小记,Java方法重写(Method Overriding)
这边直接上代码:

// 动物类(父类)
class Animal {
    public void eat() {
        System.out.println("动物吃东西");
    }
}

// 狗狗类(子类)
class Dog extends Animal {
    public void eat() {
        System.out.println("狗狗吃骨头");
    }
}

// 猫猫类(子类)
class Cat extends Animal {
    public void eat() {
        System.out.println("猫猫吃鱼");
    }
}

// Demo类
public class InheritanceDemo3 {
    public static void main(String[] args) {
        Dog erha = new Dog();
        erha.eat();

        Cat tom = new Cat();
        tom.eat();
    }
}

运行结果

// erha.eat();
狗狗吃骨头
// tom.eat();
猫猫吃鱼

super关键字

如果在子类中,我就是要我一定要调用父类的方法,或者一定要访问父类中的成员变量,那就该用到这个super关键字。

// 动物类(父类)
class Animal {
    public int age = 2;
    public void eat() {
        System.out.println("动物吃东西");
    }
}

// 狗狗类(子类)
class Dog extends Animal {
    public int age = 3;
    public void eat() {
        System.out.println("狗狗吃骨头");
        super.eat(); // 获取父类的eat()方法
    }

    public void getAge(){
        System.out.println(super.age); // 获取父类的age
    }
}

// 猫猫类(子类)
class Cat extends Animal {
    public int age = 4;
    public void eat() {
        System.out.println("猫猫吃鱼");
        super.eat(); // 获取父类的eat()方法
    }

    public void getAge(){
        System.out.println(super.age); // 获取父类的age
    }
}

// Demo类
public class InheritanceDemo4 {
    public static void main(String[] args) {
        Dog erha = new Dog();
        erha.eat();
        erha.getAge();

        Cat tom = new Cat();
        tom.eat();
        tom.getAge();
    }
}

运行结果

狗狗吃骨头
动物吃东西
2
猫猫吃鱼
动物吃东西
2
posted @ 2021-12-30 18:30  菜月昴  阅读(375)  评论(0编辑  收藏  举报