JavaSE——面向对象基础(思想、类与对象、构造方法、重载、匿名对象)
第1節 面向對象基礎
一、面向對象思想
1.1 概述
面向對象(Object Oriented)是軟件開發方法。面向對象的概念和應用已超越了程序設計和軟件開發,是一種對現實世界理解和抽象的方法,是計算機編程技術發展到一定階段的產物。面向對象是相對于面向過程來講的,指的是把相關的數據和方法組織為一個整體來看待,從更高的層次來進行系統建模,更貼近事物的自然運行模式。面向過程到面向對象思想層面的轉變:
-
面向過程關注的是執行的過程,面向對象關注的是具備功能的對象。
-
面向過程到面向對象,是程序員思想上 從執行者到指揮者的轉變。
此概念如果直接去理解的話可能會比較抽象,因為大家缺少對原始的面向過程的開發語言的了解,下面我們舉一個栗子:
1.2 三大思想
面向對象思想從概念上講分為以下三種:OOA、OOD、OOP
OOA:面向對象分析(Object Oriented Analysis)
OOD:面向對象設計(Object Oriented Design)
OOP:面向對象程序(Object Oriented Programming)
1.3 三大特征
封裝性:所有內容對外部不可見
繼承性:將其他的功能繼承下來繼續發展
多態性:方法的重載本身就是一個多態性的體現
二、類與對象
2.1 概念與關系
類表示一個 共性的 產物,是一個綜合的特征,而對象,是一個 個性的 產物,是一個個體的特征。類必須通過對象才可以使用,對象的所有操作都在類中定義。類由屬性和方法組成:
-
屬性:就相當于人的一個個的特征
-
方法:就相當于人的一個個行為,例如:說話、吃飯、唱歌、睡覺
2.2 類的定義格式
class 類名稱{成員屬性成員方法 }注意:
-
類必須編寫在.java文件中。
-
一個.java文件中,可以存在N個類,但是只能存在一個public修飾的類。
-
.java文件的文件名稱,必須與public修飾的類名完全一致,否則會報錯。
2.3 屬性和方法
屬性定義格式:數據類型 屬性名; 屬性定義并賦值的格式:數據類型 屬性名 = 初始化值;方法定義格式:權限修飾符 返回值類型 方法名(形式參數列表) {//方法體return 返回值;}2.4 對象的創建與使用
一個類想要真正的進行操作,則必須依靠對象,對象的定義格式如下:類名稱 對象名稱 = new 類名稱();如果要想訪問類中的屬性或方法(方法的定義),則可以依靠以下的語法形式:訪問類中的屬性: 對象名.屬性名;調用類中的方法: 對象名.方法(實際參數列表);示例如下:
/*** class 類名{* 成員屬性;* 成員方法;* }** 類必須編寫在.java文件中。* 一個.java文件中,可以存在N個類,但是只能存在一個public修飾的類* .java文件的文件名稱必須與public修飾的類名完全一致**/ public class classobject {public static void main(String[] args) {//創建對象的格式://類名 對象名 = new 類名();Person p = new Person();//對象屬性賦值://格式:對象名.屬性名p.name = "張三";p.age = 18;p.sex = '男';p.say();int sum = p.sum(100, 200);System.out.println(sum);} }/*** 類就像是圖紙*/ class Person{//屬性 - 特征String name;int age;char sex;//方法 - 行為/*** 返回值類型 方法名稱(形式參數列表) {* 方法體* return 返回值;* }** 調用格式:* 對象名.方法名稱(實際參數列表);*/void say() {System.out.println("自我介紹,我是"+name+",我的年齡:"+age+"我的性別:"+sex);}int sum(int x, int y) {return x + y;}// void xxx() { // if (true) { // //return表示結束方法 // return; // } // System.out.println("haha"); // } } public class classobject2 {public static void main(String[] args) {Book b1 = new Book();Book b2 = new Book();b1.name = "三體";b1.info = "科幻小說";b2.name = "平凡的世界";b2.info = "紀實小說";b1.say();b2.say();} }class Book {String name;String info;void say() {System.out.println("書名:"+name+",簡介:"+info);} }2.5 創建對象內存分析
2.5.1 棧
Java棧的區域很小,大概2M左右,特點是存取的速度特別快。棧存儲的特點:先進后出存儲速度快的原因:????- 棧內存,通過“棧指針”來創建空間與釋放空間,指針向下移動,會創建新的內存,向上移動,會釋放這些內存
這種方式速度特別快,僅次于PC寄存器,但是這種移動的方式,必須要明確移動的大小與范圍。明確大小與范圍是為了方便指針的移動,這是一個對于數據存儲的限制,存儲的數據大小是固定的,影響了程序的靈活性。由于不太靈活,所以把更大部分的數據存儲到了堆內存中。存儲的內容有:
**基本數據類型的數據** 以及 **引用數據類型的引用** 例如: int a = 10; Person p = new Person();10存儲在棧內存中,對象的引用p存儲在棧內存中。
2.5.2 堆
存放的內容是:類的對象。
Java是一個純面向對象語言,限制了對象的創建方式:所有類的對象都是通過new關鍵字創建,new關鍵字,是指告訴JVM,需要明確的去創建一個新的對象,去開辟一塊新的堆內存空間。
優點:與棧內存相對,創建對象時,不必關注堆內存中需要開辟多少存儲空間,也不需要關注內存占用時長。
堆內存中內存的釋放是由GC(垃圾回收器)完成的。
垃圾回收器 回收堆內存的規則:
當棧內存中不存在此對象的引用時,則視其為垃圾,等待垃圾回收器回收。
例如:
Person p0 = new Person(); Person p1 = p0; Person p2 = new Person();2.5.3 方法區
存放的內容是:
-
類信息
-
靜態的變量
-
常量
-
成員方法
方法區中包含了一個特殊的區域(常量池)(存儲的是使用static修飾的成員)
2.5.4 PC寄存器
PC寄存器保存的是 當前正在執行的JVM指令的 地址 。
2.5.5 本地方法棧
保存本地(native)方法的地址。
給個例子:
上述代碼中,創建對象時,對象的引用(b1,b2)存放在棧內存中,另外在堆內存中開辟真正的空間用于存放對象的屬性,而類的方法會存在方法區中。當b2=b1時,就是將b1內存放的地址值賦值給b2,那么b2也就指向了b1,堆內存中0x124位置的內容就沒有引用了,后續會被GC回收。三、構造方法
在對象創建時,`Person p = new Person();`在Person右側的小括號,其實就是在調用構造方法。3.1 概述
作用 :用于對象初始化(個人理解比較像Python的__init__()函數)
執行時機 :在創建對象時,自動調用,如果類中沒寫,默認調用無參構造方法。
特點 :所有Java類中都會至少存在一個構造方法,如果一個類中沒有明確的編寫構造方法,則編譯器會自動生成一個無參構造方法,構造方法中沒有任何代碼!(但是最好還是養成寫的習慣)。
注意 :如果自行編寫了任意一個構造器,則編譯器不會再自動生成無參的構造方法。
3.2 定義格式
定義的格式:與普通方法基本相同,區別在于:方法名稱必須與類名相同,沒有返回值類型的聲明! 例如:public class Demo3 {Person p = new Person();p = new Person();}class Person{public Person(){System.out.println("對象創建時,此方法調用");}} public class constructorfunction {public static void main(String[] args) {Person2 p1 = new Person2("張三");p1.age = 18;p1.say();} }class Person2 {String name;int age;Person2(String n) {name = n;}void say() {System.out.println("自我介紹,我是:"+name+",我的年齡:"+age);} }3.3 構造方法設計
-
建議自定義無參構造方法 ,不要對編譯器形成依賴,避免錯誤發生。
-
當類中有非常量成員變量時,建議提供兩個版本的構造方法,一個是無參構造方法,一個是全屬性做參數的構造方法 。
-
當類中所有成員變量都是常量或者沒有成員變量時,建議不提供任何版本的構造。
四、方法的重載
4.1 概念
一個類中定義的方法,是允許重載的。滿足下列要求的方法稱之為重載:
方法名稱相同;
參數列表長度 或 參數列表類型 或 參數類型順序不同;
與返回值類型無關
方法的重載,可以讓我們在不同的需求下,通過傳遞不同的參數調用方法來完成具體的功能。4.2 構造方法的重載
一個類可以存在多個構造方法:
參數列表的長度或類型不同 即可完成構造方法的重載。
作用 :構造方法的重載,可以讓我們在不同的創建對象的需求下,調用不同的方法來完成對象的初始化。
public class constructor_overload {public static void main(String[] args) {Person3 p = new Person3("張三", 18);p.say();Person3 p2 = new Person3("李四");p2.say();} }class Person3{Person3(String name2, int age2){name = name2;age = age2;}Person3(String name2) {name = name2;}String name;int age;void say() {System.out.println("自我介紹,姓名:"+name+",年齡:"+age);} }五、匿名對象
沒有對象名稱的對象,就是匿名對象。
匿名對象只能使用一次,因為沒有任何的對象引用,所以將稱為垃圾,等待被GC回收。只使用一次的對象可以通過匿名對象的方式完成,這一點在以后的開發中將經常被使用到。
public class Anonymousobject {/*** 匿名: 沒有名字,相當于棧內存中沒有創建引用,只在堆內存中開辟了空間* 使用完畢后,該對象就會被回收*/public static void main(String[] args) { // Math2 m = new Math2(); // int num = m.sum(100, 200); // System.out.println(num);int num = new Math2().sum(100, 200);System.out.println(num);} }class Math2{int sum(int x, int y) {return x + y;} }總結
以上是生活随笔為你收集整理的JavaSE——面向对象基础(思想、类与对象、构造方法、重载、匿名对象)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言里的写文件
- 下一篇: JavaSE——Java介绍与环境变量简