抽象类与接口

一键修正代码,在IDEA中爆红的位置,使用快捷键Alt+Enter,快速修正错误代码。

一、抽象类(抽象类是普通类的超集!普通类有的,抽象类全都有)

抽象类和抽象方法存在的意义就在于强制要求子类覆写某些方法,但是抽象类仍然满足is a原则,子类必须是满足继承关系才能继承抽象类,且一个子类只能继承一个抽象类!!!(单继承局限)

抽象类的使用原则:

a、被abstract定义的类称之为抽象类,抽象类无法直接实例化对象,可以通过向上转型进行实例化。

b、 抽象类中可以没有抽象方法,只要一个类中定义了抽象方法,则这个类一定是抽象类!子类继承抽象类,必须重写所有的抽象方法(前提:子类是普通类);但子类仍然是抽象类,就可以不重写任何的抽象方法。

c、bastract和final以及private关键字不能同时出现!

例1:abstract能否和final关键字一起出现?

坚决不能同时出现,他俩一块写出来一定编译出错。

被final修饰的方法不能被重写,抽象方法子类必须重写=>矛盾。

被final修饰的类不能继承,抽象类必须有子类=>矛盾。

例2:abstract能否和private关键字一起出现?

不能!一定会编译出错,私有方法无法重写,抽象方法必须重写=>矛盾。

d、抽象类是普通类的超集,抽象类中仍然可以存在普通方法和构造方法,且子类实例化时仍然满足继承的原则,先调用父类的构造方法,再调用子类的构造方法!

1、abstract关键字

1.1.在Java中使用abstract关键字定义抽象方法,且抽象方法所在的类一定是抽象类,抽象方法没有方法体。

例:没有方法体的类一点是抽象类?

错!!还有一种类没有方法体只有方法声明,native方法,本地方法。

1.2.抽象类也是使用abstract关键字声明,可以包含(0--N)抽象方法。

1.3.抽象类无法直接实例化子类,子类继承抽象类必须覆写使用抽象类中的抽象方法。

二、接口

“接口里面只允许存在有public权限,也就是说不管是属性还是方法其权限只能是public。”

接口:更加“纯粹的抽象类”

1、接口的定义和使用

1.1、再Java中,使用interfer关键字来定义接口,接口中只有全局常量和抽象方法(JDK8之前,也是咱们当前设计使用的接口);同时在Java中子类使用implements表示实现一个父接口,必须重写接口中的所有的抽象方法。

代码表示:

interface USB{

     String TEST=“123”;//省略public static final

      void   work();//省略了public abstract

}

1.2、正因为接口中普遍只存在全局常量和抽象方法,因此,接口中public、abstract、private、final统统可以省略不写!阿里编码规约里也要求,接口中关键字都不出现!(只有接口可以省略这些关键字,抽象类必须public就是defaylt权限)

例:抽象类中访问权限没写关键字是什么权限?

抽象类还是类,类中权限修饰符不写默认是包权限!!!!(抽象类中public、abstract、private、final统统不能省略。)

1.3、接口也无法直接实例化对象,必须通过子类向上转型为其实例化。

1.4、一个子类可以同时使用implements关键字来实现多个父接口(子类若实现了多个父接口,必须重写这些父接口中的所有抽象方法!前提:子类是普通类。)!(开发中的接口优先原则,优先考虑接口 )

一般来说,在Java中,接口的命名规则:除了特殊的一些接口外(USB接口,现实生活中存在的接口),接口一般采用大写的I开头,子类使用impl结尾表示是一个接口的实现子类。

2、接口与类之间的关系:子类同时继承和实现接口的顺序!

2.1、若有子类同时需要继承一个抽象类,实现父接口,请先使用extends继承一个父类,然后再使用implements实现接口!

2.2、接口与接口之间可以使用extends关键字,接口可以继承父接口,接口的继承是多继承,没有is a原则。

例:接口能否使用extends继承一个类?

不能!接口中只有全局常量和抽象方法,若接口能继承类,那接口中不是就有了普通方法和构造方法!

3、JDK8扩展的接口的内容(了解)

从JDK8开始,接口中也允许存在普通方法,接口中的普通方法使用default关键字来定义,有方法体,子类实现接口之后可以直接使用接口中的普通方法!

例(校招笔试题):接口中只有全局变量和抽象方法?

有漏洞,若没有说明版本,这句话严格意义上是错的,JDK8之前是正确的!

4、JDK中常用的两大接口

4.1、Java.lang.Comparable接口,当一个类实现了Comparable接口,就表示当前具备了可比较的能力(对于自定义的类,要想让这个类具备“可比较的能力”,可以实现Java.lang.Comparable接口,覆写其中的comparaTo接口)(再JVM看来,他只看comparable方法的返回值,返回值>0就认为是大,返回值<0就认为是小,返回值=0就认为是相等,可以利用这个规则进行升序、降序。)

4.2、Java.lang.Clonable接口和深浅拷贝

当一个类实现了Cloneable接口,这个类就具备了可被“克隆“的能力。

5、深浅拷贝

5.1什么是深浅拷贝?如何实现对象的深拷贝?

浅拷贝:对象内部若包含其他类的对象,浅拷贝只会复制地址值,并不会产生新的对象。

深拷贝:克隆对象内部若包含其他对象的引用,会创建新对象,将原对象的内容复制过来。(再JAVA中可以递归调用clone方法实现深拷贝或者通过序列化(将任何对象变为字符串的过程就是序列化;从字符串中还原原来对象的过程称之为反序列化)的方式实现深拷贝)

接口与抽象类的区别总结:

1、结构组成:

抽象类:普通类+抽象方法

接口:抽象方法+全局常量

2、权限

抽象类:各种权限。

接口:public

3、子类使用

抽象类:使用extends关键字继承抽象类。

接口:使用implements关键字实现接口。

4.关系

抽象类:一个抽象类实现多个父接口。

接口:接口不能继承抽象类,但是接口可以使用extends关键字继承多个父接口。

5.子类权限

抽象类:一个子类只能继承一个抽象类。

接口:一个子类可以实现多个接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值