一键修正代码,在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.子类权限
抽象类:一个子类只能继承一个抽象类。
接口:一个子类可以实现多个接口。