Java中的继承
经过这么一段时间的学习,我们都知道面向对象的三大特征是封装、继承和多态。今天我们就来讲讲其中的继承。
一、什么是继承
在Java中,继承是一种类与类之间的关系。继承时,子类可以继承父类的属性和方法,使得子类的对象能够具有父类的一些特征和行为。继承又可以看作是一种 is - a 的关系。如动物中,狗是一种动物,猫也是一种动物,因此动物所拥有的一些特性,猫和狗中都可以存在。
二、为什么要继承
我们来看一下下面这段代码
public class Animal {
private String name;
private int id;
public void eat() {
}
}
class Dog {
private String name;
private int id;
public void eat() {
}
}
class Cat {
private String name;
private int id;
public void eat() {
}
}
我们可以很明显的看出,上面的代码很重复,非常的冗余,因此,我们就要用到继承来减少这种代码的冗余。
class Animal {
private String name;
private int id;
public Animal() {
}
public Animal(String name, int id) {
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void eat() {
System.out.println("Animal eat food");
}
}
class Dog extends Animal {
}
class Cat extends Animal {
}
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
dog.setName("wangcai");
System.out.println(dog.getName());
dog.eat();
cat.setName("xiao");
System.out.println(cat.getName());
cat.eat();
}
}
运行结果如图
这样我们就减少了很多的代码量,而且能对父类进行一定的补充、加强。因为父类中的方法大多都是抽象的,具有普适性,因此子类就必须要对其进行具体化来形成子类独有的一些特性。
那么为什么我们可以在子类中不写任何的代码呢?
在继承中,子类会继承父类的成员变量、成员方法和静态方法,也就是说,子类会调用父类的属性和方法,如果子类中没有任何的方法或属性,则会使用父类的方法或属性。子类也可以重写父类中的成员方法,如
class Animal {
private String name;
private int id;
public Animal() {
}
public Animal(String name, int id) {
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void eat() {
System.out.println("Animal eat food");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("Dog eat bone");
}
}
class Cat extends Animal {
public void eat() {
System.out.println("Cat eat fish");
}
}
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
dog.setName("wangcai");
System.out.println(dog.getName());
dog.eat();
cat.setName("xiao");
System.out.println(cat.getName());
cat.eat();
}
}
结果如下
子类重写了父类方法后,输出的就是重写了之后的方法。
也就是说,在执行方法时,到底执行的是父类的方法还是子类的方法取决于这个方法有没有在子类中被重写,如果被重写了,就执行子类的方法;否则,执行父类的方法。
要注意的是,重写只能发生在继承中,而且重写只能改变方法体,方法头一定不能变!