正文之前
今天總算是把那個(gè)黨員談話給弄完了豹缀,三個(gè)學(xué)弟輪番跟我來(lái)聊天,講自己的入黨動(dòng)機(jī)啥的慨代,看到他們就仿佛看到了大一的自己邢笙,原來(lái)當(dāng)時(shí)面對(duì)學(xué)長(zhǎng),面對(duì)這類事情侍匙,會(huì)緊張氮惯,會(huì)局促,被學(xué)長(zhǎng)安慰了但是還是繃著的樣子想暗。哇咔咔妇汗,一晃眼啊,號(hào)稱是人生中最令人迷醉的那段時(shí)間就快沒(méi)了说莫,研究生的時(shí)候可能就沒(méi)這么寫意的事情了杨箭。感傷~ 不如看Java,對(duì)了储狭,我要推薦國(guó)漫--《一人之下》互婿,很好看捣郊,很有趣,各路方言看著滿滿的土氣擒悬,但這才是國(guó)漫嗎模她。稻艰。雖然有的地方有點(diǎn)少兒不宜懂牧,但是真的很好看啊,簡(jiǎn)直把我想象中的小說(shuō)結(jié)合現(xiàn)代漫畫風(fēng)格搬上了B棧尊勿,太好看了僧凤!
(鄭重聲明:本文非原創(chuàng),只是筆記澎语,取自菜鳥編程途事!好東西,繼續(xù)打CALL)
正文
========復(fù)習(xí)========
類:類是一個(gè)模板擅羞,它描述一類對(duì)象的行為和狀態(tài)尸变。
方法:方法就是行為,一個(gè)類可以有很多方法减俏。邏輯運(yùn)算召烂、數(shù)據(jù)修改以及所有動(dòng)作都是在方法中完成的。
子類:利用繼承的方法娃承,可以重用已存在類的方法和屬性奏夫,而不用重寫這些代碼。被繼承的類稱為超類(super class)历筝,派生類稱為子類(subclass)酗昼。
接口:在Java中,接口可理解為對(duì)象間相互通信的協(xié)議梳猪。接口在繼承中扮演著很重要的角色仔雷。接口只定義派生要用到的方法,但是方法的具體實(shí)現(xiàn)完全取決于派生類舔示。
========復(fù)習(xí)========
1碟婆、 Java 修飾符
Java語(yǔ)言提供了很多修飾符,主要分為以下兩類:
- 訪問(wèn)修飾符
- 非訪問(wèn)修飾符
修飾符用來(lái)定義類惕稻、方法或者變量竖共,通常放在語(yǔ)句的最前端。
public class className {
// ...
}
private boolean myFlag;
static final double weeks = 9.5;
protected static final int BOXWIDTH = 42;
public static void main(String[] arguments) {
// 方法體
}
2俺祠、 訪問(wèn)控制修飾符
Java中公给,可以使用訪問(wèn)控制符來(lái)保護(hù)對(duì)類借帘、變量、方法和構(gòu)造方法的訪問(wèn)淌铐。Javav支持 4 種不同的訪問(wèn)權(quán)限肺然。
default (即缺省,什么也不寫): 在同一包內(nèi)可見(jiàn)腿准,不使用任何修飾符际起。使用對(duì)象:類、接口吐葱、變量街望、方法。
private : 在同一類內(nèi)可見(jiàn)弟跑。使用對(duì)象:變量灾前、方法。 注意:不能修飾類(外部類)
*public : 對(duì)所有類可見(jiàn)孟辑。使用對(duì)象:類哎甲、接口、變量饲嗽、方法
*protected : 對(duì)同一包內(nèi)的類和所有子類可見(jiàn)炭玫。使用對(duì)象:變量、方法喝噪。 注意:不能修飾類(外部類)础嫡。
我們可以可以通過(guò)以下表來(lái)說(shuō)明訪問(wèn)權(quán)限:
修飾符 | 當(dāng)前類 | 同一包內(nèi) | 子孫類 | 其他包 |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
default | Y | Y | N | N |
private | Y | N | N | N |
3、 默認(rèn)訪問(wèn)修飾符-不使用任何關(guān)鍵字
使用默認(rèn)訪問(wèn)修飾符聲明的變量和方法酝惧,對(duì)同一個(gè)包內(nèi)的類是可見(jiàn)的榴鼎。接口里的變量都隱式聲明為 public static final,而接口里的方法默認(rèn)情況下訪問(wèn)權(quán)限為 public。
String version = "1.5.1";
boolean processOrder() {
return true;
}
4晚唇、 私有訪問(wèn)修飾符-private
私有訪問(wèn)修飾符是最嚴(yán)格的訪問(wèn)級(jí)別巫财,所以被聲明為 private 的方法、變量和構(gòu)造方法只能被所屬類訪問(wèn)哩陕,并且類和接口不能聲明為 private平项。
聲明為私有訪問(wèn)類型的變量只能通過(guò)類中公共的 getter 方法被外部類訪問(wèn)。Private 訪問(wèn)修飾符的使用主要用來(lái)隱藏類的實(shí)現(xiàn)細(xì)節(jié)和保護(hù)類的數(shù)據(jù)悍及。
public class Logger {
private String format;
public String getFormat() {
return this.format;
}
public void setFormat(String format) {
this.format = format;
}
}
5闽瓢、 公有訪問(wèn)修飾符-public
- 被聲明為 public 的類、方法心赶、構(gòu)造方法和接口能夠被任何其他類訪問(wèn)扣讼。
- 如果幾個(gè)相互訪問(wèn)的 public 類分布在不同的包中,則需要導(dǎo)入相應(yīng) public 類所在的包缨叫。由于類的繼承性椭符,類所有的公有方法和變量都能被其子類繼承荔燎。
public static void main(String[] arguments) {
// ...
}
Java 程序的 main() 方法必須設(shè)置成公有的,否則销钝,Java 解釋器將不能運(yùn)行該類有咨。
6、 受保護(hù)的訪問(wèn)修飾符-protected
被聲明為 protected 的變量蒸健、方法和構(gòu)造器能被同一個(gè)包中的任何其他類訪問(wèn)座享,也能夠被不同包中的子類訪問(wèn)。
protected 訪問(wèn)修飾符不能修飾類和接口纵装,方法和成員變量能夠聲明為 protected征讲,但是接口的成員變量和成員方法不能聲明為 protected据某。
子類能訪問(wèn) protected 修飾符聲明的方法和變量橡娄,這樣就能保護(hù)不相關(guān)的類使用這些方法和變量。
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é)
}
}
7癣籽、 訪問(wèn)控制和繼承
請(qǐng)注意以下方法繼承的規(guī)則(就是子類中的東西必須必父類更加開放挽唉,等同于人類的開放程度逐級(jí)遞增的概念,當(dāng)然筷狼,老爸私有的東西粱腻,兒子是沒(méi)法繼承的):
父類中聲明為 public 的方法在子類中也必須為 public荣挨。
父類中聲明為 protected 的方法在子類中要么聲明為 protected,要么聲明為 public,不能聲明為 private嗅虏。
父類中聲明為 private 的方法,不能夠被繼承仇轻。
8水由、 非訪問(wèn)修飾符
為了實(shí)現(xiàn)一些其他的功能,Java 也提供了許多非訪問(wèn)修飾符竖独。
- static 修飾符裤唠,用來(lái)修飾類方法和類變量。
- final 修飾符莹痢,用來(lái)修飾類种蘸、方法和變量,final 修飾的類不能夠被繼承竞膳,修飾的方法不能被繼承類重新定義航瞭,修飾的變量為常量,是不可修改的坦辟。
- abstract 修飾符刊侯,用來(lái)創(chuàng)建抽象類和抽象方法。
- synchronized 和 volatile 修飾符长窄,主要用于線程的編程滔吠。
9纲菌、 static 修飾符
靜態(tài)變量:static 關(guān)鍵字用來(lái)聲明獨(dú)立于對(duì)象的靜態(tài)變量,無(wú)論一個(gè)類實(shí)例化多少對(duì)象疮绷,它的靜態(tài)變量只有一份拷貝翰舌。 靜態(tài)變量也被稱為類變量。局部變量不能被聲明為 static 變量冬骚。
靜態(tài)方法:static 關(guān)鍵字用來(lái)聲明獨(dú)立于對(duì)象的靜態(tài)方法椅贱。靜態(tài)方法不能使用類的非靜態(tài)變量。靜態(tài)方法從參數(shù)列表得到數(shù)據(jù)只冻,然后計(jì)算這些數(shù)據(jù)庇麦。
public class InstanceCounter
{
private static int numInstances = 0;
protected static int getCount()
{
return numInstances;
}
private static void addInstance()
{
numInstances++;
}
InstanceCounter()
{
this.addInstance();
}
public static void main(String[] arguments)
{
System.out.println("Starting with " + InstanceCounter.getCount() + " instances");
for (int i = 0; i < 500; ++i)
{
new InstanceCounter();
}
System.out.println("Created " + InstanceCounter.getCount() + " instances");
}
}
Started with 0 instances
Created 500 instances
10、 final 修飾符(不就是const一樣的喜德?只是沒(méi)有指針?biāo)詻](méi)那么復(fù)雜而已)
* final 變量
final 變量能被顯式地初始化并且只能初始化一次山橄。被聲明為final 的對(duì)象的引用不能指向不同的對(duì)象。但是 final 對(duì)象里的數(shù)據(jù)可以被改變舍悯。也就是說(shuō) final 對(duì)象的引用不能改變航棱,但是里面的值可以改變。final 修飾符通常和 static 修飾符一起使用來(lái)創(chuàng)建類常量萌衬。
public class Test{
final int value = 10;
// 下面是聲明常量的實(shí)例
public static final int BOXWIDTH = 6;
static final String TITLE = "Manager";
public void changeValue(){
value = 12; //將輸出一個(gè)錯(cuò)誤
}
}
* final 方法
類中的 final 方法可以被子類繼承饮醇,但是不能被子類修改。聲明 final 方法的主要目的是防止該方法的內(nèi)容被修改秕豫。
public class Test{
public final void changeName(){
// 方法體
}
}
* final 類
final 類不能被繼承朴艰,沒(méi)有類能夠繼承 final 類的任何特性。
11混移、 abstract 修飾符
- 抽象類(為了去掉虛函數(shù)祠墅,真是辛苦Java了):
抽象類不能用來(lái)實(shí)例化對(duì)象,聲明抽象類的唯一目的是為了將來(lái)對(duì)該類進(jìn)行擴(kuò)充沫屡。一個(gè)類不能同時(shí)被 abstract 和 final 修飾饵隙。如果一個(gè)類包含抽象方法,那么該類一定要聲明為--抽象類--沮脖,否則將出現(xiàn)編譯錯(cuò)誤金矛。**抽象類可以包含抽象方法和非抽象方法
abstract class Caravan{
private double price;
private String model;
private String year;
public abstract void goFast(); //抽象方法
public abstract void changeColor();
}
-
抽象方法(類似于C++的虛函數(shù)吧)
- 抽象方法是一種沒(méi)有任何實(shí)現(xiàn)的方法,該方法的的具體實(shí)現(xiàn)由子類提供勺届。
抽象方法不能被聲明成 final 和 static驶俊。 - 任何繼承抽象類的子類必須實(shí)現(xiàn)父類的所有抽象方法,除非該子類也是抽象類免姿。
- 如果一個(gè)類包含若干個(gè)抽象方法饼酿,那么該類必須聲明為抽象類。抽象類可以不包含抽象方法。
- 抽象方法的聲明以分號(hào)結(jié)尾故俐,例如:public abstract sample();
- 抽象方法是一種沒(méi)有任何實(shí)現(xiàn)的方法,該方法的的具體實(shí)現(xiàn)由子類提供勺届。
public abstract class SuperClass{
abstract void m(); //抽象方法
}
class SubClass extends SuperClass{
//實(shí)現(xiàn)抽象方法
void m(){
.........
}
}
12想鹰、 synchronized 修飾符(簡(jiǎn)單點(diǎn)說(shuō)就是上鎖?)
synchronized 關(guān)鍵字聲明的方法同一時(shí)間只能被一個(gè)線程訪問(wèn)药版。synchronized 修飾符可以應(yīng)用于四個(gè)訪問(wèn)修飾符
13辑舷、 transient 修飾符(不大懂~)
- 序列化的對(duì)象包含被 transient 修飾的實(shí)例變量時(shí),java 虛擬機(jī)(JVM)跳過(guò)該特定的變量槽片。
- 該修飾符包含在定義變量的語(yǔ)句中何缓,用來(lái)預(yù)處理類和變量的數(shù)據(jù)類型。
14还栓、 volatile 修飾符
volatile 修飾的成員變量在每次被線程訪問(wèn)時(shí)碌廓,都強(qiáng)制從共享內(nèi)存中重新讀取該成員變量的值。而且剩盒,當(dāng)成員變量發(fā)生變化時(shí)谷婆,會(huì)強(qiáng)制線程將變化值回寫到共享內(nèi)存。這樣在任何時(shí)刻勃刨,兩個(gè)不同的線程總是看到某個(gè)成員變量的同一個(gè)值波材。一個(gè) volatile 對(duì)象引用可能是 null股淡。
public class MyRunnable implements Runnable
{
private volatile boolean active;
public void run()
{
active = true;
while (active) // 第一行
{
// 代碼
}
}
public void stop()
{
active = false; // 第二行
}
}
通常情況下身隐,在一個(gè)線程調(diào)用 run() 方法(在 Runnable 開啟的線程),在另一個(gè)線程調(diào)用 stop() 方法唯灵。 如果"第一行"中緩沖區(qū)的 active 值被使用贾铝,那么在"第二行" 的 active 值為 false 時(shí)循環(huán)不會(huì)停止。但是以上代碼中我們使用了 volatile 修飾 active埠帕,所以該循環(huán)會(huì)停止垢揩。
15、 總結(jié)
JAVA 的類(外部類)有 2 種訪問(wèn)權(quán)限: public敛瓷、default叁巨。
-
方法和變量有 4 種:public、default呐籽、protected锋勺、private。
(PS:其中默認(rèn)訪問(wèn)權(quán)限和 protected 很相似狡蝶,有著細(xì)微的差別庶橱。)- public 意味著任何地方的其他類都能訪問(wèn)。
- default 則是同一個(gè)包的類可以訪問(wèn)贪惹。
- protected 表示同一個(gè)包的類可以訪問(wèn)苏章,其他的包的該類的子類也可以訪問(wèn)。
- private 表示只有自己類能訪問(wèn)。
-
修飾符:abstract枫绅、static泉孩、final
- abstract: 表示是抽象類。 使用對(duì)象:類并淋、接口棵譬、方法
- static: 可以當(dāng)做普通類使用,而不用先實(shí)例化一個(gè)外部類预伺。(用他修飾后订咸,就成了靜態(tài)內(nèi)部類了)。 使用對(duì)象:類酬诀、變量脏嚷、方法、初始化函數(shù)(注意:修飾類時(shí)只能修飾 內(nèi)部類 )
- final: 表示類不可以被繼承瞒御。 使用對(duì)象:類父叙、變量、方法
正文之后
總體來(lái)說(shuō)肴裙,Java的兩類修飾符趾唱,一類訪問(wèn)控制符,側(cè)重于對(duì)訪問(wèn)權(quán)限的控制蜻懦,規(guī)定在哪兒可以訪問(wèn)我修飾的這個(gè)東西甜癞;而非訪問(wèn)控制符的話,更多就是側(cè)重于修飾功能宛乃,是對(duì)于變量或者方法的一種補(bǔ)充悠咱,比如static就規(guī)定了不論類有多少對(duì)象,只有這么一個(gè)變量公用征炼。這就是性質(zhì)的變化析既,而不是訪問(wèn)權(quán)限的變化。所以還是很好理解的W话隆眼坏!