面向对象阶段语法
成員變量和局部變量的區(qū)別?
1.在類(lèi)中的位置不同
成員變量:在類(lèi)中方法外
局部變量:在方法定義中或者方法聲明上
2.在內(nèi)存中的位置不同
成員變量:在堆內(nèi)存
局部變量:在棧內(nèi)存
3.生命周期不同
成員變量:隨著對(duì)象的創(chuàng)建而存在,隨著對(duì)象的消失而消失
局部變量:隨著方法的調(diào)用而存在,隨著方法的調(diào)用完畢而消失
4,初始化值不同
成員變量:有默認(rèn)初始化值
局部變量:沒(méi)有默認(rèn)初始化值,必須定義,賦值,然后才能使用
注意事項(xiàng):
局部變量名稱(chēng)和成員變量名稱(chēng)可以一樣,在方法中使用的時(shí)候,采用的是就近原則
形式參數(shù)的問(wèn)題:
基本類(lèi)型:形式參數(shù)的改變不影響實(shí)際參數(shù)
引用類(lèi)型:形式參數(shù)的改變直接影響實(shí)際參數(shù)
匿名對(duì)象的應(yīng)用場(chǎng)景:
new Student().show();
1.調(diào)用方法,僅僅只調(diào)用一次的時(shí)候,那么這種匿名調(diào)用有什么好處嗎?
有,匿名對(duì)象調(diào)用完畢就是垃圾,可以被垃圾回收器回收
2.匿名對(duì)象可以作為實(shí)際參數(shù)傳遞
封裝概述:
是指隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外提供公共訪問(wèn)方式。
好處;隱藏實(shí)現(xiàn)細(xì)節(jié),提供公共的訪問(wèn)方式
提高了代碼的復(fù)用性
提高了代碼的安全性
原則:
將不需要對(duì)外提供的內(nèi)容都隱藏起來(lái)
把屬性隱藏,提供公共的方法對(duì)其訪問(wèn)
private關(guān)鍵字:
是一個(gè)權(quán)限修飾符
可以修飾成員(成員變量和成員方法)
被private修飾的成員,只能在本類(lèi)中才能訪問(wèn)。
private最常見(jiàn)的應(yīng)用
把成員變量用private修飾,提供對(duì)應(yīng)的getXXX()setXXX()方法
構(gòu)造方法的注意事項(xiàng):
1.如果我們沒(méi)有給出構(gòu)造方法,系統(tǒng)將自動(dòng)提供一個(gè)無(wú)參構(gòu)造方法
2.如果我們給出了構(gòu)造方法,系統(tǒng)將不再提供默認(rèn)的無(wú)參構(gòu)造方法
給成員變量賦值有兩種方法:
1.利用setXXX()方法賦值,這種方式調(diào)用的一般是無(wú)參的構(gòu)造函數(shù),利用 對(duì)象名.setXXX("林青霞");
2.利用帶有參數(shù)的構(gòu)造方法賦值 通過(guò)調(diào)用有參構(gòu)造函數(shù),在創(chuàng)建對(duì)象的時(shí)候,直接賦值
?
class Student{
private String name = "林青霞";
private int age = 27;
public Student(){
name = "劉意";
age = 30;
}
}
class StudentDemo{
public static void main(String [] args){
Student s = new Student();
}
}
Student s = new Student();做了哪些事情
1.把Student.Class文件加載到內(nèi)存
2.在棧內(nèi)存給s變量開(kāi)辟一個(gè)空間
3.在堆內(nèi)存為學(xué)生對(duì)象申請(qǐng)一個(gè)空間
4.給成員變量進(jìn)行默認(rèn)初始化 null 0
5.給成員變量進(jìn)行顯示初始化 林青霞 27
6.通過(guò)構(gòu)造方法給成員變量進(jìn)行初始化 劉意 30
7.數(shù)據(jù)初始化完畢,然后把堆內(nèi)存的地址值賦值給棧內(nèi)存的S變量
變量什么時(shí)候定義為成員變量;
如果這個(gè)變量是用來(lái)描述這個(gè)類(lèi)的信息的,那么,該變量就應(yīng)該定義為成員變量
變量到底定義在哪里好?
變量的范圍越小越好,因?yàn)槟芗皶r(shí)被回收。
?
static的特點(diǎn)(它可以修飾成員變量,也可以修飾成員方法)
1.隨著類(lèi)的加載而加載
2.優(yōu)先于對(duì)象存在(不用創(chuàng)建對(duì)象,它修飾的成員就能使用)
3.被類(lèi)的所以對(duì)象共享
4.可以通過(guò)類(lèi)名調(diào)用
static關(guān)鍵字的注意事項(xiàng);
1.在靜態(tài)方法中是沒(méi)有this關(guān)鍵字的
如何理解呢?
靜態(tài)是隨著類(lèi)的加載而加載,this是隨著對(duì)象的創(chuàng)建而存在
2.靜態(tài)方法只能訪問(wèn)靜態(tài)的成員變量和靜態(tài)的成員方法
靜態(tài)方法:
無(wú)論是訪問(wèn)成員變量還是都成員方法,都必須是靜態(tài)的
非靜態(tài)方法:
訪問(wèn)靜態(tài)和非靜態(tài)都可以
簡(jiǎn)單記:靜態(tài)只能訪問(wèn)靜態(tài)
靜態(tài)變量和成員變量的區(qū)別:
所屬不同
靜態(tài)變量直屬于類(lèi),所以也成為類(lèi)變量
成員變量屬于對(duì)象,所以也稱(chēng)為實(shí)例變量
內(nèi)存中位置不同
靜態(tài)變量存儲(chǔ)于方法區(qū)的靜態(tài)區(qū)
成員變量存儲(chǔ)于堆內(nèi)存
內(nèi)存出現(xiàn)時(shí)間不同
靜態(tài)變量隨著類(lèi)的加載而加載,隨著類(lèi)的消失而消失
成員變量隨著對(duì)象的創(chuàng)建而存在,隨著對(duì)象的消失而消失
調(diào)用不可
靜態(tài)變量可以通過(guò)類(lèi)名調(diào)用,也可以通過(guò)對(duì)象調(diào)用
成員變量只能通過(guò)對(duì)象名調(diào)用
main方法的講解:
public static void main(String [] args)
public :公共的,訪問(wèn)權(quán)限最大,由于main方法是被jvm調(diào)用,所以權(quán)限要大
static:靜態(tài)的,不需要?jiǎng)?chuàng)建對(duì)象,通過(guò)類(lèi)名就可以,方便jvm的調(diào)用
void:因?yàn)槲覀冊(cè)?jīng)說(shuō)過(guò),方法的返回值是返回給調(diào)用者,而main方法是被jvm調(diào)用,所以返回內(nèi)容給jvm沒(méi)有意義
main:是一個(gè)常見(jiàn)的方法入口,虛擬機(jī)認(rèn)識(shí)的名字
String[] args:這是一個(gè)字符串?dāng)?shù)組,值去哪里了?
這個(gè)東西到底有什么用?怎么給值?
這個(gè)東西早期是為了接收鍵盤(pán)入錄的數(shù)據(jù)的,后面才有了Scanner
格式是:
java MainDemo hello world java
如何制造一個(gè)說(shuō)明書(shū)呢?
1.寫(xiě)一個(gè)工具類(lèi)
2.對(duì)這個(gè)類(lèi)加入文檔注釋
3.用工具解析文檔注釋
4.格式 javadoc -d 目錄 -author -version ArrayTool.java
目錄:就可以寫(xiě)一個(gè)文件夾的路徑
制作幫助文檔出錯(cuò):
找不到可以文檔化的公共或受保護(hù)的類(lèi):告訴我們類(lèi)的權(quán)限不夠
?
如何查看api文檔
1.打開(kāi)幫助文檔
2.點(diǎn)擊顯示,找到索引,看到輸入框
3.知道你要找誰(shuí)?以Scanner為例
4.在輸入框里面輸入Scanner,然后回車(chē)
5.看包
java.lang包下的類(lèi)不需要導(dǎo)入,其他的全部要導(dǎo)入
要導(dǎo)入:
java.util.Scanner
6.再簡(jiǎn)單的看看類(lèi)的解釋和說(shuō)明,別忘了看看該類(lèi)的版本
7.看類(lèi)的結(jié)構(gòu)
成員變量 字段摘要
構(gòu)造方法 構(gòu)造方法摘要
成員方法 方法摘要
8.構(gòu)造方法
1.有構(gòu)造方法 就創(chuàng)建對(duì)象
2.沒(méi)有構(gòu)造方法 成員可能都是靜態(tài)的
9.看成員方法
1.左邊
是否靜態(tài):如果靜態(tài),可以通過(guò)類(lèi)名調(diào)用
返回值類(lèi)型:人家返回什么,你就用什么接收
2.右邊
看方法名:方法名稱(chēng)不要寫(xiě)錯(cuò)
參考列表:人家要什么,你就給什么,人家要幾個(gè),你就給幾個(gè)
?
代碼塊:在java中,使用{}括起來(lái)的代碼被稱(chēng)為代碼塊
根據(jù)其位置和聲明的不同,可以分為:
局部代碼塊:局部位置,用于限定變量的生命周期
構(gòu)造代碼塊:在類(lèi)的成員位置,用{}括起來(lái)的代碼,每次調(diào)用構(gòu)造方法執(zhí)行前,都會(huì)先執(zhí)行構(gòu)造代碼塊
靜態(tài)代碼塊:在類(lèi)的成員位置,用{}括起來(lái)的代碼,只不過(guò)它用了static修飾
作用:一般是對(duì)類(lèi)進(jìn)行初始化
面試題:靜態(tài)代碼塊,構(gòu)造代碼塊,和構(gòu)造方法的執(zhí)行順序?
靜態(tài)代碼塊-》構(gòu)造代碼塊-》構(gòu)造方法
靜態(tài)代碼塊:只執(zhí)行一次
構(gòu)造代碼塊:每次調(diào)用構(gòu)造方法都執(zhí)行
繼承概述:
把多個(gè)類(lèi)中相同的內(nèi)容給提取出來(lái)定義到一個(gè)類(lèi)中
如何實(shí)現(xiàn)繼承呢?
java提供了關(guān)鍵字:extends
格式:
class 子類(lèi)名 extends 父類(lèi) {}
好處:
1.提高了代碼的復(fù)用性
2.提高了代碼的維護(hù)性
3.讓類(lèi)與類(lèi)之間產(chǎn)生了關(guān)系,是多態(tài)的前提。
類(lèi)與類(lèi)產(chǎn)生了關(guān)系,其實(shí)也是繼承的一個(gè)弊端:類(lèi)的耦合性增強(qiáng)了
開(kāi)發(fā)的原則:低耦合,高內(nèi)聚
耦合:類(lèi)與類(lèi)的關(guān)系
內(nèi)聚:就是自己完成某件事情的能力
java只支持單繼承,不支持多繼承
一個(gè)類(lèi)只能有一個(gè)父類(lèi),不可以有多個(gè)父類(lèi)
java支持多層繼承(繼承體系),
繼承的注意事項(xiàng):
1.子類(lèi)只能繼承父類(lèi)所有非私有的成員(成員方法和成員變量)
2.子類(lèi)不能繼承父類(lèi)的構(gòu)造方法,但是可以通過(guò)super關(guān)鍵字去訪問(wèn)父類(lèi)構(gòu)造方法
3.不要為了部分功能而去繼承
class A{
public void show1(){}
public void show2(){}
}
class B{
public void show2(){}
public void show3(){}
}
我們發(fā)現(xiàn)B類(lèi)中出現(xiàn)了和A類(lèi)一樣的show2()方法,所以,我們采用繼承
class B extendx A{
public void show3(){}
}
這樣其實(shí)不好,因?yàn)檫@樣你不但有了show2(),還多了show1(),有可能show1()不是你想要的
那么我們什么時(shí)候考慮使用繼承呢?
繼承其實(shí)體現(xiàn)的是一種關(guān)系:is a
person
Student
Teacher
繼承中成員變量的關(guān)系
1.子類(lèi)中的成員變量和父類(lèi)中的成員變量名稱(chēng)不一樣,這個(gè)簡(jiǎn)單
2.子類(lèi)中的成員變量和父類(lèi)中的成員變量名稱(chēng)一樣,這個(gè)怎么玩呢?
在子類(lèi)方法中訪問(wèn)一個(gè)變量的查找順序:
1.在子類(lèi)方法的局部范圍,有就使用
2.在子類(lèi)的成員范圍,有就使用
3.在父類(lèi)的成員范圍找,有就使用
4.如果還找不到,就報(bào)錯(cuò)
this和super的區(qū)別?
this代表本類(lèi)對(duì)象的引用
super代表父類(lèi)存儲(chǔ)空間的標(biāo)識(shí)(可以理解為父類(lèi)引用,可以操作父類(lèi)的成員)
怎么用呢?
1.調(diào)用成員變量
this.成員變量 調(diào)用本類(lèi)的成員變量
super.成員變量 調(diào)用父類(lèi)的成員變量
2.調(diào)用構(gòu)造方法
this(...)調(diào)用本類(lèi)的構(gòu)造方法
super(...)調(diào)用父類(lèi)的構(gòu)造方法
3.調(diào)用成員方法
this.成員方法,調(diào)用本類(lèi)的成員方法
super.成員方法,調(diào)用父類(lèi)的成員方法
繼承中構(gòu)造方法的關(guān)系?
1.子類(lèi)中所有的構(gòu)造方法默認(rèn)都會(huì)訪問(wèn)父類(lèi)中空參數(shù)的構(gòu)造方法
2.為什么呢?
因?yàn)樽宇?lèi)會(huì)繼承父類(lèi)中的數(shù)據(jù),可能還會(huì)使用父類(lèi)的數(shù)據(jù),
所以,子類(lèi)初始化之前,一定要先完成父類(lèi)數(shù)據(jù)的初始化。
注意:子類(lèi)每一個(gè)構(gòu)造方法的第一條語(yǔ)句默認(rèn)都是:super();
如果父類(lèi)沒(méi)有無(wú)參構(gòu)造方法,那么子類(lèi)的構(gòu)造方法會(huì)出現(xiàn)什么現(xiàn)象呢?如何解決呢?
會(huì)報(bào)錯(cuò):
如何解決呢?
1.在父類(lèi)中加一個(gè)無(wú)參構(gòu)造方法
2.通過(guò)使用super關(guān)鍵字去顯示調(diào)用父類(lèi)的帶參構(gòu)造方法
3.子類(lèi)通過(guò)this去調(diào)用本類(lèi)的其他構(gòu)造方法(前提是子類(lèi)中其他的構(gòu)造方法中,
一定要有一個(gè)區(qū)訪問(wèn)了父類(lèi)的構(gòu)造方法,否則父類(lèi)數(shù)據(jù)就沒(méi)有初始化)
注意事項(xiàng):
this(...)或者super(...)必須是第一條語(yǔ)句
如果不是放在第一條語(yǔ)句上,就可能對(duì)父類(lèi)的數(shù)據(jù)進(jìn)行了多次初始化(為什么呢?因?yàn)槟J(rèn)第一條語(yǔ)句會(huì)隱含調(diào)用父類(lèi)的無(wú)參構(gòu)造方法),所以必須放在第一條語(yǔ)句上。
繼承中成員方法的關(guān)系:
1.子類(lèi)中的方法和父類(lèi)中的方法聲明不一樣,這個(gè)簡(jiǎn)單,直接調(diào)用
2.子類(lèi)中的方法和父類(lèi)中的方法聲明一樣,這個(gè)該怎么玩呢?
通過(guò)子類(lèi)調(diào)用方法:
1.先找子類(lèi)中,看有沒(méi)有這個(gè)方法,有就使用
2.再看父類(lèi)中,有沒(méi)有這個(gè)方法,有就使用
3.如果沒(méi)有就報(bào)錯(cuò)
方法重寫(xiě):子類(lèi)中出現(xiàn)了和父類(lèi)中方法聲明一模一樣的方法
方法重載:在同一個(gè)類(lèi)中出現(xiàn)的方法名一樣,參數(shù)列表不同,與返回值無(wú)關(guān)
子類(lèi)對(duì)象調(diào)用方法的時(shí)候:先找子類(lèi)本身,再找父類(lèi)
方法重寫(xiě)的應(yīng)用:
當(dāng)子類(lèi)需要父類(lèi)的功能,而功能主體子類(lèi)有自己特有的內(nèi)容時(shí),
可以重寫(xiě)父類(lèi)的方法,這樣,既沿襲了父類(lèi)的功能,又定義了子類(lèi)特有的內(nèi)容
方法重寫(xiě)的注意事項(xiàng):
1.父類(lèi)中私有方法不能被重寫(xiě)
因?yàn)楦割?lèi)私有方法根本就無(wú)法繼承
2.子類(lèi)重寫(xiě)父類(lèi)方法時(shí),訪問(wèn)權(quán)限不能更低
最好是一致
3.父類(lèi)靜態(tài)方法,子類(lèi)也必須通過(guò)靜態(tài)方法進(jìn)行重寫(xiě)
其實(shí)這個(gè)算不上方法重寫(xiě),但是現(xiàn)象確實(shí)如此
子類(lèi)重寫(xiě)父類(lèi)方法的時(shí)候,最好聲明是一模一樣的
方法重寫(xiě)和方法重載的區(qū)別?方法重載能改變返回值類(lèi)型嗎?
方法重寫(xiě):
在子類(lèi)中,出現(xiàn)和父類(lèi)中一模一樣的方法聲明的現(xiàn)象
方法重載:
同一個(gè)類(lèi)中,出現(xiàn)的方法名相同,參數(shù)列表不同的現(xiàn)象
方法重載能改變返回值類(lèi)型,因?yàn)樗头祷刂殿?lèi)型無(wú)關(guān)
override:方法重寫(xiě)
overload:方法重載
由于繼承中方法有一個(gè)現(xiàn)象:方法重寫(xiě)
所以,父類(lèi)的功能,就會(huì)被子類(lèi)給覆蓋
有些時(shí)候,我們不想讓子類(lèi)去覆蓋父類(lèi)的功能,
這個(gè)時(shí)候,針對(duì)這種情況,java就提供了一個(gè)關(guān)鍵字:final
final:最終的意思。常見(jiàn)的是它可以修飾類(lèi),方法,變量
特點(diǎn):
final可以修飾類(lèi),該類(lèi)不能被繼承
final可以修飾方法,該方法不能被重寫(xiě)
final可以修飾變量,該變了不能被重新賦值,因?yàn)檫@個(gè)變量其實(shí)是常量
常量:1.字面值常量 “hello”,10,true
2.自定義常量
final int x = 10;
注意,權(quán)限修飾符public,private等修飾局部變量是沒(méi)有意義的,
因?yàn)榫植糠椒ū旧砭褪欠庋b的,談不上要不要訪問(wèn)。
面試題:final修飾局部變量的問(wèn)題
基本類(lèi)型;基本類(lèi)型的值不能發(fā)生改變
引用類(lèi)型:引用類(lèi)型的地址值不能發(fā)生改變,
但是,該對(duì)象的堆內(nèi)存的值是可以改變的
多態(tài):同一個(gè)對(duì)象,在不同時(shí)刻體現(xiàn)出來(lái)的不同狀態(tài)
多態(tài)的前提:
1.要有繼承關(guān)系
2.要有方法重寫(xiě)
3.要有父類(lèi)引用指向子類(lèi)對(duì)象
父 f = new 子();
多態(tài)中的成員訪問(wèn)特點(diǎn):
1.成員變量
編譯看左邊,運(yùn)行看左邊
2.成員方法
編譯看左邊,運(yùn)行看右邊
3.構(gòu)造方法
創(chuàng)建子類(lèi)對(duì)象的時(shí)候,訪問(wèn)父類(lèi)的構(gòu)造方法,對(duì)對(duì)象的數(shù)據(jù)進(jìn)行初始化
4.靜態(tài)方法
編譯看左邊,運(yùn)行看左邊
靜態(tài)和類(lèi)相關(guān),算不上重寫(xiě),所以,訪問(wèn)還是左邊的
由于成員方法存在方法重寫(xiě),所以它運(yùn)行看右邊
多態(tài)的好處:
1.提高了代碼的維護(hù)性(繼承保證)
2.提高了代碼的擴(kuò)展性(多態(tài)保證)
多態(tài)的弊端:
不能使用子類(lèi)的特有功能(因?yàn)樵谡{(diào)用成員方法的時(shí)候,編譯要看左邊,一旦調(diào)用子類(lèi)的特有功能,在父類(lèi)中沒(méi)有,就會(huì)編譯失敗)
但是我就是想使用子類(lèi)的特有功能,行不行?
行
怎么用呢?
1.創(chuàng)建子類(lèi)對(duì)象調(diào)用方法即可(可以,但是意味著要?jiǎng)?chuàng)建新的對(duì)象,浪費(fèi)內(nèi)存)
2.把父類(lèi)的引用強(qiáng)制轉(zhuǎn)換為子類(lèi)的引用(向下轉(zhuǎn)型)
對(duì)象間的轉(zhuǎn)型問(wèn)題:
向上轉(zhuǎn)型:
Fu f = new Zi();
向下轉(zhuǎn)型
Zi z = (Zi)f();//要求該f必須是能夠轉(zhuǎn)換為Zi的
?
抽象類(lèi)的概述:
動(dòng)物不應(yīng)該定義為具體的東西,而且動(dòng)物中的吃,睡等也不應(yīng)該是具體的
我們把一個(gè)不是具體的功能稱(chēng)為抽象功能,而一個(gè)類(lèi)中如果有抽象功能,該類(lèi)必須是抽象類(lèi)
抽象類(lèi)的特點(diǎn);;
1, 抽象類(lèi)和抽象方法必須用abstract關(guān)鍵字修飾
2.抽象類(lèi)中不一定有抽象方法,但是有抽象方法的類(lèi)一定是抽象類(lèi)
3。抽象類(lèi)不能實(shí)例化,因?yàn)樗皇蔷唧w的
抽象類(lèi)有構(gòu)造方法,但是不能實(shí)例化,那么構(gòu)造方法的作用是什么呢?
用于子類(lèi)訪問(wèn)父類(lèi)數(shù)據(jù)的初始化
4.抽象類(lèi)的子類(lèi)
1.如果不想重寫(xiě)抽象方法,那么該子類(lèi)也必須是一個(gè)抽象類(lèi)
2.如果重寫(xiě)了所有的抽象方法,這個(gè)時(shí)候子類(lèi)是一個(gè)具體的類(lèi)
抽象類(lèi)的實(shí)例化其實(shí)是靠具體額子類(lèi)實(shí)現(xiàn)的,也就是多態(tài)
Animal a = new Cat();
抽象類(lèi)成員的特點(diǎn)
成員變量:既可以是變量,也可以是常量
構(gòu)造方法:有,用于子類(lèi)訪問(wèn)父類(lèi)數(shù)據(jù)的初始化
成員方法:既可以是抽象的,也可以是非抽象的
抽象類(lèi)成員方法的特性:
1.抽象方法 強(qiáng)制性要求子類(lèi)做的事情
2.非抽象方法 子類(lèi)繼承的事情,提高了代碼的復(fù)用性
一個(gè)類(lèi)如果沒(méi)有抽象方法,可不可以定義為抽象類(lèi),如果可以,有什么意義?
答,可以,作用就是不讓創(chuàng)建對(duì)象唄
abstract不能和哪些關(guān)鍵字共存?
private,沖突,因?yàn)槟慵恿藀rivate,子類(lèi)怎么繼承啊,都沒(méi)有權(quán)限,而定義抽象類(lèi),就是要子類(lèi)去實(shí)現(xiàn)的
final 就是終止,都終止了抽象干嗎呀,誰(shuí)能實(shí)現(xiàn)的了啊
static用static修飾的方法可以用類(lèi)名去調(diào)用,可定義抽象類(lèi),抽象方法都沒(méi)具體實(shí)現(xiàn),你用類(lèi)名去調(diào)用有什么意義啊
?
接口的特點(diǎn):
1.接口用關(guān)鍵字interface表示
interface 接口名
2.類(lèi)實(shí)現(xiàn)接口用implements 接口名{}
class 類(lèi)名 implements 接口名{}
3.接口不能實(shí)例化
那么,接口如何實(shí)例化呢?
按照多態(tài)的方式來(lái)實(shí)例化
4.接口的子類(lèi)
可以是抽象類(lèi),但是意義不大。
可以是具體類(lèi),要重寫(xiě)接口中的所有的抽象方法
由此可見(jiàn):
1.具體類(lèi)多態(tài)(幾乎沒(méi)有為了講課需要)
2.抽象類(lèi)多態(tài)(常用)
3.接口多態(tài)(最常用)
接口成員特點(diǎn):
成員變量:只能是常量,并且是靜態(tài)的
默認(rèn)修飾符:public static final
建議:自己手動(dòng)給出
構(gòu)造方法:接口沒(méi)有構(gòu)造方法,因?yàn)榻涌谥饕菙U(kuò)展功能的,而沒(méi)有具體存在
成員方法:只能是抽象方法
默認(rèn)修飾符:public abstract
建議:自己手動(dòng)給出
所有的類(lèi)都默認(rèn)繼承一個(gè)類(lèi):Object
類(lèi)Object是類(lèi)層次結(jié)構(gòu)的根類(lèi),每個(gè)類(lèi)都使用Object作為超類(lèi)
類(lèi)與類(lèi):
繼承關(guān)系,只能是單繼承,可以多層繼承
類(lèi)與接口:
實(shí)現(xiàn)關(guān)系,可以單實(shí)現(xiàn),也可以多實(shí)現(xiàn)
接口與接口:
繼承關(guān)系,可以單繼承,也可以多繼承
抽象類(lèi)與接口的區(qū)別:
1.成員區(qū)別
抽象類(lèi):
成員變量:可以是變量,也可以是常量
構(gòu)造方法:有
成員方法:可以抽象,也可以非抽象
接口:
成員變量:只能是常量
構(gòu)造方法:壓根沒(méi)有好吧
成員方法:只可以是抽象的
2.關(guān)系區(qū)別
類(lèi)與類(lèi)
繼承,單繼承
類(lèi)與接口
實(shí)現(xiàn),單實(shí)現(xiàn),多實(shí)現(xiàn)
接口與接口
繼承,單繼承,多繼承
3.設(shè)計(jì)理念區(qū)別
抽象類(lèi)
被繼承體現(xiàn)的是:“is a”的關(guān)系
抽象類(lèi)中定義的是該繼承體系的共性功能
接口
被實(shí)現(xiàn)體現(xiàn)的是:"like a"的關(guān)系,
接口中定義的是該繼承體系的擴(kuò)展功能
形式參數(shù):
基本類(lèi)型(這個(gè)直接使用就可以)
引用類(lèi)型:
類(lèi)名:需要的是該類(lèi)的對(duì)象
抽象類(lèi):需要的是該抽象類(lèi)的子類(lèi)對(duì)象
接口:需要的是該接口的實(shí)現(xiàn)類(lèi)的對(duì)象
?
包:
1.其實(shí)就是文件夾
2.作用
1.把相同的類(lèi)名放到不同的包中
2.對(duì)類(lèi)進(jìn)行分類(lèi)管理
包的定義:
pack 包名;
多級(jí)包用.分開(kāi)即可
例如:package.cn.itcast;
注意事項(xiàng):
1.package語(yǔ)句必須是程序的第一條可執(zhí)行的代碼
2.package語(yǔ)句自一個(gè)java文件夾中只能有一個(gè)
3.如果沒(méi)有package,默認(rèn)表示無(wú)名包
帶包的編譯和運(yùn)行
1.手動(dòng)式
1.編寫(xiě)一個(gè)帶包的java文件
2.通過(guò)javac命令編譯該java文件
3.手動(dòng)創(chuàng)建包名(去創(chuàng)建文件夾)
4.把b步驟的class文件放到c步驟的最底層包
5.回到和包根目錄在同一目錄的地方,然后(帶包)運(yùn)行
2.自動(dòng)式
1.編寫(xiě)一個(gè)帶包的java文件
2.javac編譯的時(shí)候帶上-d即可
javac -d .helloworld.java
3.回到和包根目錄在同一目錄的地方,然后(帶包)運(yùn)行
?
導(dǎo)包概述
不同包下的類(lèi)之間的訪問(wèn),我們發(fā)現(xiàn),每次是使用不同包下的類(lèi)的時(shí)候,都需要加包的路徑,比較麻煩,這個(gè)時(shí)候,java就提供了導(dǎo)包的功能
修飾符:
權(quán)限修飾符:private,默認(rèn),protected,public
狀態(tài)修飾符:static,final
抽象修飾符:abstract
類(lèi):
權(quán)限修飾符:默認(rèn)修飾符,public
狀態(tài)修飾符:final
抽象修飾符:abstract
用的最多的是:public
成員變量:
權(quán)限修飾符:private,默認(rèn)的,protected,public
狀態(tài)修飾符:static,final
用的最多的就是:private
構(gòu)造方法
權(quán)限修飾符:private,默認(rèn)的,protected,public
用的最多的是public
成員方法
權(quán)限修飾符:private,默認(rèn)的,protected,public
狀態(tài)修飾符:static,final
抽象修飾符:abstract
用的最多的是:public
內(nèi)部類(lèi)概述:
把類(lèi)定義在其他類(lèi)的內(nèi)部,這個(gè)類(lèi)就被稱(chēng)為內(nèi)部類(lèi)
舉例;在A類(lèi)中定義了一個(gè)類(lèi)B,類(lèi)B就是內(nèi)部類(lèi)
內(nèi)部類(lèi)的訪問(wèn)特點(diǎn):
1.內(nèi)部類(lèi)可以直接訪問(wèn)外部類(lèi)的成員,包括私有
2.外部類(lèi)要訪問(wèn)內(nèi)部類(lèi)的成員,必須創(chuàng)建對(duì)象
內(nèi)部類(lèi)的分類(lèi):
成員內(nèi)部類(lèi)
局部?jī)?nèi)部類(lèi)
成員內(nèi)部類(lèi):
如何直接訪問(wèn)內(nèi)部類(lèi)的成員
外部類(lèi)名.內(nèi)部類(lèi)名 對(duì)象名 = 外部類(lèi).內(nèi)部類(lèi)對(duì)象
Outer.Inner oi = new Outer().new Inner();
成員內(nèi)部類(lèi)的修飾符:
private 為了保證數(shù)據(jù)的安全性
static 為了方便訪問(wèn)數(shù)據(jù)
注意:靜態(tài)內(nèi)部類(lèi)訪問(wèn)的外部類(lèi)數(shù)據(jù)必須用靜態(tài)修飾,因?yàn)殪o態(tài)只能訪問(wèn)靜態(tài)
內(nèi)部類(lèi)可以用靜態(tài)修飾,是因?yàn)閮?nèi)部類(lèi)可以看出是外部類(lèi)的成員
成員內(nèi)部類(lèi)被靜態(tài)修飾后的訪問(wèn)方式是:
外部類(lèi)名.內(nèi)部類(lèi)名. 對(duì)象名 = new 外部類(lèi)名.內(nèi)部類(lèi)名();
Outer.Inner oi = new Outer.Inner();
oi.show();
或者可以使用另外一種調(diào)用方法
Outer.Inner.show();
為什么加了static就要用類(lèi)名呢,不是之前的對(duì)象呢,你都靜態(tài)了。創(chuàng)造個(gè)什么對(duì)象啊
面試題:
class Outer{
public int num = 10;
class Inner{
public int num = 20;
public void show(){
int num = 30;
System.out.println(num);
System.out.println(this.num);
System.out.println(new Outer().num);
或者是 System.out.println(Outer.this.num);
}
}
}
注意事項(xiàng):
1.內(nèi)部類(lèi)和外部類(lèi)沒(méi)有繼承關(guān)系
2.通過(guò)外部類(lèi)名限定this對(duì)象
局部?jī)?nèi)部類(lèi):
1.可以直接訪問(wèn)外部類(lèi)的成員
2.在局部位置,可以創(chuàng)建內(nèi)部類(lèi)對(duì)象,通過(guò)對(duì)象調(diào)用內(nèi)部類(lèi)方法,來(lái)使用局部?jī)?nèi)部類(lèi)的功能
注意事項(xiàng):局部?jī)?nèi)部類(lèi)訪問(wèn)局部變量必須用final,為什么呢?
因?yàn)榫植孔兞渴请S著方法的調(diào)用而調(diào)用,隨著調(diào)用完畢而消失
而堆內(nèi)存的內(nèi)容并不會(huì)立即消失,所以,我們加final修飾,加final后,這個(gè)變量就成了常量,既然是常量,你消失了,我在內(nèi)存中存儲(chǔ)的就是數(shù)據(jù)20,所以還有數(shù)據(jù)使用
匿名內(nèi)部類(lèi)
就是內(nèi)部類(lèi)的簡(jiǎn)化寫(xiě)法
前提:存在一個(gè)類(lèi)或者接口
這里的類(lèi)可以是具體類(lèi),也可以是抽象類(lèi)
格式:
new 類(lèi)名或者接口名(){
重寫(xiě)方法;
}
匿名內(nèi)部類(lèi)的本質(zhì)是什么呢?
是一個(gè)繼承類(lèi)或者實(shí)現(xiàn)了該接口的子類(lèi)匿名對(duì)象
//用法一
interface Inter{
public abstract void show();
}
class Outer{
public void methoh(){
new Inter(){
pubic void show(){
System.out.println("show");
}
}.show();//第一種方法,這樣直接調(diào)用
}
}
class InnerClassDemo{
public static void main(String [] args){
Outer o = new Outer();
o.method();
}
}
//用法二
interface Inter{
public abstract void show();
}
class Outer{
public void methoh(){
Inter i = new Inter(){ //第二種采用多態(tài)
pubic void show(){
System.out.println("show");
}
}.show();
}
i.show();//利用多態(tài)調(diào)用
}
class InnerClassDemo{
public static void main(String [] args){
Outer o = new Outer();
o.method();
}
}
?
轉(zhuǎn)載于:https://www.cnblogs.com/Deleting/p/5068633.html
總結(jié)
- 上一篇: Spring 注解配置
- 下一篇: PHP $_REQUEST获取表单提交的