2018.9.18学习笔记(多态,抽象abstract,接口)
1 多态(记住动物和猫的关系)
其中Animal a = new Cat();表示父类引用指向子类对象,这就叫多态。
由于多态左边为父类右边为子类,那么就牵扯到了几个问题。
2 多态带来的问题
当父类和子类中都写了相同的变量名和方法名的时候,创建对象 父类 对象 = new 子类()。这个对象使用变量和方法使用的父类的还是子类的呢?
编译看左边,运行看右边
关于多态,其实用Animal c = new Cat()的用法并不多,因为这样用Cat类的属性和静态的方法会很不方便,需要使用变量提升才能将Animal对象向下转型。而在形式参数时就会经常用到,我么可以在形式参数中直接写Animal an 而不需要写Cat c或者Dog d或者Pig p了。
3 instanceof
如果a是一只猫。
4 抽象abstract
抽象一般用在父类上,并且这个父类是模糊的,比方说动物,没有人能描述什么叫做动物,所以上面Animal就是抽象的,那么我们可以写一个Cat子类,并且在子类中必须要实现父类的抽象方法,这样可以通过Animal c = new Cat()创建对象,并且调用eat方法。
例如:在子类Test中必须实现父类的method()方法,父类越模糊,月应该用abstract修饰。
5 接口
java中为什么会有接口呢?上面介绍的抽象类,我们会发现,如果一个抽象类中都是抽象方法,这些方法都需要子类实现,那么就可以把这个类定义为一个接口。
接口的定义和实现如上图所示,
因为接口也是一个类,所以他会有成员变量,成员方法,但是他的成员变量是常量(不能改变)是静态的(可以通过接口名直接访问)
还有一点需要注意一下,接口和父类的区别在哪呢?通俗说来,接口是干爹,但是父类是亲爹,比如在子类中(实现接口的那个类)写super();语句,super代表的是OBject,而不是那个接口,也证明了接口是没有构造方法的。
6 抽象类与接口的区别