Java面向对象三大特征:封装、继承、多态。
1.概述
我们知道编程是对现实世界的建模和问题的解决。
Java作为一门面向对象的语言,其面向对象三大特征:封装、继承、多态。
1.1作用
- 从OOD(面向对象设计)的角度思考:继承是相对于类而言的。类是对对象的抽象(抽出像的,共同点),继承是对某一批类的抽象,从而实现对现实世界更好地建模。
- 从OOP(面向对象编程)的角度思考:提高代码的复用性。(组合也可以提高复用性)
extends的意思是“扩展”。子类是父类的扩展。
1.2特点
- 子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法法)。
- Java中类只有单继承,没有想c++那样的多继承(这也是Java被称作C++-的一个原因),只能有一个直接父类。多继承会引起混乱,使得继承链过于复杂,系统难于维护。
- Java中的多实现(继承)可通过接口实现。
- 如果定义一个类时,没有调用extends,则他的父类是:java.lang.Object(根类)
这里我们主要从发吗复用性的角度去理解和思考继承。
2.代码
下面我们根据下面的树状图编写一个Animal类文件。我们知道,一个class文件中可以有很多的class,但只能有一个public class,并且和文件名相同。
我们假设,鸟类和哺乳动物类都属于动物类。则,应知的,动物类具有的特点和行为(属性和方法),鸟类和哺乳类也具有。下面仅针对我们关注的点,写以下类:
public class Animal {
String name;
void eat() {
System.out.println("have a good dinner");
}
}
class Birds {
String name;
void eat() {
System.out.println("have a good dinner");
}
void fly() {
System.out.println("Yeah,I can fly~~");
}
}
class Mammal {
String name;
void eat() {
System.out.println("have a good dinner");
}
void run() {
System.out.println("Qie,I can run~~~");
}
}
这是我们的正常写法。下面我们发现,所以的东物还具有sleep的行为,于是需要为所有的类添加sleep方法,这显然是过于繁琐了。易见的,如上的代码具有以下确定:
①重复代码过多,不够简介;
②不易于代码维护和修改;
我们只需要通过extends关键字,继承获得父类多有的属性和方法(非构造方法)即可。如下:
public class Animal {
String name;
void eat() {
System.out.println("have a good dinner");
}
}
class Birds extends Animal {
void fly() {
System.out.println("Yeah,I can fly~~");
}
}
class Mammal extends Animal {
void run() {
this.name = "Dog";
this.eat();
System.out.println("Qie,I can run~~~");
}
}
那么如何测试是否获得父类Animal的属性和方法呢?
我们在代码Mammal类的run()方法,通过this关键字测试即可。(关于this关键字用法)
思考:假如子类继承父类得到的方法不是我想要的方法,该如何处理呢?可以通过重写进行实现。下一节将会详细说明。
基类java.lang.Object
我们观察Animal类,其并没有直接父类。事实上如果没写直接父类,那么该类继承自java.lang.Object。
因而等价于:
public class Animal extends Object { // 相当于没写
String name;
void eat() {
System.out.println("have a good dinner");
}
}
此外我们也可以通过eclipse之类的IDE工具来查看其父类,方法如下:
- 按住Ctrl,将鼠标移动到Animal类上;会出现一个候选框:Open Declaration;Open Implementation。第一个是描述,第二个是看起父类或者实现类。我们点击Open Implementation。便可以看到该类的继承关系。如下图:
或者把鼠标放在类上,直接Ctrl+T - 我们可以点击Object类,可以看到类信息。(注,如果看到的Add Source按钮,说明并未加载该类的信息,点击Add Spource->选择external文件->C:\Program Files\Java\jdk1.8.0_101\src.zip)
之前说过类的加载顺序,加载该类时,首先加载该类的直接父类,以此类推,那么最先被加载的就是根类:java.lang.Object。
至于父类子类的其他叫法:超类、父类、基类、子类、派生类。
小结
- 继承是子类继承父类,通过extends关键字实现。
- 子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法法)。
- Java中类只有单继承,没有像c++那样的多继承(C++-),只能有一个直接父类。多继承会引起混乱,使得继承链过于复杂,系统难于维护。
- Java中的多实现(继承)可通过接口实现。
- 从面向编程的角度来说,继承可以提高代码的复用性。
- 如果定义一个类时,没有调用extends,则他的父类是:java.lang.Object(根类)