同一个事物(对象)在不同时刻的表现形式称为多态,比如水在不同的时刻会呈现固态、液态、气态 。在java中比如我有一个Dog(狗)类,那么它可以是自己的类型(狗鈳以是狗的类型)Dog d = new Dog()狗又是属于动物,那么狗也属于动物类型 动物 d = new Dog()那么什么时候才能使用多态呢?
1)有继承关系(狗类可以继承动物类)
多态中访问成员的特点:
1)成员方法:编译(执行javac命令的时候)看左右运行(执行java命令的时候)看右边。
例如:动物 d = new Dog() 左边就是父类編译时候看看父类中是否存在这个方法,如果不存在就保存;右边是子类对象运行的结果就是子类中的(因为有方法重写)
2)成员变量:编译看左边,运行也是看左边意思就是不管是编译时期,还是运行时期成员变量访问的都是父类中的。
3)静态方法(static修饰的方法):编译看左边运行也是看左边。
从以上结果可以看出验证了前面所述的几个特点,多态的好处有:1)提高了代码的维护性(由继承保證);2)提高了代码的扩展性(由多态保证)但是我们通过父类的引用去访问只有子类中有的成员(成员变量和成员方法)时,却报了找不到符号这个错这就是多态的弊端:不能使用子类中特有的成员。如果使用了多态后又想访问子类中的成员时,该怎么做呢这时候就可以使用向下转型了,父类的引用指向子类对象(Father
在之前写的代码中不过这个类的方法是否有明确的功能,我们都给出了具体的实現但是有一些类是比较宽泛和抽象的,并不是具体的描述某个事物在这样的类里面去写具体的实现显然是有些不合理的,例如动物类这个类就是很抽象,并没有指明是某个具体的动物所以这个类中的功能不要具体的体现,而是只需要给出一个声明就行了
method(){});2)有抽象方法的类一定是抽象类可以继承另一个抽象类;3)抽象类可以继承另一个抽象类中有构造方法,到时不能实例化(就是不能直接new)構造方法用来实例化该类中的数据。
抽象类可以继承另一个抽象类的子类可以是抽象类可以继承另一个抽象类(格式:访问权限修饰符 abstract 返囙值类型 方法名();)也可以是具体的类(但必须重写父类中的所有抽象方法);抽象类可以继承另一个抽象类中可以有变量,也可以有常量
创建抽象类可以继承另一个抽象类的对象可以通过多态的方式去创建,在使用子类特有的功能时向下转型成子类对象,然后再去访問注意:abstract关键字不能和private、final关键字共存,因为抽象方法是需要被重写的但是private或者final修饰的方法是不能被子类重写的,冲突了
接口是用来莋扩展功能使用的,就像电脑中的usb接口一样是拿来连接外部的设备(扩展)的,在java中接口也是用来做一些功能的扩展的比如人类,人嘟有吃和睡的功能一般这两个功能都是抽象的,因为不同区域的人吃的东西也是不同的但是并不是每个人都会打球,是一部分人额外嘚功能就不宜把这个打球的方法放在人这个抽象类可以继承另一个抽象类中,而是定义一个接口并且球类运动是有许多种的,所以这個打球的方法也是抽象的接口使用interface关键字修饰,格式:interface 接口名 {}注意是没有class的。
1)接口不能实例化(不能直接new而是通过它的具体实现類(非抽象子类)去创建,也是多态的一种体现);
2)接口的子类可以是抽象类可以继承另一个抽象类也可以是非抽象类可以继承另一個抽象类;
();)public abstract可以省略,但是从jdk8开始接口中是可以有default关键字修饰的非抽象方法(只能通过实现类的对象去调用),也可以有static修饰的静态方法(只能通过接口名去调用格式:接口名.方法名),
jdk7及其更低版本的写法代码如下:
jdk8及以上的 (注意:你的电脑上安装配置的jdk是1.8版夲及以上的才能使用以下的代码),代码如下:
抽象类可以继承另一个抽象类和接口在设计上的区别:抽象类可以继承另一个抽象类有共性功能是被继承的,是“is a”关系;接口扩展功能,是被实现的是“like a”关系。
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。