Java三大特性:封装,继承,多态。
记住这个三个关键词。每次我都要强调。这篇文章讲继承。封装、多态可以查看其余两篇文章。
什么是继承?通俗一点讲,子类拥有父类的部分特性,这个特性包含数据结构和方法。 上一组代码
public class Animal {
public String name;
public String sex;
public Integer age;
public Animal() {}
public void eat() {
System.out.println("动物吃东西");
}
public void display() {
System.out.print("name:" + name);
System.out.print(" sex:" + sex);
System.out.print(" age:" + age);
}
}
这是一个Animal类,Dog类继承Animal。
public class Dog extends Animal {
}
我们写一组测试代码
public static void main(String[] args) {
Animal animal = new Animal();
animal.name = "动物";
animal.sex = "雄";
animal.age = 1;
animal.display();
Dog dog = new Dog();
dog.name = "狗";
dog.sex = "雄";
dog.age = 2;
dog.display();
}
运行结果如图
是不是觉得很神奇呢?毕竟我们Dog里面什么都没有写,只是继承了Animal的。这就是继承,子类拥有父类的部分特性。
现在问题来了,为什么子类拥有的父类的部分而不是全部特性?
各种书籍里面常用父亲和儿子举例,儿子可以像父亲,但是儿子不是父亲的。这个比喻很形象,但是我对这个答案不是很满意的。因为就像我上面写的测试代码一样,Dog看起来像完全拥有Animal的特性一样。这个问题我看到了部分源码过后终于明白了答案。
在Java里面所有的都如果没有显示继承(例如Animal),会默认继承Object。可以这样说Object是所有类的父类。我们来看看Object的源码,找到如图所示的方法
看见没有,这是一个private的方法(关于权限控制,请自行搜索),而且直接静态加载,根本就不给你机会调用。子类拥有父类的部分特性,这个观点,我们从源码上分析,是不是觉得简单明了呢?
下面我讲介绍继承里面另外一个概念,方法重写(Override)又称方法覆盖。什么意思呢?
子类对父类的方法不满意,想要自己追加一些实现,例如Animal类里面的eat()方法。
@Override
public void eat() {
System.out.println("狗吃屎");
}
关键字Override表明这是重写的父类方法,免得混淆子类和父类的相同名字的方法。
animal.eat();
dog.eat();
运行结果如果
如果我们想执行父类的方法,然后追加自己的结果呢?
用关键词:super
@Override
public void eat() {
super.eat();
System.out.println("狗吃屎");
}
运行结果
Animal的eat()方法被调用了两次。
如果父类不想让子类继承怎么办?用private修饰
private void display() {
System.out.print("name:" + name);
System.out.print(" sex:" + sex);
System.out.println(" age:" + age);
}
怎么判断某个对象是否是某个类的具体实例(或者拥有继承关系)
用关键词:instanceof
if (animal instanceof Animal) {
System.out.println("yes");
} else {
System.out.println("no");
}
if (dog instanceof Animal) {
System.out.println("yes");
} else {
System.out.println("no");
}
if (animal instanceof Dog) {
System.out.println("yes");
} else {
System.out.println("no");
}
运行结果如下
关于继承暂时就想到这么多。