Head First Java 读书笔记(多态)

引入

我们假设Animal类是一切动物,如:Lion,Hippo,Canine ,Wolf等的基类。
则我们可以写出这样的指令

Wolf aWolf = new Wolf(); // aWolf为对Wolf对象的引用

也可以:

Animal aHippo = new Hippo(); 
// aHippo为对Hippo对象的引用,aHippo是一个Animal类型的引用变量,因为Animal为Hippo的基类,故这样的方式可行

但是这样会很奇怪:

Animal anim = new Animal(); // Animal对象过于抽象

现在的问题是,我们需要Animal这个对象来继承,但是要限制只有其子类才能被初始化。
所以我们需要抽象类

抽象类

abstract class Canine extends Animal {
	public void roam();
}

抽象类无法被初始化

抽象的方法

抽象的方法没有实体

public abstract void eat(); // 没有方法体,直接以分号结束

如果声明出一个抽象的方法,则它所属的类也必须被标记为抽象的。(抽象类中也可以有非抽象的方法)

抽象的方法必须实现

抽象的方法没有内容,它只是为了标记出多态而存在。但是其子类必须实现所有的抽象方法。比如,若Animal为抽象类,则Canine就必须实现出Animal的所有抽象方法。但若Animal,Canine均为抽象类(Dog为Canine子类),则Canine无需实现Animal的抽象方法,这个工作可直接转交给Dog类。当然,Canine也可以直接实现Animal的抽象方法。

接口

Java不支持多重继承(一个子类有多个基类),这时我们就需要接口

多重继承的最大的问题就是:若多个基类有同一个方法,则子类调用时不知该调用哪个版本。
但接口可解决这个问题,因为它的方法都被设为抽象的。故子类必须实现它的所有方法,这样就不会混淆了。
接口的定义:

public interface Pet{
	public abstract void beFriendly();
	public abstract void play(); // 接口的方法都是public abstract故可不声明这两个关键字
}

接口的实现

public class Dog extends Canine implements Pet{
	public void beFriendly(){...}
	public void play(){...}
	
	public void roam(){...}
	public void eat(){...}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值