JavaSE——面向对象基础(思想、类与对象、构造方法、重载、匿名对象)
第1節(jié) 面向?qū)ο蠡A(chǔ)
一、面向?qū)ο笏枷?/h2>
1.1 概述
面向?qū)ο?#xff08;Object Oriented)是軟件開發(fā)方法。面向?qū)ο蟮母拍詈蛻?yīng)用已超越了程序設(shè)計(jì)和軟件開發(fā),是一種對(duì)現(xiàn)實(shí)世界理解和抽象的方法,是計(jì)算機(jī)編程技術(shù)發(fā)展到一定階段的產(chǎn)物。面向?qū)ο笫窍鄬?duì)于面向過程來講的,指的是把相關(guān)的數(shù)據(jù)和方法組織為一個(gè)整體來看待,從更高的層次來進(jìn)行系統(tǒng)建模,更貼近事物的自然運(yùn)行模式。
面向過程到面向?qū)ο笏枷雽用娴霓D(zhuǎn)變:
-
面向過程關(guān)注的是執(zhí)行的過程,面向?qū)ο箨P(guān)注的是具備功能的對(duì)象。
-
面向過程到面向?qū)ο?#xff0c;是程序員思想上 從執(zhí)行者到指揮者的轉(zhuǎn)變。
此概念如果直接去理解的話可能會(huì)比較抽象,因?yàn)榇蠹胰鄙賹?duì)原始的面向過程的開發(fā)語言的了解,下面我們舉一個(gè)栗子:
1.2 三大思想
面向?qū)ο笏枷霃母拍钌现v分為以下三種:OOA、OOD、OOP
OOA:面向?qū)ο蠓治?#xff08;Object Oriented Analysis)
OOD:面向?qū)ο笤O(shè)計(jì)(Object Oriented Design)
OOP:面向?qū)ο蟪绦?#xff08;Object Oriented Programming)
1.3 三大特征
封裝性:所有內(nèi)容對(duì)外部不可見
繼承性:將其他的功能繼承下來繼續(xù)發(fā)展
多態(tài)性:方法的重載本身就是一個(gè)多態(tài)性的體現(xiàn)
二、類與對(duì)象
2.1 概念與關(guān)系
類表示一個(gè) 共性的 產(chǎn)物,是一個(gè)綜合的特征,而對(duì)象,是一個(gè) 個(gè)性的 產(chǎn)物,是一個(gè)個(gè)體的特征。類必須通過對(duì)象才可以使用,對(duì)象的所有操作都在類中定義。類由屬性和方法組成:
-
屬性:就相當(dāng)于人的一個(gè)個(gè)的特征
-
方法:就相當(dāng)于人的一個(gè)個(gè)行為,例如:說話、吃飯、唱歌、睡覺
2.2 類的定義格式
class 類名稱{成員屬性成員方法 }注意:
-
類必須編寫在.java文件中。
-
一個(gè).java文件中,可以存在N個(gè)類,但是只能存在一個(gè)public修飾的類。
-
.java文件的文件名稱,必須與public修飾的類名完全一致,否則會(huì)報(bào)錯(cuò)。
2.3 屬性和方法
屬性定義格式:數(shù)據(jù)類型 屬性名; 屬性定義并賦值的格式:數(shù)據(jù)類型 屬性名 = 初始化值;方法定義格式:權(quán)限修飾符 返回值類型 方法名(形式參數(shù)列表) {//方法體return 返回值;}2.4 對(duì)象的創(chuàng)建與使用
一個(gè)類想要真正的進(jìn)行操作,則必須依靠對(duì)象,對(duì)象的定義格式如下:類名稱 對(duì)象名稱 = new 類名稱();如果要想訪問類中的屬性或方法(方法的定義),則可以依靠以下的語法形式:訪問類中的屬性: 對(duì)象名.屬性名;調(diào)用類中的方法: 對(duì)象名.方法(實(shí)際參數(shù)列表);示例如下:
/*** class 類名{* 成員屬性;* 成員方法;* }** 類必須編寫在.java文件中。* 一個(gè).java文件中,可以存在N個(gè)類,但是只能存在一個(gè)public修飾的類* .java文件的文件名稱必須與public修飾的類名完全一致**/ public class classobject {public static void main(String[] args) {//創(chuàng)建對(duì)象的格式://類名 對(duì)象名 = new 類名();Person p = new Person();//對(duì)象屬性賦值://格式:對(duì)象名.屬性名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;//方法 - 行為/*** 返回值類型 方法名稱(形式參數(shù)列表) {* 方法體* return 返回值;* }** 調(diào)用格式:* 對(duì)象名.方法名稱(實(shí)際參數(shù)列表);*/void say() {System.out.println("自我介紹,我是"+name+",我的年齡:"+age+"我的性別:"+sex);}int sum(int x, int y) {return x + y;}// void xxx() { // if (true) { // //return表示結(jié)束方法 // 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 = "紀(jì)實(shí)小說";b1.say();b2.say();} }class Book {String name;String info;void say() {System.out.println("書名:"+name+",簡(jiǎn)介:"+info);} }2.5 創(chuàng)建對(duì)象內(nèi)存分析
2.5.1 棧
Java棧的區(qū)域很小,大概2M左右,特點(diǎn)是存取的速度特別快。棧存儲(chǔ)的特點(diǎn):先進(jìn)后出存儲(chǔ)速度快的原因:????- 棧內(nèi)存,通過“棧指針”來創(chuàng)建空間與釋放空間,指針向下移動(dòng),會(huì)創(chuàng)建新的內(nèi)存,向上移動(dòng),會(huì)釋放這些內(nèi)存
這種方式速度特別快,僅次于PC寄存器,但是這種移動(dòng)的方式,必須要明確移動(dòng)的大小與范圍。明確大小與范圍是為了方便指針的移動(dòng),這是一個(gè)對(duì)于數(shù)據(jù)存儲(chǔ)的限制,存儲(chǔ)的數(shù)據(jù)大小是固定的,影響了程序的靈活性。由于不太靈活,所以把更大部分的數(shù)據(jù)存儲(chǔ)到了堆內(nèi)存中。存儲(chǔ)的內(nèi)容有:
**基本數(shù)據(jù)類型的數(shù)據(jù)** 以及 **引用數(shù)據(jù)類型的引用** 例如: int a = 10; Person p = new Person();10存儲(chǔ)在棧內(nèi)存中,對(duì)象的引用p存儲(chǔ)在棧內(nèi)存中。
2.5.2 堆
存放的內(nèi)容是:類的對(duì)象。
Java是一個(gè)純面向?qū)ο笳Z言,限制了對(duì)象的創(chuàng)建方式:所有類的對(duì)象都是通過new關(guān)鍵字創(chuàng)建,new關(guān)鍵字,是指告訴JVM,需要明確的去創(chuàng)建一個(gè)新的對(duì)象,去開辟一塊新的堆內(nèi)存空間。
優(yōu)點(diǎn):與棧內(nèi)存相對(duì),創(chuàng)建對(duì)象時(shí),不必關(guān)注堆內(nèi)存中需要開辟多少存儲(chǔ)空間,也不需要關(guān)注內(nèi)存占用時(shí)長(zhǎng)。
堆內(nèi)存中內(nèi)存的釋放是由GC(垃圾回收器)完成的。
垃圾回收器 回收堆內(nèi)存的規(guī)則:
當(dāng)棧內(nèi)存中不存在此對(duì)象的引用時(shí),則視其為垃圾,等待垃圾回收器回收。
例如:
Person p0 = new Person(); Person p1 = p0; Person p2 = new Person();2.5.3 方法區(qū)
存放的內(nèi)容是:
-
類信息
-
靜態(tài)的變量
-
常量
-
成員方法
方法區(qū)中包含了一個(gè)特殊的區(qū)域(常量池)(存儲(chǔ)的是使用static修飾的成員)
2.5.4 PC寄存器
PC寄存器保存的是 當(dāng)前正在執(zhí)行的JVM指令的 地址 。
2.5.5 本地方法棧
保存本地(native)方法的地址。
給個(gè)例子:
上述代碼中,創(chuàng)建對(duì)象時(shí),對(duì)象的引用(b1,b2)存放在棧內(nèi)存中,另外在堆內(nèi)存中開辟真正的空間用于存放對(duì)象的屬性,而類的方法會(huì)存在方法區(qū)中。當(dāng)b2=b1時(shí),就是將b1內(nèi)存放的地址值賦值給b2,那么b2也就指向了b1,堆內(nèi)存中0x124位置的內(nèi)容就沒有引用了,后續(xù)會(huì)被GC回收。三、構(gòu)造方法
在對(duì)象創(chuàng)建時(shí),`Person p = new Person();`在Person右側(cè)的小括號(hào),其實(shí)就是在調(diào)用構(gòu)造方法。3.1 概述
作用 :用于對(duì)象初始化(個(gè)人理解比較像Python的__init__()函數(shù))
執(zhí)行時(shí)機(jī) :在創(chuàng)建對(duì)象時(shí),自動(dòng)調(diào)用,如果類中沒寫,默認(rèn)調(diào)用無參構(gòu)造方法。
特點(diǎn) :所有Java類中都會(huì)至少存在一個(gè)構(gòu)造方法,如果一個(gè)類中沒有明確的編寫構(gòu)造方法,則編譯器會(huì)自動(dòng)生成一個(gè)無參構(gòu)造方法,構(gòu)造方法中沒有任何代碼!(但是最好還是養(yǎng)成寫的習(xí)慣)。
注意 :如果自行編寫了任意一個(gè)構(gòu)造器,則編譯器不會(huì)再自動(dòng)生成無參的構(gòu)造方法。
3.2 定義格式
定義的格式:與普通方法基本相同,區(qū)別在于:方法名稱必須與類名相同,沒有返回值類型的聲明! 例如:public class Demo3 {Person p = new Person();p = new Person();}class Person{public Person(){System.out.println("對(duì)象創(chuàng)建時(shí),此方法調(diào)用");}} 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 構(gòu)造方法設(shè)計(jì)
-
建議自定義無參構(gòu)造方法 ,不要對(duì)編譯器形成依賴,避免錯(cuò)誤發(fā)生。
-
當(dāng)類中有非常量成員變量時(shí),建議提供兩個(gè)版本的構(gòu)造方法,一個(gè)是無參構(gòu)造方法,一個(gè)是全屬性做參數(shù)的構(gòu)造方法 。
-
當(dāng)類中所有成員變量都是常量或者沒有成員變量時(shí),建議不提供任何版本的構(gòu)造。
四、方法的重載
4.1 概念
一個(gè)類中定義的方法,是允許重載的。滿足下列要求的方法稱之為重載:
方法名稱相同;
參數(shù)列表長(zhǎng)度 或 參數(shù)列表類型 或 參數(shù)類型順序不同;
與返回值類型無關(guān)
方法的重載,可以讓我們?cè)诓煌男枨笙?#xff0c;通過傳遞不同的參數(shù)調(diào)用方法來完成具體的功能。4.2 構(gòu)造方法的重載
一個(gè)類可以存在多個(gè)構(gòu)造方法:
參數(shù)列表的長(zhǎng)度或類型不同 即可完成構(gòu)造方法的重載。
作用 :構(gòu)造方法的重載,可以讓我們?cè)诓煌膭?chuàng)建對(duì)象的需求下,調(diào)用不同的方法來完成對(duì)象的初始化。
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);} }五、匿名對(duì)象
沒有對(duì)象名稱的對(duì)象,就是匿名對(duì)象。
匿名對(duì)象只能使用一次,因?yàn)闆]有任何的對(duì)象引用,所以將稱為垃圾,等待被GC回收。只使用一次的對(duì)象可以通過匿名對(duì)象的方式完成,這一點(diǎn)在以后的開發(fā)中將經(jīng)常被使用到。
public class Anonymousobject {/*** 匿名: 沒有名字,相當(dāng)于棧內(nèi)存中沒有創(chuàng)建引用,只在堆內(nèi)存中開辟了空間* 使用完畢后,該對(duì)象就會(huì)被回收*/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;} }總結(jié)
以上是生活随笔為你收集整理的JavaSE——面向对象基础(思想、类与对象、构造方法、重载、匿名对象)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言里的写文件
- 下一篇: RetinaNet+focal loss