- 面向对象设计语言有三大特性:封装、继承和多态性。没有继承的语言只能被称作“使用对象的语言”。
- 继承是非常简单而强大的设计思想,它提供了我们代码重用和程序组织的有力工具。
- 类是用来制造对象的规则。类定义了对象的属性和行为。
- 继承是基于已有的设计创造新的设计。在继承中,新的类不是凭空产生的,而是基于一个已经存在的类而定义出来的。远比写一个新的类快捷方便。
4.1 继承
- 我们把用来做基础派生其他类的那个类叫做父类、超类或者基类,而派生出来的新类叫做子类。
- Java用关键子
extends
表示这种继承/派生关系:
class Thisclass extends SuperClass{
}
- Java的继承只允许单继承,即一个类只能有一个父类。
4.2 子类父类关系
- 子类从父类中得到了所有的成员,除了构造方法。构造方法是父类独有的。
多态变量和向上类型
- 类定义了类型
- 子类定义了子类型
- 子类的对象可以被当作父类的对象来使用
- 赋值给父类对象的变量
- 传递给需要父类对象的函数
- 放进存放父类对象的容器里
- 多态变量
- Java的对象变量是堕胎的,它们能保存不止一种类型的对象。
- 它们可以保存的是声明类型的对象,或声明类型子类的对象。
- 当把子类的对象赋给父类的变量时,就发生了向上造型。
- 造型
- 把一个类型的对象赋给另外一个类型的变量。
- 不存在对象对对象的赋值!而是两个对象管理者管理共同的对象。(c++可以)
- 父类的对象不能赋值给子类的变量!
- CD cd = (CD)item; 把item当成CD类型来看待,其内容不变。
4.4 多态
- 当通过对象变量调用函数的时候,调用哪个函数这件事情叫做绑定
- 静态绑定:根据变量的声明类型来决定
- 动态绑定:根据变量的动态类型来决定
- 默认所有绑定都是动态绑定
- 成员函数中调用其他成员函数也是通过this这个对象变量来调用的
- 覆盖override
- 子类和父类中存在名称和参数表完全相同的函数,这一对函数构成覆盖关系
- 通过父类的变量调用存在覆盖关系的函数时,会调用变量当时所管理的对象所属的类的函数。(Item和CD中都有print。Item cd = new CD()。调用cd.print()时,会调用CD类中的print)
类型系统
- Object类:所有类都是继承自Object的。
- Object类的函数
- toString() 将格式转为String
- equals() 比较是不是一个对象
// 父类:Item.java
import java.util.ArrayList;
public class Item {
private String title;
private int playingTime;
private boolean gotIt=false;
private String comment;
public Item(String title, int playTime, String comment) {
super();
this.title = title;
this.playingTime = playTime;
this.comment = comment;
}
public void print(){
System.out.println(title);
}
}
// 子类:CD、MP3
public class MP3 extends Item {
private String artist;
public MP3(String title, int playTime, String comment,String artist ) {
super(title, playTime, comment);
this.artist = artist;
}
public void print() {
System.out.print("MP3:");
super.print();
}
}
public class CD extends Item{
private String artist;
private int numofTracks;
public CD(String title,String artist,int playTime,String comment, int numofTracks){
super(title, playTime, comment);
this.artist=artist;
this.numofTracks=numofTracks;
}
public void print(){
System.out.print("CD:");
super.print();
}
}
public class Database {
private ArrayList<Item> listItem = new ArrayList<Item>();
public void add(Item item) {
listItem.add(item);
}
public void list() {
for(Item item: listItem) {
item.print();
}
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Database db = new Database();
db.add(new CD("love yourself","BTS",1024,"good",6));
MP3 mp3 = new MP3("say goodbye",260,"sad","you");
db.add(mp3);
db.list();
}
}
输出:
CD:love yourself
MP3:say goodbye