Animal是父类,hippo是子类
Animal ahippo = new hippo();
abstract
- abstract 类可以扩展(增加子类),但不能直接实例化。抽象类最大的悲哀是没有实体
- abstract 方法不在声明它的类中实现,但必须在某个子类中重写。
abstract 应注意的事
- 抽象类不能直接使用,必须用子类去实现抽象类,然后使用其子类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例,也就是可以使用抽象类来充当形参,实际实现类作为实参,也就是多态的应用。
- 构造函数和静态函数以及final修饰的函数不能使用abstract修饰符。
- 如果试图创建一个抽象类的实例就会产生编译错误。
- 如果一个类是非抽象类却包含一个抽象方法,就会产生编译错误。
- 抽象类中有构造函数。如果抽象类是父类,需要给子类提供实例的初始化。
abstract 关键字和哪些关键字不能共存?
- final:被final修饰的类不能有子类。而被abstract修饰的类一定是一个父类。
- private: 抽象类中的私有的抽象方法,不被子类所知,就无法被复写。而抽象方法出现的就是需要被复写。
- static:如果static可以修饰抽象方法,那么连对象都省了,直接类名调用就可以了。可是抽象方法运行没意义。
终极对象object有什么
- equals()
- getClass()
- hashCode()
- toString()
接口(纯抽象)
多继承
泛型(只在编译有效)
泛型类
[图片上传失败...(image-916ce8-1565101604071)]
泛型接口
//定义一个泛型接口
public interface Generator<T> {
public T next();
}
当实现泛型接口的类,未传入泛型实参时
- 未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需将泛型的声明也一起加到类中
- 即:class FruitGenerator<T> implements Generator<T>{}
- 如果不声明泛型,如:class FruitGenerator implements Generator<T>,编译器会报错:"Unknown class"
当实现泛型接口的类,传入泛型实参时:
- 定义一个生产器实现这个接口,虽然我们只创建了一个泛型接口Generator<T>
- 但是我们可以为T传入无数个实参,形成无数种类型的Generator接口。
- 在实现类实现泛型接口时,如已将泛型类型传入实参类型,则所有使用泛型的地方都要替换成传入的实参类型
- 即:Generator<T>,public T next();中的的T都要替换成传入的String类型。
public class FruitGenerator implements Generator<String>