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

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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值