第五章接口 抽象类 多态 接
第五章 接口 ▪ 抽象类 ▪ 多态 ▪ 接口
抽象类 Animal 回顾Anma的类结构: make Noise eato 1通过继承最大限度地减少了重复代 sleep 码 roam 2通过覆盖,以及多态的特征保证每 个子类的独特性 3在一使用Anma的程序里, Feline Canine (包括 Animal作为形参或数 roam roam 组声明里), 任何 Anima的子类型(现有或以 一后添加的)都可以作为实参被传 Lion Cat Wolf Dog 递,并在运行时得到类型识别。 nake Noise0 make Noise0 make Noised make NoiseO eato eato eato eato
Animal makeNoise() eat() sleep() roam() Canine roam() Wolf makeNoise() eat() Dog makeNoise() eat() Feline roam() Lion makeNoise() eat() Cat makeNoise() eat() 回顾Animal的类结构: 1 通过继承最大限度地减少了重复代 码 2 通过覆盖,以及多态的特征保证每 个子类的独特性。 3 在一使用Animal的程序里, (包括Animal作为形参或数 组声明里), 任何Animal的子类型(现有或以 后添加的)都可以作为实参被传 递,并在运行时得到类型识别。 抽象类
过去在程序里说: Dog my Dog =new Dogo; Dog对象 现在在程序里说 bog引用 Animal my Dog new DogO 两者的类型是相同的 Dog对象 Anima引用 两者的类型是不同的
过去在程序里说: Dog myDog =new Dog() ; Animal myDog= new Dog() ; 1 Dog 对象 Dog引用 两者的类型是相同的 1 Dog 对象 Animal引用 两者的类型是不同的 现在在程序里说:
下面这句有些不自然: Animal anim=new Animal Anima|对象 Animal引用 两者的类型相同,但是一个 实际的Anma对象可以是什 么呢?
下面这句有些不自然: Animal anim=new Animal() ; 1 ? Animal 对象 Animal引用 两者的类型相同,但是一个 实际的Animal对象可以是什 么呢? ?
需要一个Anma类,用于继承和多态 不需要实例化Anma类,不需要一个 Anima对象 需要一个防止类被实例化的方法 把该类标记为“ abstract
需要一个Animal类,用于继承和多态 不需要实例化Animal类,不需要一个Animal对象 需要一个防止类被实例化的方法: 把该类标记为“abstract
abstact class Animal t public void sleep abstact class Canine extends Animal public void roam (1
abstact class Animal { public void sleep() { } } abstact class Canine extends Animal { public void roam() { } }
编译器确保抽象类不会被实例化: abstact class Canine extends Animal public void roam] public class Make Canine i public void goo t Canine c 尽管是抽象类,仍然允许声明该类型的引用 c=new Dogo c= new Canine;eror,不允许实例化一个抽象的类 c roam
编译器确保抽象类不会被实例化: abstact class Canine extends Animal { public void roam() { } } public class MakeCanine { public void go() { Canine c; c=new Dog() ; c=new Canine() ; c.roam(); } } 尽管是抽象类,仍然允许声明该类型的引用。 error,不允许实例化一个抽象的类
Anima族中抽 abstract 象和具体的类 Anima abstract abstract Feline Canine 抽象的类位于继承 树的上部:通过被 扩展而得到应用的 Lion Cat Wolf Dog 价值。 concrete concrete concrete concrete
Animal Feline Canine Lion Cat Wolf Dog abstract abstract abstract concrete concrete concrete concrete Animal族中抽 象和具体的类 抽象的类位于继承 树的上部:通过被 扩展而得到应用的 价值
抽象的方法 抽象的方法意味着该方法必须被子类覆盖;它是没有体的 publiclabstract) void eat(; 没有方法体!以 分号结束。 抽象的方法必须位于抽象类里;但是,抽象类可以拥 有非抽象的方法
抽象的方法 抽象的方法意味着该方法必须被子类覆盖;它是没有体的 public abstract void eat() ; 没有方法体!以 分号结束。 抽象的方法必须位于抽象类里;但是,抽象类可以拥 有非抽象的方法
口 Anima 你必须实现所有的抽象方法 least 在继承树上的第一个具体的 Bromo 类必须实现所有的抽象方法。 Make Noise 即为抽象方法提供一个体。 abstract □ Canine concrete roam Dog eat nakeNoiseO
你必须实现所有的抽象方法: 在继承树上的第一个具体的 类必须实现所有的抽象方法。 即为抽象方法提供一个体。 Animal eat() roam() roam() makeNoise() Canine Dog eat() makeNoise() abstract concrete