Java深入數(shù)據(jù)結(jié)構(gòu)理解掌握抽象類與接口
abstract
abstract介紹:可以用于修飾:類(抽象類)、方法(抽象方法)
abstract修飾類:
①此類不能實(shí)例化(也就是不能創(chuàng)建這個(gè)類的對(duì)象)
②雖然自己不能實(shí)例化,但是子類會(huì)調(diào)用父類的構(gòu)造器,所以抽象類中一定有構(gòu)造器
abstract修飾方法
①抽象方法只有方法的聲明沒有方法體,所在的類一定是抽象類。因?yàn)槿绻惒皇浅橄蟮?,那這個(gè)類就可以造對(duì)象,可以造對(duì)象就可以調(diào)用。反之抽象類中可以沒有抽象方法。
② 若子類重寫了子類重寫了父類所有的抽象方法才能實(shí)例化,如果沒有全部重寫,那么子類也是抽象類,也需要用abstract修飾。
③abstract不能用來(lái)修飾私有方法、靜態(tài)方法、final關(guān)鍵字修飾的方法、final關(guān)鍵字修飾的類。
final明確不能繼承,但abstract需要子類繼承所以不能用,因?yàn)槿绻麅蓚€(gè)方法都是static,不認(rèn)為兩個(gè)方法是重寫或者覆蓋,所以abstract用來(lái)修飾靜態(tài)方法,就無(wú)法重寫。
抽象的應(yīng)用
模板方法設(shè)計(jì)模式。在軟件開發(fā)中實(shí)現(xiàn)一個(gè)算法時(shí),整體步驟很固定、通用,這些步驟在父類中寫好,某些易變的和不確定的部分可以抽象出來(lái)給子類實(shí)現(xiàn)。
抽象類的匿名子類對(duì)象
public static void main(String[] args){
//匿名對(duì)象
eat(new son());
//非匿名類的非匿名對(duì)象
son John=new son();
eat(John);
//匿名子類對(duì)象
father f=new father(){//抽象類造對(duì)象必須要重寫方法,了解看得懂就ok了。
@Override
public void work() {
}
@Override
public void info(father i) {
}
};
}
//普通方法
public static void eat(father f){
System.out.println("吃飯");
}
//父類
public abstract static class father{
String name;
int age;
public abstract void work();//抽象方法不能有方法體
public abstract void info(father i);
}
//子類
public class son extends father{//繼承
String name;
int age;
@Override
public void work(){
System.out.println("上學(xué)");
}
@Override
public void info(father i) {
System.out.println("name:"+i.name+" age:"+i.age);
}
}
//接口的匿名對(duì)象
非匿名的對(duì)象可以被多次調(diào)用,匿名的對(duì)象只能使用一次
Computer com=new Computer();//創(chuàng)建了接口的非匿名實(shí)現(xiàn)類(子類)的非匿名對(duì)象,類和對(duì)象都是有名的
Flash flash = new Flash();
//2.創(chuàng)建了接口的非匿名實(shí)現(xiàn)類的匿名對(duì)象,對(duì)象匿名了
com.transferData(new Printer());
//3創(chuàng)建了接口的匿名實(shí)現(xiàn)類的非匿名對(duì)象,就是類是匿名的,就不知道是接口中的哪個(gè)實(shí)現(xiàn)類,所以 需要重寫方法進(jìn)行說(shuō)明
USB phone = new USB{
public void start(){
...
}
};
//4.創(chuàng)建了接口的匿名實(shí)現(xiàn)類的匿名對(duì)象
com.transferData(new USB(){
public void start(){
...
}
});final關(guān)鍵字
final修飾類:此類不能被其他類所繼承,比如:String、System、StringBuffer
final修飾方法:此方法不能再被重寫,比如:Object類中的getClass()
static final用來(lái)修飾屬性:全局常量
final修飾變量:此時(shí)的變量就稱為是一個(gè)常量
final修飾屬性:可以考慮賦值的位置:顯式初始化,代碼塊中初始化、構(gòu)造器中初始化
final修飾局部變量:尤其是用final修飾形參時(shí),表明此形參是一個(gè)常量,當(dāng)調(diào)用此方法時(shí),給常量形參賦實(shí)參,一旦賦值就只能在方法體內(nèi)使用此形參,但不能重新賦值
接口
接口使用Interface來(lái)定義,和類是并列關(guān)系
接口的定義以及接口中的成員:
接口相關(guān)規(guī)則
1.接口中所有方法都是抽象的。
2.即使沒有顯式的將接口中的成員用public標(biāo)示,也是public訪問(wèn)類型的
3.接口中變量默認(rèn)用 public static final標(biāo)示,所以接口中定義的變量就是全 局靜態(tài)常量。
4.可以定義一個(gè)新接口,用extends去繼承一個(gè)已有的接口
5.可以定義一個(gè)類,用implements去實(shí)現(xiàn)一個(gè)接口中所有方法。
6.可以定義一個(gè)抽象類,用implements去實(shí)現(xiàn)一個(gè)接口中部分方法。
接口的特性
1.接口不可以被實(shí)例化
2.實(shí)現(xiàn)類必須實(shí)現(xiàn)接口的所有方法
3.實(shí)現(xiàn)類可以實(shí)現(xiàn)多個(gè)接口
4.接口中的變量都是靜態(tài)常量
如果類覆蓋了接口中所有的抽象方法,則可以創(chuàng)造實(shí)例;如果類沒有覆蓋接口中所有的抽象方法,則該類仍為抽象類。Java類可以實(shí)現(xiàn)多個(gè)接口——彌補(bǔ)了單繼承性的缺陷
class AA extends BB implements CC,DD,EE
接口和接口之間可以繼承,且可以多繼承。接口的使用體現(xiàn)了多態(tài)性。接口是一種規(guī)范,面向接口編程。
抽象類和接口的異同
相同點(diǎn):不能實(shí)例化,都可以包含抽象方法
不同點(diǎn):
1. 把抽象類和接口(java7、java8)的定義、內(nèi)部結(jié)構(gòu)解釋說(shuō)明
2. 類:?jiǎn)卫^承性,接口:多繼承性。
抽象類與接口的練習(xí)
abstract class Door {
//開門
public abstract void openDoor();
//關(guān)門
public abstract void closeDoor();
}
interface Lock {
public static final int num = 200;
//開鎖
public abstract void openLock();
//上鎖
public abstract void closeLock();
}
class LockDoor extends Door implements Lock {
public void openDoor() {
System.out.println("開門");
}
public void closeDoor() {
System.out.println("關(guān)門");
}
public void openLock() {
System.out.println("開鎖");
}
public void closeLock() {
System.out.println("上鎖");
}
}
public class TestLockDoor {
public static void main(String[] args) {
LockDoor lockDoor = new LockDoor();
lockDoor.openLock();
lockDoor.openDoor();
lockDoor.closeDoor();
lockDoor.closeLock();
}
} ? 接口的應(yīng)用
兩種設(shè)計(jì)模式
- 代理模式
代理設(shè)計(jì)就是為其他對(duì)象提供一張代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)
應(yīng)用場(chǎng)景:安全代理、遠(yuǎn)程代理、延遲加載
分類:靜態(tài)代理、動(dòng)態(tài)代理
- 工廠模式
實(shí)現(xiàn)創(chuàng)建者和調(diào)用者的分離
interface A{
int x=0;
}
class B{
int x=1;
}
class C extends B implements A{
public void pX(){
System.out.println(x);
}
public static void main(String[] args){
new C().pX();
}
}
//問(wèn)題:編譯期不知道是要輸出哪個(gè)x
System.out.println(super.x);//這個(gè)調(diào)用的是父類中的
System.out.println(A.x);//這個(gè)調(diào)用的是接口中的
java8中接口新特性
JDK8:除了全局常量和抽象方法,還可以定義靜態(tài)方法和默認(rèn)方法(default關(guān)鍵字修飾)
public interface CompareA{
public static void method1(){
//靜態(tài)方法
System.out.println("CompareA:北京");
}
public default void method2(){
//默認(rèn)方法
System.out.println("CompareA:上海");
}
}
接口中定義的靜態(tài)方法只能通過(guò)接口來(lái)調(diào)用,接口.方法。
通過(guò)實(shí)現(xiàn)類的對(duì)象,可以調(diào)用接口中的默認(rèn)方法,對(duì)象.方法。
如果實(shí)現(xiàn)類重寫了接口中的默認(rèn)方法,調(diào)用時(shí)仍然調(diào)用的是重寫以后的方法
如果子類(或?qū)崿F(xiàn)類)繼承的父類和實(shí)現(xiàn)的接口中聲明了同名同參數(shù)的方法,子類在沒有重寫此方法的情況下調(diào)用的是父類中的方法——類優(yōu)先原則
如果實(shí)現(xiàn)類實(shí)現(xiàn)了多個(gè)接口,而這個(gè)多個(gè)接口中定義了同名同參數(shù)的默認(rèn)方法,在實(shí)現(xiàn)類沒有重寫方法的情況下會(huì)報(bào)”接口沖突“錯(cuò)誤,此時(shí)需要重寫。
如何在子類(或者實(shí)現(xiàn)類)調(diào)用父類、接口中被重寫的方法? 接口.super.方法。
內(nèi)部類
需要關(guān)注的問(wèn)題:如何實(shí)例化成員內(nèi)部類的對(duì)象:外部類Person,靜態(tài)內(nèi)部類Brain,非靜態(tài)內(nèi)部類Lungs,靜態(tài)成員內(nèi)部類:new 外部類.內(nèi)部類()
Person.Brain brain=new Person.Brain();
非靜態(tài)成員內(nèi)部類:先造對(duì)象,對(duì)象.new 內(nèi)部類()
Person p=new Person(); p.Lungs lungs=p.new Lungs();
如何在成員內(nèi)部類中區(qū)分調(diào)用外部類的結(jié)構(gòu)
形參直接調(diào),所在類的用this.結(jié)構(gòu),外部類的用外部類.this.結(jié)構(gòu)
成員內(nèi)部類和局部?jī)?nèi)部類在編譯以后都會(huì)生成字節(jié)碼文件
成員內(nèi)部類:外部類.內(nèi)部類名.class
局部?jī)?nèi)部類:外部類.數(shù)字 內(nèi)部類名.class
在局部?jī)?nèi)部類的方法中,如果調(diào)用局部?jī)?nèi)部類所在的方法中的局部變量,該局部變量必須用final關(guān)鍵字修飾(JAVA8之后可以不寫出來(lái),但仍然還是final的)
public void Person(){
int num=10;
class AA{//局部?jī)?nèi)部類
public void show(){//局部?jī)?nèi)部類的方法
num=20;//試圖修改會(huì)報(bào)錯(cuò)
System.out.println(num);//調(diào)用局部?jī)?nèi)部類所在的方法中的局部變量
}
}
}
開發(fā)中局部?jī)?nèi)部類的使用
常用的局部?jī)?nèi)部類:
//方式一
public Comparable getCompareble(){
class MyComparable implements Comparable{//局部?jī)?nèi)部類
public int compareTo(Object o){
return 0;
}
}
return new MyComparable();
}
//方式二
public Comparable getCompareble(){
return new Comparable(){
public int CompareTo(Object o){
return 0;
}
};
}
Java允許將一個(gè)類A聲明在另一個(gè)類B中,A為內(nèi)部類,B為外部類
內(nèi)部類的分類:成員內(nèi)部類、局部?jī)?nèi)部類(方法內(nèi),代碼塊內(nèi),構(gòu)造器內(nèi))
成員內(nèi)部類
作為外部類的成員:可以調(diào)用外部類的結(jié)構(gòu),可以被static修飾
作為一個(gè)類:可以定義屬性、方法、構(gòu)造器,可以用final、abstract修飾,可以被繼承
this.name//內(nèi)部類的屬性
Person.this.name//外部類的屬性
總結(jié)
今天學(xué)習(xí)了抽象類,final關(guān)鍵字的使用,接口的概念,特點(diǎn),以及使用方式,內(nèi)部類。
到此這篇關(guān)于Java深入數(shù)據(jù)結(jié)構(gòu)理解掌握抽象類與接口的文章就介紹到這了,更多相關(guān)Java抽象類與接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決idea導(dǎo)入ssm項(xiàng)目啟動(dòng)tomcat報(bào)錯(cuò)404的問(wèn)題
今天小編就為大家分享一篇解決idea導(dǎo)入ssm項(xiàng)目啟動(dòng)tomcat報(bào)錯(cuò)404的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
SpringBoot3讀取配置文件application.properties屬性值的幾種方式
這篇文章主要介紹了SpringBoot3讀取配置文件application.properties屬性值的幾種方式,文中通過(guò)代碼示例給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-11-11
Java File類 mkdir 不能創(chuàng)建多層目錄的解決
這篇文章主要介紹了Java File類 mkdir 不能創(chuàng)建多層目錄的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java序列化和反序列化_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
把對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程稱為對(duì)象的序列化,把字節(jié)序列恢復(fù)為對(duì)象的過(guò)程稱為對(duì)象的反序列化。接下來(lái)通過(guò)本文給大家介紹Java序列化和反序列化及主要的兩種用途,感興趣的的友參考下吧2017-05-05
POI通過(guò)模板導(dǎo)出EXCEL文件的實(shí)例
下面小編就為大家?guī)?lái)一篇POI通過(guò)模板導(dǎo)出EXCEL文件的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
Mybatis Plus 實(shí)現(xiàn)批量插入的示例代碼
本文主要介紹了Mybatis Plus 實(shí)現(xiàn)批量插入的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
支付寶APP支付(IOS手機(jī)端+java后臺(tái))版
這篇文章主要為大家詳細(xì)介紹了支付寶APP支付(IOS手機(jī)端+java后臺(tái))版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
JAVA技術(shù)實(shí)現(xiàn)上傳下載文件到FTP服務(wù)器(完整)
這篇文章主要介紹了JAVA技術(shù)實(shí)現(xiàn)上傳下載文件到FTP服務(wù)器(完整),本文使用 Apache Jakarta Commons Net(commons-net-3.3.jar) 基于FileZilla Server服務(wù)器實(shí)現(xiàn)FTP服務(wù)器上文件的上傳/下載/刪除等操作,需要的朋友可以參考下2015-07-07
IntelliJ IDEA引入第三方j(luò)ar包或查看Java源碼的時(shí)候報(bào)decompiled.class file byt
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA引入第三方j(luò)ar包或查看Java源碼的時(shí)候報(bào)decompiled.class file bytecode version:52.0(java 8)錯(cuò)誤的解決辦法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10

