欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第4周 继承与多态【面向对象程序设计——Java语言笔记总结】

程序员文章站 2024-03-17 16:17:52
...
  • 面向对象设计语言有三大特性:封装、继承和多态性。没有继承的语言只能被称作“使用对象的语言”。
  • 继承是非常简单而强大的设计思想,它提供了我们代码重用和程序组织的有力工具。
  • 类是用来制造对象的规则。类定义了对象的属性和行为。
  • 继承是基于已有的设计创造新的设计。在继承中,新的类不是凭空产生的,而是基于一个已经存在的类而定义出来的。远比写一个新的类快捷方便。

4.1 继承

  • 我们把用来做基础派生其他类的那个类叫做父类、超类或者基类,而派生出来的新类叫做子类。
  • Java用关键子extends表示这种继承/派生关系:
class Thisclass extends SuperClass{
}
  • Java的继承只允许单继承,即一个类只能有一个父类。

4.2 子类父类关系

  • 子类从父类中得到了所有的成员,除了构造方法。构造方法是父类独有的。
    第4周 继承与多态【面向对象程序设计——Java语言笔记总结】

多态变量和向上类型

  • 类定义了类型
  • 子类定义了子类型
  • 子类的对象可以被当作父类的对象来使用
    • 赋值给父类对象的变量
    • 传递给需要父类对象的函数
    • 放进存放父类对象的容器里
      第4周 继承与多态【面向对象程序设计——Java语言笔记总结】
      第4周 继承与多态【面向对象程序设计——Java语言笔记总结】
      第4周 继承与多态【面向对象程序设计——Java语言笔记总结】
  • 多态变量
    • 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的。
    第4周 继承与多态【面向对象程序设计——Java语言笔记总结】
  • 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