在学习Java的继承之前,可以先复习一下C++的继承: http://www.jianshu.com/p/bc9b7ddb141c
继承就是子类(派生类)继承父类(基类)的特征和行为,使得子类对象(实例)具有与父类相同的行为。
牛和羊属于食草动物类,老虎和狼属于食肉动物类。 食草动物和食肉动物又是属于动物类。 所以继承需要符合的关系是:is-a,即子类 is a 父类。 虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别。所以子类除了具有父类的一般特性外,也会具有自身的特性。
C++中的继承格式为 class 子类:访问权限修饰符 父类 比如class Dog : public Animal
Java中的继承格式为class 子类 extends 父类 比如class Dog extends Animal
extends表示扩展的意思,这个词表明了子类的父类的扩展
接下来我们通过实例来说明这个需求。 开发动物类,其中动物分别为猫和老鼠,要求如下: 老鼠:属性(姓名,id),方法(吃,睡,自我介绍,挖洞) 猫:属性(姓名,id),方法(吃,睡,自我介绍,抓老鼠)
编写Mouse类:
public class Mouse {
private String name;
public Mouse(String name){
this.name = name;
}
public void introduce() {
System.out.println("Hello, everybody! My name is " + name + ".");
}
public void eat() {
System.out.println("I am eating");
}
public void sleep() {
System.out.println("I am is sleeping");
}
public void dig() {
System.out.println("I am digging hole");
}
}
编写Cat类:
public class Cat {
private String name;
public Cat(String name){
this.name = name;
}
public void introduce() {
System.out.println("Hello, everybody! My name is " + name + ".");
}
public void eat() {
System.out.println("I am eating");
}
public void sleep() {
System.out.println("I am is sleeping");
}
public void catchMouse() {
System.out.println("I am catching mouse");
}
}
从这两段代码可以看出来,代码存在重复了,导致后果就是代码量大且臃肿,而且维护性不高(维护性主要是后期需要修改的时候,就需要修改很多的代码,容易出错,比如要修改introduce方法中的内容,就得修改每个类中的introduce方法),所以要从根本上解决这两段代码的问题,就需要继承,将两段代码中相同的部分提取出来组成一个父类Animal
新建四个文件:Animal.java, Mouse.java, Cat.java, AnimalTest.java
Animal.java中的内容为:
public class Animal{
private String name;
public Animal(String name) {
this.name = name;
}
public void introduce() {
System.out.println("Hello, everybody! My name is " + name + ".");
}
public void eat() {
System.out.println("I am eating");
}
public void sleep() {
System.out.println("I am sleeping");
}
}
Mouse.java中的内容:
public class Mouse extends Animal {
public Mouse(String name) {
super(name);
}
public void dig() {
System.out.println("I am digging hole");
}
}
Cat.java中的内容:
public class Cat extends Animal {
public Cat(String name) {
super(name);
}
public void catchMouse() {
System.out.println("I am catching mouse");
}
}
AnimalTest.java中的内容:
public class AnimalTest {
public static void main(String[] args) {
Mouse mouse = new Mouse("Jerry");
mouse.introduce();
mouse.eat();
mouse.sleep();
mouse.dig();
System.out.println();
Cat cat = new Cat("Tom");
cat.introduce();
cat.eat();
cat.sleep();
cat.catchMouse();
}
}
运行结果:
分析: Java中父类的构造方法不能被子类继承,但可以被子类调用。 Mouse类和Cat类中的构造函数里的super(name)语句,就是调用父类的构造方法。