湖南住房和城鄉(xiāng)建設(shè)廳網(wǎng)站首頁(yè)優(yōu)化網(wǎng)站怎么真實(shí)點(diǎn)擊
目錄
- 類的定義和使用
- 類的定義格式
- 類的實(shí)例化
- 類和對(duì)象的說明
- this引用
- this引用的特性
- 對(duì)象的構(gòu)造及初始化
- 就地初始化
- 構(gòu)造方法
- 封裝
- 包
- 導(dǎo)入包中的類
- 自定義包
- static成員
- static修飾成員變量
- static修飾成員方法
- 代碼塊
- 代碼塊概念及分類
- 構(gòu)造代碼塊
- 靜態(tài)代碼塊
- 匿名對(duì)象
類的定義和使用
類的定義格式
// 創(chuàng)建類
class ClassName{ field; // 字段(屬性) 或者 成員變量method; // 行為 或者 成員方法
}
class為定義類的關(guān)鍵字,ClassName為類的名字,{}中為類的主體。
class future {public int time;public void decreaseTime() {}
}
類名注意采用大駝峰定義
成員前寫法統(tǒng)一為public
此處寫的方法不帶 static 關(guān)鍵字
注意事項(xiàng):
1. 一般一個(gè)文件當(dāng)中只定義一個(gè)類,方便后期維護(hù)
2. main方法所在的類一般要使用public修飾(注意:Eclipse默認(rèn)會(huì)在public修飾的類中找main方法)
class future {public int _time;public static void main(String[] args) {System.out.println("1");}public void decreaseTime() {}
}
此處的類未被public修飾,依舊可以使用main方法
3. public修飾的類必須要和文件名相同
4. 不要輕易去修改public修飾的類的名稱
類的實(shí)例化
用類類型創(chuàng)建對(duì)象的過程,稱為類的實(shí)例化,在java中采用new關(guān)鍵字,配合類名來實(shí)例化對(duì)象。
public static void main(String[] args) {future date1 = new future();future date2 = new future();}
(地址隨便給的)
當(dāng)你創(chuàng)建一個(gè)類的實(shí)例時(shí),實(shí)際上是在內(nèi)存中分配了一塊空間來存儲(chǔ)這個(gè)實(shí)例,并返回一個(gè)指向該內(nèi)存空間的引用。這個(gè)引用指示了對(duì)象在內(nèi)存中的位置,而不是對(duì)象本身的內(nèi)容。通過這個(gè)引用,你可以訪問和操作對(duì)象的屬性和方法。
new 關(guān)鍵字用于創(chuàng)建一個(gè)對(duì)象的實(shí)例.
使用 . 來訪問對(duì)象中的屬性和方法.
同一個(gè)類可以創(chuàng)建多個(gè)實(shí)例.
類和對(duì)象的說明
類只是一種模板.類似于建筑圖紙,實(shí)例化就是把圖紙建造成高樓大廈
類是一種自定義類型,類可以實(shí)例化出多個(gè)對(duì)象,類似圖紙可以修建很多大廈,實(shí)例化的對(duì)象占用實(shí)際的物理空間,存儲(chǔ)成員變量,此處是普通成員變量,類的實(shí)例化會(huì)分配內(nèi)存空間來存儲(chǔ)對(duì)象的實(shí)例變量,并提供指向方法的引用,但靜態(tài)成員變量和靜態(tài)方法不會(huì)在實(shí)例化過程中分配新的空間
this引用
public class test {public static void main(String[] args) {stu a = new stu();stu b = new stu();a.InitStu(1,"ab",1);b.InitStu(2,"cd" ,2);}
}
class stu {public int age;public String name;public int index;public void InitStu(int age, String name, int index) {}
}
方法在類中是通過引用存在的,一個(gè)類創(chuàng)建的不同對(duì)象在調(diào)用同一個(gè)方法,而方法如何區(qū)分不同對(duì)象?
有寶子就很奇怪地會(huì)指出
調(diào)用函數(shù)之前不是會(huì)有對(duì)象嗎,這里還要再次重申一遍,方法在類中是以引用的形式存在的,方法不像成員變量,方法進(jìn)行的是一種重復(fù)操作,沒必要每次實(shí)例化對(duì)象還要額外開辟空間,只需要開辟一次,之后調(diào)用之時(shí)去調(diào)用引用來進(jìn)行方法調(diào)用,那么對(duì)于同一個(gè)方法,編譯器該如何區(qū)分呢?這里就要提到this引用了
對(duì)象a和b都有自己的引用,在函數(shù)調(diào)用時(shí),系統(tǒng)會(huì)默認(rèn)把this引用一起傳給方法.方法被調(diào)用時(shí),this關(guān)鍵字將會(huì)引用調(diào)用該方法的對(duì)象,即a或b,來區(qū)分不同對(duì)象。
class stu {public int age;public String name;public int index;public void InitStu(int age, String name, int index) {age = age;name = name;index = index;}
}
對(duì)stu類里的InitStu方法進(jìn)行如上操作,但是由于局部變量?jī)?yōu)先的原則,方法內(nèi)的變量不會(huì)優(yōu)先識(shí)別方法之外的變量,而是優(yōu)先方法內(nèi)的局部變量,方法內(nèi)找不到才會(huì)到類中尋找,如上代碼可以得出,方法里修改的是形參,未對(duì)類里的成員變量進(jìn)行修改
如果要對(duì)成語(yǔ)變量進(jìn)行修改,使用this引用來指明,如下
this引用的特性
1. this的類型:對(duì)應(yīng)類類型引用,即哪個(gè)對(duì)象調(diào)用就是哪個(gè)對(duì)象的引用類型
2. this只能在"成員方法"中使用
3. 在"成員方法"中,this只能引用當(dāng)前對(duì)象,不能再引用其他對(duì)象
4. this是“成員方法”第一個(gè)隱藏的參數(shù),編譯器會(huì)自動(dòng)傳遞,在成員方法執(zhí)行時(shí),編譯器會(huì)負(fù)責(zé)將調(diào)用成員方法,對(duì)象的引用傳遞給該成員方法,this負(fù)責(zé)來接收
對(duì)象的構(gòu)造及初始化
public static void main(String[] args) {int a;System.out.println(a);}
局部變量未初始化,打印會(huì)報(bào)錯(cuò),但是如果是成員變量則不一樣,成員變量未初始化在進(jìn)行打印時(shí)不會(huì)報(bào)錯(cuò),因?yàn)轭惖膶?duì)象在申請(qǐng)空間之后依舊設(shè)置好了初始化值,如下
數(shù)據(jù)類型 默認(rèn)值
byte 0
char ‘\u0000’
short 0
int 0
long 0L
boolean false
float 0.0f
double 0.0
reference null
stu a = new stu();System.out.println(a.index);System.out.println(a.age);System.out.println(a.name);
就地初始化
在聲明成員變量時(shí),就直接給出了初始值
class stu {public int age = 1;public String name = null;public int index = 1;public void InitStu(int age, String name, int index) {this.age = age;this.name = name;this.index = index;}
}
構(gòu)造方法
構(gòu)造方法(也稱為構(gòu)造器)是一個(gè)特殊的成員方法,名字必須與類名相同,在創(chuàng)建對(duì)象時(shí),由編譯器自動(dòng)調(diào)用,并且在整個(gè)對(duì)象的生命周期內(nèi)只調(diào)用一次
對(duì)象的產(chǎn)生一是需要為對(duì)象分配內(nèi)存,二是調(diào)用合適的構(gòu)造方法,而剛才類里沒有構(gòu)造方法為什么對(duì)象會(huì)產(chǎn)生,那是因?yàn)橄到y(tǒng)在發(fā)現(xiàn)類里沒有構(gòu)造方法的情況下會(huì)自動(dòng)生成一個(gè)構(gòu)造方法,如下
public class Animal {/*public Animal() {}系統(tǒng)默認(rèn)生成這樣的構(gòu)造函數(shù)來進(jìn)行調(diào)用*/String name;int age;}
但是在你依舊有構(gòu)造方法的時(shí)候,系統(tǒng)就不會(huì)生成默認(rèn)構(gòu)造方法,防止沖突,如下代碼就會(huì)報(bào)錯(cuò),因?yàn)椴粫?huì)生成默認(rèn)構(gòu)造方法
class Animal {public Animal(String name, int age) {this.age = age;this.name = name;}public String name;public int age;
}public class test {public static void main(String[] args) {Animal pig = new Animal();System.out.println(pig.age);System.out.println(pig.name);}
}
你還可以在你定義的構(gòu)造方法調(diào)用另一個(gè)自己的構(gòu)造方法
class Animal {public Animal(String name, int age) {this.age = age;this.name = name;}public Animal() {this("pig",1);}public String name;public int age;
}
但是需要注意在public Animal() 中this(“pig”,1)只能當(dāng)?shù)谝粭l語(yǔ)句,后面可以添加其他語(yǔ)句
不能成環(huán)
public Animal(String name, int age) {this();}public Animal() {this("pig",1);}
遞歸套娃的感覺,反正成環(huán)就噠嘜
封裝
面向?qū)ο蟪绦蛉筇匦?#xff1a;封裝、繼承、多態(tài)
public class things {
//這里把成員變量給密封在類里,外界無法訪問private String name;private int year;private String color;public things() {}public things(String name, int year, String color) {this.name = name;this.year = year;this.color = color;}public void show() {System.out.println(this.color);System.out.println(this.year);System.out.println(this.name);}
}
public class test02 {public static void main(String[] args) {things book = new things("book",1,"red");book.show();}
}
封裝:將數(shù)據(jù)和操作數(shù)據(jù)的方法進(jìn)行有機(jī)結(jié)合,隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外公開接口來和對(duì)象進(jìn)行 交互
注意:這里的接口包括方法,也包括之后學(xué)的接口
包
在面向?qū)ο篌w系中,提出了一個(gè)軟件包的概念,即:為了更好的管理類,把多個(gè)類收集在一起成為一組,稱為軟件包。
包是對(duì)類,接口等的封裝機(jī)制的體現(xiàn),是一種對(duì)類或者接口等的很好的組織方式
在同一工程允許存在相同名稱的類,只要處在不同的包中即可
導(dǎo)入包中的類
可以使用java.util.Arrays導(dǎo)入java.util包中的Arrays類
public static void main(String[] args) {int[] arr = {1,2,3};System.out.println(java.util.Arrays.toString(arr));}
這樣的寫法比較麻煩,可以使用import語(yǔ)句導(dǎo)入包
import java.util.Arrays;
public class test03 {public static void main(String[] args) {int[] arr = {1,2,3};System.out.println(Arrays.toString(arr));}
}
導(dǎo)入包時(shí)也可以使用import java.util.;.;
*是通配符,表示所有的意思,就是導(dǎo)入ijava.util所有的類
建議使用顯式的指定要導(dǎo)入的類名,否則會(huì)出現(xiàn)沖突
使用import static導(dǎo)入包中靜態(tài)的方法和字段
靜態(tài)方法
public static void main(String[] args) {int[] arr = {2,33,3};sort(arr);//可以直接寫方法for (int x:arr) {System.out.println(x+" ");}}
自定義包
基本規(guī)則
- 在文件的最上方加一個(gè)package語(yǔ)句指定該代碼在哪個(gè)包中
- 包名需要盡量指定成唯一的名字,通常會(huì)用公司的域名顛倒形式
- 包名要和代碼路徑相匹配
- 如果一個(gè)類沒有package語(yǔ)句,則該類被放到一個(gè)默認(rèn)包
(子類要等到后面再展開)
先提一下default,他就是不加任何訪問限定符的狀態(tài)
上圖創(chuàng)建一個(gè)A包,包里有B和C包,B包里有testB類,C包里有testC類
public class testC {int tem;//不加訪問修飾限定符public int tem1;
}
在另一個(gè)包B里實(shí)例化testC這個(gè)類,對(duì)象名叫a,上圖可以看出我們可以訪問tem1,但是default也就是不加訪問限定符的情況下,無法訪問tem這個(gè)變量
static成員
public class person {public int time;public String name;
}
定義person這個(gè)類,變量time對(duì)于每個(gè)person都一樣的(前提),但是如果你每次實(shí)例化一個(gè)對(duì)象都要開辟空間給變量time,本來一個(gè)就夠了,但是你每次都要開辟空間,就會(huì)造成空間浪費(fèi)
如果time屬性對(duì)于所有的person對(duì)象都是相同的,那么將其設(shè)置為static是合適的。這樣,這個(gè)屬性就不會(huì)與每個(gè)person對(duì)象實(shí)例關(guān)聯(lián),而是與類本身關(guān)聯(lián)。這樣,無論創(chuàng)建多少個(gè)person對(duì)象,都只會(huì)有一個(gè)time屬性,所有對(duì)象都會(huì)共享這個(gè)屬性
public class person {public static int time;public String name;
}
static修飾成員變量
靜態(tài)成員變量在方法區(qū)中存儲(chǔ) ,被static修飾的只能是成員變量,不能是局部變量
static修飾的成員變量,稱為靜態(tài)成員變量,靜態(tài)成員變量最大的特性:不屬于某個(gè)具體的對(duì)象,是所有對(duì)象所共享的
- 不屬于某個(gè)具體的對(duì)象,是類的屬性,所有對(duì)象共享的,不存儲(chǔ)在某個(gè)對(duì)象的空間中
- 既可以通過對(duì)象訪問,也可以通過類名訪問,但一般更推薦使用類名訪問
- 類變量存儲(chǔ)在方法區(qū)當(dāng)中
- 生命周期伴隨類的一生(即:隨類的加載而創(chuàng)建,隨類的卸載而銷毀)
static修飾成員方法
Java中,被static修飾的成員方法稱為靜態(tài)成員方法,是類的方法,不是某個(gè)對(duì)象所特有的。靜態(tài)成員一般是通過靜態(tài)方法來訪問的。
【靜態(tài)方法特性】
- 不屬于某個(gè)具體的對(duì)象,是類方法
- 可以通過對(duì)象調(diào)用,也可以通過類名.靜態(tài)方法名(…)方式調(diào)用,更推薦使用后者
- 不能在靜態(tài)方法中訪問任何非靜態(tài)成員變量
- 靜態(tài)方法中不能調(diào)用任何非靜態(tài)方法,因?yàn)榉庆o態(tài)方法有this參數(shù),在靜態(tài)方法中調(diào)用時(shí)候無法傳遞this引用
代碼塊
代碼塊概念及分類
使用{}定義一段代碼稱為代碼段.根據(jù)代碼塊定義的位置以及關(guān)鍵字,又可分為以下四種
- 普通代碼塊(少見)
- 構(gòu)造塊
- 靜態(tài)塊
- 同步代碼塊(期待后續(xù))
構(gòu)造代碼塊
構(gòu)造塊:定義在類中的代碼塊(不加修飾符)。也叫:實(shí)例代碼塊。構(gòu)造代碼塊一般用于初始化實(shí)例成員變量。
靜態(tài)代碼塊
使用static定義的代碼塊稱為靜態(tài)代碼塊。一般用于初始化靜態(tài)成員變量
注意事項(xiàng)
靜態(tài)代碼塊不管生成多少個(gè)對(duì)象,其只會(huì)執(zhí)行一次
靜態(tài)成員變量是類的屬性,因此是在JVM加載類時(shí)開辟空間并初始化的
如果一個(gè)類中包含多個(gè)靜態(tài)代碼塊,在編譯代碼時(shí),編譯器會(huì)按照定義的先后次序依次執(zhí)行(合并)
實(shí)例代碼塊只有在創(chuàng)建對(duì)象時(shí)才會(huì)執(zhí)行
public class test {public static void main(String[] args) {person tem1 = new person();System.out.println("================");person tem2 = new person();}
}
class person {public static int time;public String name;person() {System.out.println("構(gòu)造方法");person.time = 1;this.name = "張三";}public void show() {System.out.println(this.name);System.out.println(person.time);}//靜態(tài)代碼塊static {System.out.println("靜態(tài)代碼塊");}//構(gòu)造代碼塊{System.out.println("構(gòu)造代碼塊");}
}
匿名對(duì)象
舉個(gè)栗子:
public class test {public static void main(String[] args) {String tem;System.out.println(tem);}
}
思維有些混淆的寶子會(huì)說不是有默認(rèn)值嗎,我們?cè)僬f一下,是類里的成員變量在未初始化的時(shí)候會(huì)有默認(rèn)值,tem是局部變量,需要初始化
類里的成員變量:
當(dāng)你在類中聲明一個(gè)變量,這個(gè)變量是類的成員變量。如果這些變量沒有被初始化,它們會(huì)有默認(rèn)值。例如,對(duì)于引用類型(如String),默認(rèn)值是null。對(duì)于數(shù)值類型,默認(rèn)值是相應(yīng)的默認(rèn)值(例如,int的默認(rèn)值是0)。
局部變量:
局部變量是在方法內(nèi)部聲明的變量。它們只在方法的作用域內(nèi)存在,并且沒有默認(rèn)值。在聲明之后必須顯式地初始化它們,否則編譯器會(huì)報(bào)錯(cuò)。
public class test {String tem;public static void main(String[] args) {System.out.println(tem);//依舊報(bào)錯(cuò)}
}
有寶子又要說:這也不行啊,上面的代碼main方法被static修飾,是個(gè)類方法,他的調(diào)用不依賴于對(duì)象,但是tem這個(gè)成員變量屬于類,不能直接調(diào)用,因?yàn)殪o態(tài)的里面不能訪問非靜態(tài)的,如果你非要調(diào)用就給一個(gè)對(duì)象即可
public class test {String tem;public static void main(String[] args) {test a = new test();System.out.println(a.tem);}
}
public class test {String tem;public static void main(String[] args) {System.out.println(new test().tem);//匿名對(duì)象的方式}
}
匿名對(duì)象的缺點(diǎn):
只能使用一次,不能重復(fù)使用