修飾符的分類
- 1求厕、訪問(wèn)修飾符
- 2、非訪問(wèn)修飾符
一扰楼、訪問(wèn)修飾符
1呀癣、默認(rèn)的,也稱為 default弦赖,在同一包內(nèi)可見项栏,不使用任何修飾符。
2蹬竖、共有的沼沈,以 public 修飾符指定,對(duì)所有類可見案腺。
3庆冕、私有的康吵,以 private 修飾符指定劈榨,在同一類內(nèi)可見。
4晦嵌、受保護(hù)的同辣,以 protected 修飾符指定,對(duì)同一包內(nèi)的類和所有子類可見惭载。
default:默認(rèn)的
1.默認(rèn)訪問(wèn)修飾符聲明的變量和方法旱函,對(duì)同一個(gè)包內(nèi)的類是可見的。
2.接口里的變量都隱式聲明為 public static final描滔。
3.而接口里的方法默認(rèn)情況下訪問(wèn)權(quán)限為 public棒妨。
public:公共的
1.被聲明為 public 的類、方法含长、構(gòu)造方法和接口能夠被任何其他類訪問(wèn)券腔。
2.相互訪問(wèn)的 public 類分布在不同的包中伏穆,則需要導(dǎo)入相應(yīng) public 類所在的包。
3.由于類的繼承性纷纫,public類所有的公有方法和變量都能被其子類繼承枕扫。
private:私有的
1.類和接口不能聲明為private;
2.Private訪問(wèn)修飾符的使用主要用來(lái)隱藏類的實(shí)現(xiàn)細(xì)節(jié)和保護(hù)類的數(shù)據(jù)辱魁;
3.通過(guò)this. variable來(lái)訪問(wèn)烟瞧。
protected:受保護(hù)的
1.protected 訪問(wèn)修飾符不能修飾類和接口;
2.方法和成員變量能夠聲明為 protected;
3.接口的成員變量和成員方法不能聲明為 protected;
4.如果我們只想讓該方法對(duì)其所在類的子類可見,則將該方法聲明為 protected染簇。
例如:
class AudioPlayer {//父類
protected boolean openSpeaker(Speaker sp) {
// 實(shí)現(xiàn)細(xì)節(jié)
}
}
class StreamingAudioPlayer extends AudioPlayer {//子類
protected boolean openSpeaker(Speaker sp) {
// 實(shí)現(xiàn)細(xì)節(jié)
}
}
如果把 openSpeaker() 方法聲明為 private参滴,那么除了 AudioPlayer 之外的類將不能訪問(wèn)該方法。
如果把 openSpeaker() 聲明為 public剖笙,那么所有的類都能夠訪問(wèn)該方法卵洗。
如果我們只想讓該方法對(duì)其所在類的子類可見,則將該方法聲明為 protected弥咪。
修飾符 | 當(dāng)前類 | 同包內(nèi) | 子孫類 | 其他包 |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
default | Y | Y | N | N |
private | Y | N | N | N |
訪問(wèn)控制和繼承:
父類中聲明為 public 的方法在子類中也必須為 public过蹂。
父類中聲明為 protected 的方法在子類中要么聲明為 protected,要么聲明為 public聚至,不能聲明為 private酷勺。
父類中聲明為 private 的方法,不能夠被繼承扳躬。
整個(gè)世界都打包成一塊脆诉,同時(shí)劃分為四個(gè)層次:
聯(lián)合國(guó)(public)【其他包】、國(guó)家(protected)【繼承子孫】贷币、洲際(default)【同一包】击胜、個(gè)人(private)【當(dāng)前類】。
聯(lián)合國(guó)制定規(guī)則所有人都可以用役纹,國(guó)家制定的只有在國(guó)家內(nèi)可以用偶摔,各聯(lián)邦洲因地制宜有制定當(dāng)?shù)孛穹ǎ瑐€(gè)人制定的就給個(gè)人使用促脉。
二辰斋、非訪問(wèn)修飾符
- 1、static 修飾符瘸味,用來(lái)創(chuàng)建類方法和類變量宫仗。
- 2、final 修飾符旁仿,用來(lái)修飾類藕夫、方法和變量。
- 3、abstract 修飾符毅贮,用來(lái)創(chuàng)建抽象類和抽象方法梭姓。
- 4、synchronized 和 volatile 修飾符嫩码,主要用于線程的編程誉尖。
static修飾符
1.無(wú)論一個(gè)類實(shí)例化多少對(duì)象,它的靜態(tài)變量只有一份拷貝;
2.局部變量不能被聲明為 static 變量铸题。
3.static方法是類方法铡恕,是可以直接用類名調(diào)用的,類似于Objective-C中的+ (void)....;
4.在類方法中不能使用this丢间,原因很簡(jiǎn)單探熔,就像OC當(dāng)中的self。類方法是可以直接用類名來(lái)調(diào)用的烘挫,該過(guò)程總不存在對(duì)象诀艰,因此是沒(méi)有該類的實(shí)例化對(duì)象的,所以不存在self饮六。
final修飾符
1.修飾的類不能夠被繼承其垄。
2.修飾的方法可以被子類繼承,但是不能被子類修改卤橄;
3.修飾的變量為常量绿满,是不可修改的。
abstract抽象類
1.抽象類不能用來(lái)實(shí)例化對(duì)象窟扑,聲明抽象類的唯一目的是為了將來(lái)對(duì)該類進(jìn)行擴(kuò)充喇颁;
2.一個(gè)類不能同時(shí)被 abstract 和 final 修飾;
3.抽象類中不一定包含抽象方法嚎货,但是包含抽象方法的類一定要被聲明為抽象類橘霎。
4.抽象類提供了繼承的概念,它的出發(fā)點(diǎn)就是為了繼承殖属,否則它沒(méi)有存在的任何意義姐叁。所以說(shuō)定義的抽象類一定是用來(lái)繼承的,同時(shí)在一個(gè)以抽象類為節(jié)點(diǎn)的繼承關(guān)系等級(jí)鏈中忱辅,葉子節(jié)點(diǎn)一定是具體的實(shí)現(xiàn)類七蜘。
例如:
public abstract class Animal { //抽象類
public abstract void cry();
}
public class Cat extends Animal{ //子類繼承抽象類
public void cry() {
System.out.println("貓叫:喵喵...");
}
}
5.抽象的意義:創(chuàng)建抽象類和抽象方法非常有用,他們可以使類的抽象性明確起來(lái),并告訴用戶和編譯器打算怎樣使用他們.抽象類還是有用的重構(gòu)器,因?yàn)樗鼈兪刮覀兛梢院苋菀椎貙⒐卜椒ㄑ刂^承層次結(jié)構(gòu)向上移動(dòng)谭溉。
其他修飾符
synchronized:synchronized 關(guān)鍵字聲明的方法同一時(shí)間只能被一個(gè)線程訪問(wèn)墙懂,可以應(yīng)用于四個(gè)訪問(wèn)修飾符。
transient:transient修飾的實(shí)例變量扮念,不會(huì)被持久化损搬,就像在iOS中使用NSUserdefault功能的時(shí)候,被修飾的實(shí)例變量不會(huì)被持久記錄。
volatile:修飾的成員變量在每次被線程訪問(wèn)時(shí)巧勤,都強(qiáng)制從共享內(nèi)存中重新讀取該成員變量的值嵌灰。而且,當(dāng)成員變量發(fā)生變化時(shí)颅悉,會(huì)強(qiáng)制線程將變化值回寫到共享內(nèi)存沽瞭。這樣在任何時(shí)刻,兩個(gè)不同的線程總是看到某個(gè)成員變量的同一個(gè)值剩瓶。(保證了變量作用的即時(shí)性驹溃。)
超綱內(nèi)容 “接口”
1.接口也是抽象的,但接口不是類延曙,接口是用來(lái)建立類與類之間的協(xié)議豌鹤,它所提供的只是一種形式,而沒(méi)有具體的實(shí)現(xiàn)枝缔。
2.接口是抽象類的延伸布疙,java為了保證數(shù)據(jù)安全是不能多重繼承的,也就是說(shuō)繼承只能存在一個(gè)父類愿卸,但是接口不同灵临,一個(gè)類可以同時(shí)實(shí)現(xiàn)多個(gè)接口,不管這些接口之間有沒(méi)有關(guān)系趴荸,所以接口彌補(bǔ)了抽象類不能多重繼承的缺陷俱诸,但是推薦繼承和接口共同使用,因?yàn)檫@樣既可以保證數(shù)據(jù)安全性又可以實(shí)現(xiàn)多重繼承赊舶。
超綱內(nèi)容“native修飾符”
1.java 中的 native 修飾符表示被修飾的方法由本地語(yǔ)言實(shí)現(xiàn)睁搭。
2.有時(shí)java應(yīng)用需要與java外面的環(huán)境交互。這是本地方法存在的主要原因笼平,你可以想想java需要與一些底層系統(tǒng)如操作系統(tǒng)或某些硬件交換信息時(shí)的情況园骆。
3.JVM支持著java語(yǔ)言本身和運(yùn)行時(shí)庫(kù),它是java程序賴以生存的平臺(tái)寓调,通過(guò)使用本地方法锌唾,我們得以用java實(shí)現(xiàn)了jre的與底層系統(tǒng)的交互,甚至JVM的一些部分就是用C寫的夺英,還有晌涕,如果我們要使用一些java語(yǔ)言本身沒(méi)有提供封裝的操作系統(tǒng)的特性時(shí),我們也需要使用本地方法痛悯。
ps:instanceof 運(yùn)算符用于判斷某個(gè)對(duì)象是不是某個(gè)類余黎,是則返回ture。