继承
继承的概念
继承是面向对象的最显著的一个特征。继承是从已有的类(父类或者超类)中派生出新的类(子类),新的类能吸收已有类的数据属性和行为,并能扩展新的能力(方法的覆盖/重写)。JAVA不支持多继承,一个类只能有一个父类。父类是子类的一般化,子类是父类的特殊化(具体化)
子类的特点
- 子类拥有父类非private的属性和方法
- 子类可以添加自己的方法和属性,即对父类进行扩展
- 子类可以重新定义父类的方法,即方法的覆盖/重写
构造函数
- 构造函数不能被继承,子类可以通过super()显示调用父类的构造函数
- 创建子类时,编译器会自动调用父类的无参构造函数
- 如果父类没有定义无参构造函数,子类必须在构造函数的第一行代码使用super()显示调用
覆盖/重写的概念
当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这样的一种操作方法称为重写,也叫称为覆盖。
可以这么理解:重写就是指子类中的方法与父类中继承的方法有完全相同的返回值类型、方法名、参数个数以及参数类型。这样,就可以实现对父类方法的覆盖。如果子类将父类中的方法重写了,而我们想调用父类中的同名方法怎么办?此时,通过使用super关键就可以实现这个功能,super关键字可以从子类访问父类中的内容,如果要访问被重写过的方法,使用“super.方法名(参数列表)”的形式调用。
下边我们给出一个案例,子类扩展了父类的行为,并且重写了父类中的方法。代码如下:
package com.pak1;
public class Animal {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
@Override
public String toString() {
return "{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
package com.pak1;
class Dog extends Animal {
// 对父类中方法的一种重写
public String getName() {
return super.getName() + "Dog";
}
// 狗叫和狗吃饭都是在扩展父类中的行为
public void voice() {
System.out.println(super.getName() + " 汪");
}
public void eat() {
System.out.println(super.getName() + "吃东西");
}
package com.pak1;
class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("大狗");
dog.setAge(3);
System.out.println(dog.toString());
dog.eat();
dog.voice();
System.out.println(dog.getName()); //执行的是Dog中的getName方法
}