Java架构-JavaSE(一)之类与对象
閱讀目錄(Content)
一、OOP概述
二、類與對(duì)象和對(duì)象與引用的關(guān)系
??2.1、類與對(duì)象的關(guān)系
三、方法的定義和調(diào)用
??3.1、方法的定義 ??3.2、方法調(diào)用
四、調(diào)用方法時(shí)的傳參
五、this關(guān)鍵字
六、創(chuàng)建與初始化對(duì)象
七、構(gòu)造器
終于到了要學(xué)習(xí)面向?qū)ο蟪绦蛟O(shè)計(jì)了,其中可能很多東西以前都知道怎么去用,但是卻不知道怎么來的,或者怎么樣寫會(huì)出錯(cuò),所以今天總結(jié)起來。
一、OOP概述
Java的編程語言是面向?qū)ο蟮?#xff0c;采用這種語言進(jìn)行編程稱為面向?qū)ο缶幊?Object-Oriented Programming, OOP)。
1)抽象(abstract) 忽略一個(gè)主題中與當(dāng)前目標(biāo)無關(guān)的那些方面,以便更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面。抽象并不打算了解全部問題,而只是選擇其中的一部分,暫時(shí)不用關(guān)注細(xì)節(jié)。 例如:要設(shè)計(jì)一個(gè)學(xué)生成績管理系統(tǒng),那么對(duì)于學(xué)生,只關(guān)心他的班級(jí)、學(xué)號(hào)、成績等,而不用去關(guān)心他的身高、體重這些信息
2)封裝(Encapsulation) 封裝是面向?qū)ο蟮奶卣髦?#xff0c;是對(duì)象和類概念的主要特性。封裝是把過程和數(shù)據(jù)包圍起來,對(duì)數(shù)據(jù)的訪問只能通過指定的方式。
在定義一個(gè)對(duì)象的特性的時(shí)候,有必要決定這些特性的可見性,即哪些特性對(duì)外部是可見的,哪些特性用于表示內(nèi)部狀態(tài)。通常,應(yīng)禁止直接訪問一個(gè)對(duì)象中數(shù)據(jù)的實(shí)際表示,而應(yīng)通過操作接口來訪問,這稱為信息隱藏。信息隱藏是用戶對(duì)封裝性的認(rèn)識(shí),封裝則為信息隱藏提供支持。封裝保證了模塊具有較好的獨(dú)立性,使得程序維護(hù)修改較為容易。對(duì)應(yīng)用程序的修改僅限于類的內(nèi)部,因而可以將應(yīng)用程序修改帶來的影響減少到最低限度。 復(fù)制代碼3)繼承(inheritance)
繼承是一種聯(lián)結(jié)類的層次模型,并且允許和支持類的重用,它提供了一種明確表述共性的方法。新類繼承了原始類后,新類就繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類(子類)可以從它的基類(父類)那里繼承方法和實(shí)例變量,并且派生類(子類)中可以修改或增加新的方法使之更適合特殊的需要繼承性很好的解決了軟件的可重用性問題。比如說,所有的Windows應(yīng)用程序都有一個(gè)窗口,它們可以看作都是從一個(gè)窗口類派生出來的。但是有的應(yīng)用程序用于文字處理,有的應(yīng)用程序用于繪圖,這是由于派生出了不同的子類,各個(gè)子類添加了不同的特性。 復(fù)制代碼4)多態(tài)(polymorphism)
多態(tài)性是指允許不同類的對(duì)象對(duì)同一消息作出響應(yīng)。 多態(tài)性語言具有靈活、抽象、行為共享、代碼共享的優(yōu)勢(shì),很好的解決了應(yīng)用程序函數(shù)同名問題。相同類域的不同對(duì)象,調(diào)用相同方法,表現(xiàn)出不同的結(jié)果 例如:public class Person{public void say(){}}public class Student extends Person{public void say(){System.out.println("I am a student");}}public class Teacher extends Person{public void say(){System.out.println("I am a teacher");}}main:Person s = new Student();Person t = new Teacher();s.say();t.say(); 復(fù)制代碼二、類與對(duì)象和對(duì)象與引用的關(guān)系
2.1、類與對(duì)象的關(guān)系
???? 類是一種抽象的數(shù)據(jù)類型,它是對(duì)某一類事物整體描述/定義,但是并不能代表某一個(gè)具體的事物. ?? 例如:我們生活中所說的詞語:動(dòng)物、植物、手機(jī)、電腦等等 ?? 這些也都是抽象的概念,而不是指的某一個(gè)具體的東西。
?? 例如: Person類、Room類、Car類等 ?? 這些類都是用來描述/定義某一類具體的事物應(yīng)該具備的特點(diǎn)和行為
對(duì)象是抽象概念的具體實(shí)例
?? 例如: ?? 張三就是人的一個(gè)具體實(shí)例,張三家里的旺財(cái)就是狗的一個(gè)具體實(shí)例。能夠體現(xiàn)出特點(diǎn),展現(xiàn)出功能的是具體的實(shí)例,而不是一個(gè)抽象的概念.
例如: ?? Student s = new Student(1L,“tom”,20); ?? s.study();
   Car c = new Car(1,"BWM",500000); 復(fù)制代碼?? c.run();
對(duì)象s就是Student類的一個(gè)實(shí)例,對(duì)象c就是Car類的一個(gè)具體實(shí)例,能夠使用的是具體實(shí)例,而不是類。類只是給對(duì)象的創(chuàng)建提供了一個(gè)參考的模板而已.但是在java中,沒有類就沒有對(duì)象,然而類又是根據(jù)具體的功能需求,進(jìn)行實(shí)際的分析,最終抽象出來的. 復(fù)制代碼2.2、對(duì)象和引用的關(guān)系
引用"指向"對(duì)象 ?? 使用類類型、數(shù)組類型、接口類型聲明出的變量,都可以指向?qū)ο?這種變量就是引用類型變量,簡(jiǎn)稱引用。 ?? 在程序中,創(chuàng)建出對(duì)象后,直接使用并不方便,所以一般會(huì)用一個(gè)引用類型的變量去接收這個(gè)對(duì)象,這個(gè)就是所說的引用指向?qū)ο?
??總結(jié):對(duì)象和引用的關(guān)系,就如電視機(jī)和遙控器,風(fēng)箏和線的關(guān)系一樣。 1 三、方法的定義和調(diào)用 方法一定是定義在類中的,屬于類的成員。
3.1、方法的定義
????格式: 修飾符 返回類型 方法名(參數(shù)列表)異常拋出類型{…}
?1)修飾符:
? public static abstract final等等都是修飾符,一個(gè)方法可以有多個(gè)修飾符.例如程序入口main方法,就使用了public static這個(gè)倆個(gè)修飾符 ?
?
??注:如果一個(gè)方法或者屬性有多個(gè)修飾符,這多個(gè)修飾符是沒有先后順序的
?? 2)返回類型:
方法執(zhí)行完如果有要返回的數(shù)據(jù),那么就要聲明返回?cái)?shù)據(jù)的類型,如果沒有返回的數(shù)據(jù),那么返回類型就必須寫void.
? 只有構(gòu)造方法(構(gòu)造器)不寫任何返回類型也不寫void ? 例如:
public String sayHello(){return "hello";}public int max(int a,int b){return a>b?a:b;}public void print(String msg){System.out.println(msg);} 復(fù)制代碼思考:聲明返回類型的方法中一定要出現(xiàn)return語句,那么沒有返回類型(void)的方法中,能不能出現(xiàn)return語句?
?? 注:break和return的區(qū)別
? 3)方法名:
遵守java中標(biāo)示符的命名規(guī)則即可.
4)參數(shù)列表
?? 根據(jù)需求定義,方法可以是無參的,也可以有一個(gè)參數(shù),也可以有多個(gè)參數(shù)
5)異常拋出類型
如果方法中的代碼在執(zhí)行過程中,可能會(huì)出現(xiàn)一些異常情況,那么就可以在方法上把這些異常聲明并拋出,也可以同時(shí)聲明拋出多個(gè)異常,使用逗號(hào)隔開即可。 例如: ?? 例如: ??
??
public void readFile(String file)throws IOException{
3.2、方法調(diào)用 ????在類中定義了方法,這個(gè)方法中的代碼并不會(huì)執(zhí)行,當(dāng)這個(gè)方法被調(diào)用的時(shí)候,方法中的代碼才會(huì)被一行一行順序執(zhí)行。
  1)非靜態(tài)方法   沒有使用static修飾符修飾的方法,就是非靜態(tài)方法.   調(diào)用這種方法的時(shí)候,是"一定"要使用對(duì)象的。因?yàn)榉庆o態(tài)方法是屬于對(duì)象的。(非靜態(tài)屬性也是一樣的)   例如:   public class Student{   public void say(){}   }   main:   Student s = new Student();   s.say(); 復(fù)制代碼?? 2)靜態(tài)方法 ?? 使用static修飾符修飾的方法,就是靜態(tài)方法. ?? 調(diào)用這種方法的時(shí)候,"可以"使用對(duì)象調(diào)用,也"可以"使用類來調(diào)用,但是推薦使用類進(jìn)行調(diào)用,因?yàn)殪o態(tài)方法是屬于類的。(靜態(tài)屬性也是一樣的) ?? 例如: ?? public class Student{ ?? public static void say(){} ?? }
   main:   Student.say(); 復(fù)制代碼3)類中方法之間的調(diào)用 ?? 假設(shè)同一個(gè)類中有倆個(gè)方法,a方法和b方法
?? a和b都是非靜態(tài)方法,相互之間可以直接調(diào)用. ?? public void a(){ ?? b(); ?? } ?? public void b(){
?? }
?? a和b都是靜態(tài)方法,相互之間可以直接調(diào)用. ?? public static void a(){ ?? b(); ?? } ?? public static void b(){
?? }
   a靜態(tài)方法,b是非靜態(tài)方法 復(fù)制代碼?? a方法中不能直接調(diào)用b方法,但是b方法中可以直接調(diào)用a方法. ?? public static void a(){ ?? //b();報(bào)錯(cuò) ?? } ?? public void b(){ ?? a(); ?? } ?? 另外:在同一個(gè)類中,靜態(tài)方法內(nèi)不能直接訪問到類中的非靜態(tài)屬性.
總結(jié):類中方法中的調(diào)用,兩個(gè)方法都是靜態(tài)或者非靜態(tài)都可以互相調(diào)用,當(dāng)一個(gè)方法是靜態(tài),一個(gè)方法是非 靜態(tài)的時(shí)候,非靜態(tài)方法可以調(diào)用靜態(tài)方法,反之不能。
四、調(diào)用方法時(shí)的傳參 1)形參和實(shí)參 例如: // a = x; public void test(int a){ //… } main: int x = 1; t.test(x); 參數(shù)列表中的a是方法test的形參(形式上的參數(shù)) 調(diào)用方法時(shí)的x是方法test的實(shí)參(實(shí)際上的參數(shù))
注意:形參的名字和實(shí)參的名字都只是一個(gè)變量的名字,是可以隨便寫的,我們并不關(guān)心這個(gè)名字,而是關(guān)心變量的類型以及變量接收的值。 復(fù)制代碼2)值傳遞和引用傳遞 調(diào)用方法進(jìn)行傳參時(shí),分為值傳遞和引用傳遞兩種。 如果參數(shù)的類型是基本數(shù)據(jù)類型,那么就是值傳遞。 如果參數(shù)的類型是引用數(shù)據(jù)類型,那么就是引用傳遞。
值傳遞是實(shí)參把自己變量本身存的簡(jiǎn)單數(shù)值賦值給形參. 引用傳遞是實(shí)參把自己變量本身存的對(duì)象內(nèi)存地址值賦值給形參.所以值傳遞和引用傳遞本質(zhì)上是一回事,只不過傳遞的東西的意義不同而已. 復(fù)制代碼3)值傳遞的示例 public class Test{ public static void changeNum(int a){ a = 10; }
public static void main(String[] args){int a = 1;System.out.println("before: a = "+a);changeNum(a);System.out.println("after: a = "+a);}} 復(fù)制代碼4)引用傳遞的示例 public class Test{ public static void changeName(Student s){ s.name = "tom"; }
public static void main(String[] args){Student s = new Student();System.out.println("before: name = "+s.name);changeName(s);System.out.println("after: name = "+s.name);} } 復(fù)制代碼五、this關(guān)鍵字 在類中,可以使用this關(guān)鍵字表示一些特殊的作用。
5.1、this在類中的作用
1)區(qū)別成員變量和局部變量 ?? public class Student{ ?? private String name; ?? public void setName(String name){ ?? //this.name表示類中的屬性name ?? this.name = name; ?? }
?? } 1 2)調(diào)用類中的其他方法 ?? public class Student{ ?? private String name; ?? public void setName(String name){ ?? this.name = name; ?? } ?? public void print(){ ?? //表示調(diào)用當(dāng)前類中的setName方法 ?? this.setName(“tom”); ?? } ?? } 注:默認(rèn)情況下,setName(“tom”)和this.setName(“tom”)的效果是一樣的.
3)調(diào)用類中的其他構(gòu)造器 ?? public class Student{ ?? private String name; ?? public Student(){ ?? //調(diào)用一個(gè)參數(shù)的構(gòu)造器,并且參數(shù)的類型是String ?? this(“tom”); ?? } ?? public Student(String name){ ?? this.name = name; ?? } ?? }
注:this的這種用法,只能在構(gòu)造器中使用.普通的方法是不能用的.并且這局調(diào)用的代碼只能出現(xiàn)在構(gòu)造器中的第一句. 例如: public class Student{private String name;//編譯報(bào)錯(cuò),因?yàn)閠his("tom")不是構(gòu)造器中的第一句代碼.public Student(){System.out.println("hello");this("tom");}public Student(String name){this.name = name;} } 復(fù)制代碼5.2、this關(guān)鍵字在類中的意義
this在類中表示當(dāng)前類將來創(chuàng)建出的對(duì)象. ?? 例如: ?? public class Student{ ?? private String name; ?? public Student(){ ?? System.out.println("this = "+this); ?? } ?? public static void main(String[] args){ ?? Student s = new Student(); ?? System.out.println("s = "+s); ?? } ?? } ?? 運(yùn)行后看結(jié)果可知,this和s打印的結(jié)果是一樣的,那么其實(shí)也就是變量s是從對(duì)象的外部執(zhí)行對(duì)象,而this是在對(duì)象的內(nèi)部執(zhí)行對(duì)象本身. ?? 這樣也就能理解為什么this.name代表的是成員變量,this.setName(“tom”)代表的是調(diào)用成員方法,因?yàn)檫@倆句代碼從本質(zhì)上講,和在對(duì)象外部使用變量s來調(diào)用是一樣的,s.name和s.setName(“tom”)。
?? this和s打印出來的內(nèi)存地址是一樣的,使用==比較的結(jié)果為true。 ?? 例如: ?? public class Student{ ?? public Student getStudent(){
return this; ?? }
?? public static void main(String[] args) { ?? Student s1 = new Student(); ?? Student s2 = s1.getStudent(); ?? System.out.println(s1 == s2);//true
?? } }
例如: 類中的this是和s1相等還是和s2相等呢? ??? public class Student{ ?? private String name; ?? public void test(){ ?? System.out.println(this); ?? } ?? public static void main(String[] args) { ?? Student s1 = new Student(); ?? Student s2 = new Student(); ?? s1.test(); ?? s2.test(); ??? } ??? } 注:這句話是要這么來描述的,s1對(duì)象中的this和s1相等,s2對(duì)象中的this和s2相等,因?yàn)轭愂悄0?模板中寫的this并不是只有一個(gè),每個(gè)對(duì)象中都有一個(gè)屬于自己的this,就是每個(gè)對(duì)象中都一個(gè)屬于自己的name屬性一樣.
六、創(chuàng)建與初始化對(duì)象 使用new關(guān)鍵字創(chuàng)建的時(shí)候,除了分配內(nèi)存空間之外,還會(huì)給創(chuàng)建好的對(duì)象進(jìn)行默認(rèn)的初始化以及對(duì)類中構(gòu)造器的調(diào)用
那么對(duì)main方法中的以下代碼: ?? Student s = new Student(); ?? 1)為對(duì)象分配內(nèi)存空間,將對(duì)象的實(shí)例變量自動(dòng)初始化默認(rèn)值為0/false/null。(實(shí)例變量的隱式賦值)
?? 2)如果代碼中實(shí)例變量有顯式賦值,那么就將之前的默認(rèn)值覆蓋掉。(之后可以通過例子看到這個(gè)現(xiàn)象) ?? 例如:顯式賦值 ?? private String name = "tom";
?? 3)調(diào)用構(gòu)造器
?? 4)把對(duì)象內(nèi)存地址值賦值給變量。(=號(hào)賦值操作)
七、構(gòu)造器 類中的構(gòu)造器也稱為構(gòu)造方法,是在進(jìn)行創(chuàng)建對(duì)象的時(shí)候必須要調(diào)用的。并且構(gòu)造器有以下倆個(gè)特點(diǎn): 1)必須和類的名字相同 2)必須沒有返回類型,也不能寫void
構(gòu)造器的作用: 1)使用new創(chuàng)建對(duì)象的時(shí)候必須使用類的構(gòu)造器 2)構(gòu)造器中的代碼執(zhí)行后,可以給對(duì)象中的屬性初始化賦值 例如: public class Student{ private String name; public Student(){ name = "tom"; } }
構(gòu)造器重載: 除了無參構(gòu)造器之外,很多時(shí)候我們還會(huì)使用有參構(gòu)造器,在創(chuàng)建對(duì)象時(shí)候可以給屬性賦值. 例如: public class Student{ private String name; public Student(String name){ this.name = name; } }
構(gòu)造器之間的調(diào)用: 使用this關(guān)鍵字,在一個(gè)構(gòu)造器中可以調(diào)用另一個(gè)構(gòu)造器的代碼。 注意:this的這種用法不會(huì)產(chǎn)生新的對(duì)象,只是調(diào)用了構(gòu)造器中的代碼而已.一般情況下只有使用new關(guān)鍵字才會(huì)創(chuàng)建新對(duì)象。
例如:public class Student{private String name;public Student(){this();}public Student(String name){this.name = name;}} 復(fù)制代碼默認(rèn)構(gòu)造器: 在java中,即使我們?cè)诰帉戭惖臅r(shí)候沒有寫構(gòu)造器,那么在編譯之后也會(huì)自動(dòng)的添加一個(gè)無參構(gòu)造器,這個(gè)無參構(gòu)造器也被稱為默認(rèn)的構(gòu)造器。
例如: public class Student{} main://編譯通過,因?yàn)橛袩o參構(gòu)造器Student s = new Student();但是,如果我們手動(dòng)的編寫了一個(gè)構(gòu)造器,那么編譯后就不會(huì)添加任何構(gòu)造器了 例如: public class Student{private String name;public Student(String name){this.name = name;} } main://編譯報(bào)錯(cuò),因?yàn)闆]有無參構(gòu)造器Student s = new Student(); 復(fù)制代碼為什么某些人會(huì)一直比你優(yōu)秀,是因?yàn)樗旧砭秃軆?yōu)秀還一直在持續(xù)努力變得更優(yōu)秀,而你是不是還在滿足于現(xiàn)狀內(nèi)心在竊喜! 合理利用自己每一分每一秒的時(shí)間來學(xué)習(xí)提升自己,不要再用"沒有時(shí)間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個(gè)交代! 還是那句話,希望此文能幫到大家的同時(shí),也聽聽大家的觀點(diǎn)。歡迎留言討論,加關(guān)注,分享你的高見!持續(xù)更新!
To-陌霖Java架構(gòu)
分享互聯(lián)網(wǎng)最新文章 關(guān)注互聯(lián)網(wǎng)最新發(fā)展
總結(jié)
以上是生活随笔為你收集整理的Java架构-JavaSE(一)之类与对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GitLab 安装配置指南
- 下一篇: 感动到流泪!数据分析师的福音:跨视图粒度