java继承多态和抽象类接口知识点总结
本篇内容主要讲解“java继承多态和抽象类接口知识点总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java继承多态和抽象类接口知识点总结”吧!
网站设计、网站制作介绍好的网站是理念、设计和技术的结合。成都创新互联公司拥有的网站设计理念、多方位的设计风格、经验丰富的设计团队。提供PC端+手机端网站建设,用营销思维进行网站设计、采用先进技术开源代码、注重用户体验与SEO基础,将技术与创意整合到网站之中,以契合客户的方式做到创意性的视觉化效果。
一、继承
通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类。已有的称为父类,新的类称为子类(父类派生子类,子类继承父类)。
(1)继承的优点:
①代码的可重用性;
②父类的属性的方法可用于子类;
③子类可扩展父类的属性和方法;
④设计应用程序变得更加简单。
(2)关键字“is a”用于判断父类和子类的继承关系是否正确。
(3)Java中继承的实现:
public class 子类 extends 父类{}
(4)继承的单根性:在Java中一个类只能有一个父类;
传递性:一个Java类可以父类,父类也可以有父类。
(5)所有类的根类:
Object类,又叫基类或超类。
Object类是每个Java类的父类,要么是直接的父类,要么就是间接的父类。
Object类中的三个重要方法:
① public boolean equals(Object x):检测两个对象是否相等。
该方法经常被重写。若两个对象通过该方法判断是相等的,那么两个对象的 hashCode()方法应该产生相同的哈希码
② public String toString:该方法返回对象的字符串表示。
用字符串来表示对象有助于调试或测试。
③ protected void finalize() throws Throwale:
该方法在对象将要被垃圾回收时调用。
(6)方法重写:
子类可以重写从父类继承的方法,从而允许子类添加或者改变父类中方法的行为。
该行为方法生在子类中,对父类方法重写。
子类重写父类方法时,必须遵循如下规则:
①子类的方法的返回值类型、方法名和形式参数列表必须和父类中的是相同的;
②访问修饰符必须不小于父类中的访问修饰符;
③子类中重写抛出的异常不能比父类中抛出的异常多。
(7)super 关键字:
子类想要给继承的方法添加行为,但并不完全替换父类的方法。
(默认情况下,子类构造器会调用父类的无参构造方法)
(8)final 关键字:
当不希望一个类被继承是则在class前加上关键字final。
final关键字可以出现在返回值类型之前的任意位置,习惯上是放在访问修饰符之后。
①final类:一个类可以声明为最终类的。最终类不能被继承。
②final方法:一个方法可以声明为最终的。最终方法不能被重写。
补充:父类的构造方法不能被继承。
可用super( , , )来调用构造器,用super调用父类方法。
(9)abstract关键字:
使用关键字abstract可以声明一个抽象类。
该关键字可以出现在类声明时class关键字前的任何地方。
当类没有实例化必要时,可将该类改为抽象类。
(10)抽象方法:
①没有方法主体;
②必须出现在抽象类中;
③在子类中必须被重写,除非子类也是抽象类。
更多继承多态java技术知识理解请查看《java多态案例分析--深入人心的理解》
二、接口—特殊的抽象类(interface)
(1) ①接口中全都是抽象方法,不能被实例化;
②类不能继承接口,只能“实现”接口所定义的方法;
(2)接口与类
相似之处:
①接口可以有任意数量的方法;
②接口保存以“ .Java ”为后缀名的文件,接口名需要与文件名匹配;
③接口编译后是后缀名为“ .class ”的字节码文件;
④在包中的接口,其相应的字节码文件必须放置在和包名称相匹配的一个目录结构中。
不同之处:
①接口不能被实例化;
②接口不包含任何构造器;
③接口中所有的方法都是抽象的;
④接口中不能包含实例成员变量。
唯一可以出现在接口中的成员变量必须是同时声明为static和final,即公有静态常量;
⑤接口不能被一个类继承,只能被一个类实现;
⑥一个接口能够继承多个接口。
(3)接口具有以下性质:
①接口默认是抽象的;
②接口的中每一个方法默认也是抽象的;
③接口中的方法默认访问级为public。
(4)接口使用原则:
①使用接口解决多继承;
②使用接口为外部类添加功能;
③以面向对象的角度考虑,量一个类与生俱来的特征和行为和依赖于外部的可选特征和行为分离。
(5)类实现接口有2个选择:
①实现接口中所定义的所有方法;
②声明自己为抽象类。
使用关键字implements类实现接口,该关键字放在类声明的extends部分之后
eg:
public class 类名 extends 父类名 implements 接口名
一个类可以实现多个接口,接口之间用逗号分隔。
implements 与 is a 都是继承关系。
(6)使用接口的好处:
①将设计和实现分离,对外隐藏了实现;
②面向接口编程是OOP的核心。
三、抽象类与接口的区别
1.语法层面上的区别
1)抽象类可以提供成员方法的实现细节。
而接口中只能存在public abstract 方法;
2)抽象类中的成员变量可以是各种类型的。
而接口中的成员变量只能是public static final类型的;
3)接口中不能含有静态代码块以及静态方法。
而抽象类可以有静态代码块和静态方法;
4)一个类只能继承一个抽象类。
而一个类却可以实现多个接口。
2.设计层面上的区别
1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。那么在设计的时候,可以将飞机设计为一个类Airplane,将鸟设计为一个类Bird,但是不能将 飞行 这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。此时可以将 飞行 设计为一个接口Fly,包含方法fly( ),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。然后至于有不同种类的飞机,比如战斗机、民用飞机等直接继承Airplane即可,对于鸟也是类似的,不同种类的鸟直接继承Bird类即可。从这里可以看出,继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口。
2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。什么是模板式设计?最简单例子,大家都用过ppt里面的模板,如果用模板A设计了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A,如果它们的公共部分需要改动,则只需要改动模板A就可以了,不需要重新对ppt B和ppt C进行改动。而辐射式设计,比如某个电梯都装了某种报警器,一旦要更新报警器,就必须全部更新。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。
有关java抽象类的更详细文章请查看《两分钟教会你在java中定义一个抽象类属性》、《我是类!超级无敌大帅哥花泽类的类!》
3.例子
门和警报的例子:
门都有open( )和close( )两个动作.
此时我们可以定义通过抽象类和接口来定义这个抽象概念:
public abstract class Door { public abstract void open(); public abstract void close(); } |
或者:
public interface Door { public abstract void open(); public abstract void close(); } |
但是现在如果我们需要门具有报警alarm( )的功能,那么该如何实现?
下面提供两种思路:
1) 将这三个功能都放在抽象类里面,但是这样一来所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;
2) 将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close( ),也许这个类根本就不具备open( )和close( )这两个功能,比如火灾报警器。
从这里可以看出, Door的open() 、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。
public interface Alram { public void alarm(); } public abstract class Door { public abstract void open(); public abstract void close(); } public class AlarmDoor extends Door implements Alram { @Override public void alarm() { // TODO Auto-generated method stub } @Override public void open() { // TODO Auto-generated method stub } @Override public void close() { // TODO Auto-generated method stub } } |
到此,相信大家对“java继承多态和抽象类接口知识点总结”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
网站名称:java继承多态和抽象类接口知识点总结
文章地址:http://hbruida.cn/article/giphsd.html