一盏袄、類和對(duì)象的定義及關(guān)系
1、類是同一類別對(duì)象的抽象定義葱她;可以理解為是某一類具體對(duì)象的模子撩扒,確定對(duì)象將會(huì)擁有的特性,包括該類對(duì)象具備的屬性和方法吨些。
2搓谆、對(duì)象是對(duì)類的一種具體化的客觀存在,是對(duì)類的具體實(shí)例化豪墅。要?jiǎng)?chuàng)建一個(gè)對(duì)象泉手,必須基于類,即先要?jiǎng)?chuàng)建可描述該對(duì)象的類偶器。
3斩萌、創(chuàng)建一個(gè)類
publicclass Telphone {
//屬性(成員變量):有什么
float screen;
float cpu;
float mem;
//方法 :干什么
void call(){
System.out.println("Telphone有打電話的功能!");
}
void sendMessage(){
System.out.println("Telphone有發(fā)短信的功能屏轰!");
}
}
4颊郎、創(chuàng)建一個(gè)對(duì)象 針對(duì)上面代碼創(chuàng)建類的創(chuàng)建對(duì)象方法
Telphone myphone=new Telphone();
小編相信這里有很多學(xué)習(xí)java的朋友,小編整理了一份java方面的學(xué)習(xí)資料霎苗,想要獲取的可以加我的java學(xué)習(xí)群的喲袭艺,928204055。歡迎愛學(xué)習(xí)Java的你們叨粘。
5猾编、對(duì)象的比較:
有兩種方法,分別為“==”運(yùn)算符和equals()方法升敲,但兩者有本質(zhì)的區(qū)別: (1)“==”運(yùn)算符比較的是兩個(gè)對(duì)象引用的地址是否相同答倡;
(2)equals()方法比較的是兩個(gè)對(duì)象引用所指的內(nèi)容是否相同
publicclass ClassCompare {
publicstaticvoid main(String[] args) {
String c1=new String("abc");
String c2=new String("abc");
String c3=c1;
System.out.println("c2==c3的運(yùn)算結(jié)果為: "+(c2==c3));
System.out.println("c2.equals(c3)的運(yùn)算結(jié)果為: "+(c2.equals(c3)));
}
}
/*首先為c1分配一塊內(nèi)存區(qū)域存儲(chǔ)字符串a(chǎn)bc,并將c1指向設(shè)為該內(nèi)存區(qū)域
*然后同樣為c2分配另外一塊內(nèi)存區(qū)域存儲(chǔ)字符串a(chǎn)bc驴党,并將c2指向設(shè)為該內(nèi)存區(qū)域
*最后把c3的引用指向c1的指向
*/
6瘪撇、類的使用 同樣針對(duì)上面創(chuàng)建的Telphone類:
publicclass InitialTelphone {
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
Telphone phone=new Telphone();
phone.sendMessage();
//這里各實(shí)例屬性值在未初始化賦值的時(shí)候默認(rèn)為0
phone.screen=5.0f;
phone.cpu=1.4f;
phone.mem=2.0f;10 phone.sendMessage();
//賦值后的顯示
}
}
二、成員變量和局部變量
1港庄、成員變量:在類中定義倔既,用于描述對(duì)象的屬性裁厅;成員變量可以被本類的方法使用扒秸,也可以被其他類的方法使用(依據(jù)該成員變量定義時(shí)的修飾詞)理卑。
2日戈、局部變量:在類的方法中定義,在方法中臨時(shí)保存數(shù)據(jù)疮装。局部變量只能在當(dāng)前方法中使用赊抖。
3全谤、區(qū)別:局部變量的作用域僅限于定義的方法內(nèi)部;成員變量的作用域在整個(gè)類內(nèi)部都是可見的安皱。Java中會(huì)給成員變量賦初始值调鬓,但不會(huì)給局部變量默認(rèn)賦初值,所以局部變量在使用前必須要賦值酌伊,否則會(huì)報(bào)錯(cuò)腾窝。
4、同一個(gè)方法中不能用同名的局部變量居砖;在不同的方法中虹脯,可以有同名局部變量。如果局部變量和成員變量同名悯蝉,在定義該局部變量的方法內(nèi)部局部變量有更高的優(yōu)先級(jí)归形。
publicclass Telphone {
float screen;
float cpu;
float mem;
int var;
void call(){
int localVar=10;
System.out.println(var);
//可以調(diào)用類的成員變量var托慨,默認(rèn)值為0
System.out.println("Telphone有打電話的功能鼻由!");
}
void sendMessage(){
System.out.println(localVar);
//調(diào)用call()方法中的局部變量會(huì)報(bào)錯(cuò)
System.out.println("Telphone有發(fā)短信的功能!");
}
}
三厚棵、類的構(gòu)造方法 1蕉世、構(gòu)造方法是定義在Java類中的一個(gè)用來初始化對(duì)象的方法。構(gòu)造方法與類同名婆硬,并且沒有返回值狠轻。
2、如果類定義中沒有設(shè)置無參數(shù)的構(gòu)造方法彬犯,則系統(tǒng)會(huì)自動(dòng)生成向楼。
//設(shè)置無參數(shù)的構(gòu)造方法
publicclass Telphone {
int sc=10; //定義成員變量
public Telphone(){
System.out.println("無參的構(gòu)造方法執(zhí)行了");
}
}
publicclass InitialTelphone {
publicstaticvoid main(String[] args) {
Telphone phone=new Telphone();
//可以看到構(gòu)造方法執(zhí)行了
System.out.println(phone.sc);
//可以看到輸出了成員變量sc的值為10
//當(dāng)沒有設(shè)置無參構(gòu)造方法時(shí),默認(rèn)的無參構(gòu)造方法會(huì)使對(duì)象擁有成員變量這個(gè)實(shí)例屬性
//當(dāng)定義了無參構(gòu)造方法時(shí)谐区,即便沒有顯式的定義成員變量的賦值湖蜕,對(duì)象也會(huì)擁有成員變量對(duì)應(yīng)的實(shí)例屬性
}
}
3、有參數(shù)的構(gòu)造方法通常只有一個(gè)目的:即給成員變量賦初值宋列。
publicclass Telphone {
float screen;
float cpu;
float mem;
public Telphone(){
System.out.println("無參的構(gòu)造方法執(zhí)行了");
}
//有參構(gòu)造方法與無參構(gòu)造方法同名
public Telphone(float screen,float cpu,float mem){
screen=screen;
cpu=cpu;
mem=mem;
System.out.println("有參的構(gòu)造方法執(zhí)行了");
}
}
publicclass InitialTelphone {
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
Telphone phone=new Telphone();
Telphone phone1=new Telphone(5.2f,1.4f,2.0f);
}
}
4昭抒、當(dāng)類中定義了構(gòu)造方法(不管是有參還是無參)時(shí),系統(tǒng)都不會(huì)再默認(rèn)生成無參的構(gòu)造方法炼杖。
5灭返、構(gòu)造方法的重載:方法名相同,但參數(shù)不同的多個(gè)構(gòu)造方法坤邪,調(diào)用時(shí)候會(huì)自動(dòng)判斷熙含、根據(jù)不同的參數(shù)組合選擇對(duì)應(yīng)的構(gòu)造方法。如上面代碼中無參和有參的構(gòu)造方法為同名艇纺,都可以使用婆芦。
6怕磨、構(gòu)造方法中一般可以添加保證賦值合理的功能。
publicclass Telphone {
float screen;
float cpu;
float mem;
public Telphone(){
System.out.println("無參的構(gòu)造方法執(zhí)行了");
}
public Telphone(float screen,float cpu,float mem){
if(screen<3.5){
System.out.println("賦值不合理消约,已自動(dòng)賦值screen為3.5");
screen=3.5f;
}else{
screen=screen;
}
cpu=cpu;
mem=mem;
System.out.println("有參的構(gòu)造方法執(zhí)行了");
}
}
四肠鲫、靜態(tài)變量和靜態(tài)方法
1、靜態(tài)變量:當(dāng)同一個(gè)類的兩個(gè)或者多個(gè)對(duì)象需要在同一個(gè)內(nèi)存區(qū)域共享一個(gè)數(shù)據(jù)時(shí)或粮,可以通過定義類的靜態(tài)變量來實(shí)現(xiàn)导饲。由static修飾的成員變量即是靜態(tài)變量。
靜態(tài)變量可以通過類名.靜態(tài)變量名氯材,也可以通過實(shí)例對(duì)象名.靜態(tài)變量名來訪問渣锦,但因?yàn)槭峭活愃袑?shí)例對(duì)象的共享,所以一般采用類名.靜態(tài)變量名的方式進(jìn)行訪問氢哮。
2袋毙、靜態(tài)方法:對(duì)于方法的靜態(tài)修飾,與上述靜態(tài)變量規(guī)則一致冗尤。需要注意:
(1)靜態(tài)方法可以直接調(diào)用同一個(gè)類中的靜態(tài)成員(包括靜態(tài)變量和靜態(tài)方法)听盖,但不能直接調(diào)用非靜態(tài)成員。如果要調(diào)用一個(gè)類中的非靜態(tài)成員裂七,則必須先實(shí)例化對(duì)象皆看,通過實(shí)例對(duì)項(xiàng)目名.非靜態(tài)成員來調(diào)用。
(2)與靜態(tài)成員方法不一樣的是在普通成員方法中可以直接訪問同類的非靜態(tài)和靜態(tài)變量背零。
publicclass HelloWorld {
String name="imook";
static String hobby="java";
publicvoid show(){
System.out.println(name); //普通成員方法中可以使用非靜態(tài)成員
System.out.println(hobby); //也可以使用靜態(tài)成員
}
publicstaticvoid main(String[] args) {
System.out.println(name); //錯(cuò)誤腰吟!靜態(tài)方法main中不能使用類中的非靜態(tài)成員
System.out.println(HelloWolrd.name); //錯(cuò)誤同上
System.out.println(hobby);
//靜態(tài)方法中可以直接調(diào)用靜態(tài)成員
System.out.println(HelloWorld.hobby);
//也可以通過類名.靜態(tài)成員名進(jìn)行調(diào)用 HelloWorld myHelloWorld=new HelloWorld();
//創(chuàng)建一個(gè)實(shí)例對(duì)象
System.out.println(myHelloWorld.name);
//可以通過實(shí)例對(duì)象名.非靜態(tài)成員名進(jìn)行調(diào)用
System.out.println(myHelloWorld.hobby);
//也可以通過實(shí)例對(duì)象名.靜態(tài)成員名進(jìn)行調(diào)用(但不推薦)
HelloWorld.show(); //錯(cuò)誤!靜態(tài)方法main中不能使用類中的非靜態(tài)成員
show(); //錯(cuò)誤同上!
myHelloWorld.show(); }}
3徙瓶、通過 static 靜態(tài)初始化塊:靜態(tài)初始化塊只在類加載時(shí)執(zhí)行毛雇,且只執(zhí)行一次,并且靜態(tài)初始化塊只能給靜態(tài)變量賦值侦镇,不能給普通成員變量賦值灵疮。
publicclass HelloWorld {
int num1;
int num2;
staticint num3;
public HelloWorld(){
num1=11;
System.out.println("通過構(gòu)造方法給num1賦初值!");
}
{//通過普通初始化塊給num2賦初值
num2=222;
System.out.println("通過構(gòu)造方法給num2賦初值虽缕!");
}
static{ //通過靜態(tài)初始化塊給靜態(tài)變量num3賦初值
num3=3333;
System.out.println("通過構(gòu)造方法給num3賦初值始藕!");
}
publicstaticvoid main(String[] args) {
HelloWorld hello=new HelloWorld(); //構(gòu)造方法創(chuàng)建類的實(shí)例對(duì)象hello
/*
* 本次使用構(gòu)造方法時(shí),程序第一次加載HelloWorld類氮趋,會(huì)先執(zhí)行靜態(tài)初始化塊伍派,對(duì)應(yīng)給num3賦值3333,并輸出"通過構(gòu)造方法給num3賦初值剩胁!"
* 再執(zhí)行普通初始化塊诉植,對(duì)應(yīng)給num2賦值222并輸出"通過構(gòu)造方法給num2賦初值!"
* 最后才執(zhí)行構(gòu)造方法昵观,對(duì)應(yīng)給num1賦值11并輸出"通過構(gòu)造方法給num1賦初值晾腔!"
*/
System.out.println("hello的num1:"+hello.num1); //普通成員通過實(shí)例對(duì)象名訪問
System.out.println("hello的num2:"+hello.num2);
System.out.println("hello的num3:"+num3); //靜態(tài)成員直接訪問
HelloWorld hello2=new HelloWorld(); //構(gòu)造方法創(chuàng)建類的實(shí)例對(duì)象hello2
/*因靜態(tài)初始化塊只在加載時(shí)執(zhí)行一次舌稀,所以這次創(chuàng)建對(duì)象時(shí)不執(zhí)行靜態(tài)初始化塊
* 這里不執(zhí)行也是可以理解的,因?yàn)闃?gòu)造方法本身不包括靜態(tài)初始化塊灼擂,自然不會(huì)執(zhí)行
* 前次創(chuàng)建hello對(duì)象時(shí)并不是因?yàn)闃?gòu)造方法而去執(zhí)行靜態(tài)初始化塊壁查,而是加載類的時(shí)候執(zhí)行
*/
}
}
五、訪問修飾符和this關(guān)鍵字
1剔应、訪問修飾符包括 private\protected\public睡腿;其中private范圍對(duì)應(yīng)為本類;protected 范圍對(duì)應(yīng)本類峻贮、子類和同包席怪;public范圍為本類、子類纤控、同包及其他包挂捻。
如果沒有使用訪問修飾符,則默認(rèn)的訪問范圍是本類和同包船万。
2刻撒、this關(guān)鍵字用于引用對(duì)象,實(shí)質(zhì)上是對(duì)一個(gè)對(duì)象的引用唬涧。有些情況下可以省略this 關(guān)鍵字疫赎,如下例代碼:
privatevoid setName(String name){
this.name=name; //這里可以省略this盛撑,寫成name=name;
}
在當(dāng)需要返回一個(gè)類的對(duì)象時(shí)則必須顯式的使用this關(guān)鍵字:
/*創(chuàng)建一個(gè)返回類型為Book類的方法 *方法名為getBook */使用this引用對(duì)象將Book類的對(duì)象返回public Book getBook(){ return this; }
六碎节、實(shí)例
//漢諾塔
publicclass HanoiTower {
publicstaticint moveTimes=0;//設(shè)置全類下的靜態(tài)變量,計(jì)步器
publicstaticvoid moveDish(int num,char a,char b,char c){
if(num==1){
System.out.println("Move dish from "+a+" to "+c);
moveTimes++;
}else{
moveDish(num-1,a,c,b);
//先把num-1個(gè)盤子從a通過c放到b;這里不涉及具體的移動(dòng)抵卫,而是調(diào)用方法狮荔,所以計(jì)步器不加
System.out.println("Move dish from "+a+" to "+c);
//然后再把a(bǔ)上剩余的最后一個(gè)移動(dòng)到c,這里涉及到具體的移動(dòng)步驟,所以計(jì)步器加1
moveTimes++;
moveDish(num-1,b,a,c);
//最后解決b上的num-1個(gè)盤子介粘,通過a再移動(dòng)到c
}
}
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
int numTimes=12;
moveDish(numTimes,'A','B','C');
System.out.println("總共移動(dòng)了"+moveTimes+"次殖氏!");
}
}