继承的概念
继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,同时还可以在子类中重新定义以及追加属性和方法。
格式: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();
}
}
运行结果
动物吃东西
动物吃东西
代码解读
- 首先我们定义了一个父类Animal类,使所有动物都有个相同的属性就是吃东西,因此我们再定义一个
eat()
方法。 - 然后我们再定义两个子类Dog类与Cat类,猫猫与狗狗也是动物的一种,因此我们在Dog类与Cat类后使用
extends
关键字继承了Animal类。 - 最后在测试的时候,我们直接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);
}
}
运行结果
动物吃东西
2
动物吃东西
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();
}
}
运行结果
狗狗吃骨头
猫猫吃鱼
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