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