零基础学java(6)——面向对象的基本特征
第六章 面向?qū)ο蟮幕咎卣?/h1>
目錄
- 第六章 面向?qū)ο蟮幕咎卣?/li>
- 6.1 封裝
- 6.2 構(gòu)造器
- 6.3 關(guān)鍵字this
- 6.4 包
- 6.5 eclipse的使用
- 6.6 面向?qū)ο蟮幕咎卣髦?#xff1a;繼承
- 6.7 關(guān)鍵字super
- 6.8 方法的重寫(xiě)
- 6.9 非靜態(tài)代碼塊
- 6.10 實(shí)例初始化過(guò)程
- 6.11 面向?qū)ο蟮幕咎卣髦?#xff1a;多態(tài)
面向?qū)ο蟮幕咎卣?#xff1a;
1、封裝
2、繼承
3、多態(tài)
6.1 封裝
1、好處:
(1)隱藏實(shí)現(xiàn)細(xì)節(jié),方便使用者使用
(2)安全,可以控制可見(jiàn)范圍
2、如何實(shí)現(xiàn)封裝?
通過(guò)權(quán)限修飾符
面試題:請(qǐng)按照可見(jiàn)范圍從小到大(從大到小)列出權(quán)限修飾符?
| private | √ | × | × | × |
| 缺省 | √ | √ | × | × |
| protected | √ | √ | √ | × |
| public | √ | √ | √ | √ |
權(quán)限修飾符可以修飾什么?
類(類、接口等)、屬性、方法、構(gòu)造器、內(nèi)部類
類(外部類):public和缺省
屬性:4種
方法:4種
構(gòu)造器:4種
內(nèi)部類:4種
3、通常屬性的封裝是什么樣的?
當(dāng)然屬性的權(quán)限修飾符可以是private、缺省、protected、public。但是我們大多數(shù)時(shí)候,見(jiàn)到的都是private,然后給它們配上get/set方法。
示例代碼:標(biāo)準(zhǔn)Javabean的寫(xiě)法
public class Student{//屬性私有化private String name;private int age;private boolean marry;//公共的get/setpublic void setName(String n){name = n;//這里因?yàn)檫€沒(méi)有學(xué)習(xí)this等,可能還會(huì)優(yōu)化}public String getName(){return name;}public void setAge(int a){age = a;}public int getAge(){return age;}public void setMarry(boolean m){marry = m;}public boolean isMarry(){//boolean類型的屬性的get方法,習(xí)慣使用把get換成isreturn marry;} }6.2 構(gòu)造器
1、構(gòu)造器的作用:
(1)和new一起使用創(chuàng)建對(duì)象
(2)可以在創(chuàng)建對(duì)象的同時(shí)為屬性賦值
public class Circle{private double radius;public Circle(){}public Circle(double r){radius = r;//為radius賦值} }2、聲明構(gòu)造器的語(yǔ)法格式:
【修飾符】 class 類名{【修飾符】 類名(){//無(wú)參構(gòu)造}【修飾符】 類名(形參列表){//有參構(gòu)造} }3、構(gòu)造器的特點(diǎn):
(1)所有的類都有構(gòu)造器
(2)如果一個(gè)類沒(méi)有顯式/明確的聲明一個(gè)構(gòu)造器,那么編譯器將會(huì)自動(dòng)添加一個(gè)默認(rèn)的無(wú)參構(gòu)造
(3)如果一個(gè)類顯式/明確的聲明了構(gòu)造器,那么編譯器將不再自動(dòng)添加默認(rèn)的無(wú)參構(gòu)造,如果需要,那么就需要手動(dòng)添加
(4)構(gòu)造器的名稱必須與類名相同
(5)構(gòu)造器沒(méi)有返回值類型
(6)構(gòu)造器可以重載
示例代碼:
public class Circle{private double radius;public Circle(){}public Circle(double r){radius = r;//為radius賦值} }6.3 關(guān)鍵字this
1、this關(guān)鍵字:
意思:當(dāng)前對(duì)象
(1)如果出現(xiàn)在構(gòu)造器中:表示正在創(chuàng)建的對(duì)象
(2)如果出現(xiàn)在成員方法中:表示正在調(diào)用這個(gè)方法的對(duì)象
2、this的用法:
(1)this.屬性
當(dāng)局部變量與成員變量同名時(shí),那么可以在成員變量的而前面加“this.”用于區(qū)別
(2)this.方法
調(diào)用當(dāng)前對(duì)象的成員方法,完全可以省略“this.”
(3)this()或this(實(shí)參列表)
this()表示調(diào)用本類的無(wú)參構(gòu)造
this(實(shí)參列表)表示調(diào)用本類的有參構(gòu)造
this()或this(實(shí)參列表)要么沒(méi)有,要么必須出現(xiàn)在構(gòu)造器的首行
示例代碼:
public class Student{private String name;private int score;public Student(){}public Student(String name){this.name = name;}public Student(String name, int score){this(name);}public void setName(String name){this.name = name;}public String getName(){return name;}public void setScore(int score){this.score = score;}public int getScore(){return score;} }3、成員變量與局部變量的區(qū)別?
這里只討論實(shí)例變量(關(guān)于類變量見(jiàn)static部分)
(1)聲明的位置不同
成員變量:類中方法外
局部變量:方法中或代碼中
? ①方法的形參列表
? ②方法體中局部變量
? ③代碼塊中的局部變量
(2)運(yùn)行時(shí)在內(nèi)存中的存儲(chǔ)位置不同
成員變量:堆
局部變量:棧
基本數(shù)據(jù)類型的變量在棧中,引用數(shù)據(jù)類型的變量在堆中:不準(zhǔn)確
(3)修飾符
成員變量:有很多修飾符,例如:權(quán)限修飾符
局部變量:不能加權(quán)限修飾符,唯一的能加的是final
(4)初始化
成員變量:有默認(rèn)值
局部變量:沒(méi)有默認(rèn)值,必須手動(dòng)初始化
(5)生命周期
成員變量:隨著對(duì)象的創(chuàng)建而創(chuàng)建,隨著對(duì)象被回收而消亡,即與對(duì)象同生共死。每一個(gè)對(duì)象都是獨(dú)立的。
局部變量:方法調(diào)用時(shí)才分配,方法運(yùn)行結(jié)束就沒(méi)有了。每一次方法調(diào)用,都是獨(dú)立的
6.4 包
1、包的作用:
(1)可以避免類重名
有了包之后,類的全名稱就變?yōu)?#xff1a;包.類名
(2)分類組織管理眾多的類
例如:java.lang包,java.util包,java.io包…
(3)可以控制某些類型或成員的可見(jiàn)范圍
如果某個(gè)類型或者成員的權(quán)限修飾缺省的話,那么就僅限于本包使用
2、聲明包的語(yǔ)法格式:
package 包名;注意:
(1)必須在源文件的代碼首行
(2)一個(gè)源文件只能有一個(gè)
3、包的命名規(guī)范和習(xí)慣:
(1)所有單詞都小寫(xiě),每一個(gè)單詞之間使用.分割
(2)習(xí)慣用公司的域名倒置
例如:com.atguigu.xxx;
建議大家取包名時(shí)不要使用“java.xx"包
4、使用其他包的類:
前提:被使用的類或成員的權(quán)限修飾符是>缺省的
(1)使用類型的全名稱
例如:java.util.Scanner input = new java.util.Scanner(System.in);
(2)使用import 語(yǔ)句之后,代碼中使用簡(jiǎn)名稱
5、import語(yǔ)句
import 包.類名; import 包.*;注意:當(dāng)使用兩個(gè)不同包的同名類時(shí),例如:java.util.Date和java.sql.Date。
一個(gè)使用全名稱,一個(gè)使用簡(jiǎn)名稱
示例代碼:
package com.atguigu.test;import java.util.Scanner;public class Test{public static void main(String[] args){Scanner input = new Scanner(System.in);} }6.5 eclipse的使用
1、eclipse管理項(xiàng)目和代碼的結(jié)構(gòu)
workspace --> project --> 包–>類…
一個(gè)工作空間可以有多個(gè)項(xiàng)目。
2、快捷鍵
常規(guī)快捷鍵:
Ctrl + S:保存
Ctrl + C:復(fù)制
Ctrl + V:粘貼
Ctrl + X:剪切
Ctrl + Y:反撤銷
Ctrl + Z:撤銷
Ctrl + A:全選
eclipse中默認(rèn)的快捷鍵:
Ctrl + 1:快速修復(fù)
Alt + /:代碼提示
Alt + ?: Alt + Shift + / 方法的形參列表提示
Ctrl + D:刪除選中行
Ctrl + Alt + ↓:向下復(fù)制行
Ctrl + Alt + ↑:向上復(fù)制行
Alt + ↓:與下面的行交換位置
Alt + ↑:與下面的行交換位置
Ctrl + Shift + F:快速格式
Ctrl + /:單行注釋,再按一次取消
Ctrl + Shift + /:多行注釋
Ctrl + Shift +\:取消多行注釋
Shift + 回車:在光標(biāo)下一行插入新航開(kāi)始編輯
Ctrl + Shift + 回車:在光標(biāo)上一行插入新航開(kāi)始編輯
Alt + Shift + A:多行編輯 再按一次退出多行編輯模式
Alt + Shift + S:彈出自動(dòng)生成代碼的菜單選擇,包括自動(dòng)生成構(gòu)造器、get/set、equals…
Ctrl + Shift + O:快速導(dǎo)包
Ctrl + Shift + T:打開(kāi)某個(gè)類的源文件
Ctrl + O:打開(kāi)某個(gè)類型的摘要outline
3、快速開(kāi)發(fā)的代碼模板
代碼模板 + Alt + /
(1)main
public static void main(String[] args){
}
(2)sysout
System.out.println();
(3)for
for(int i=0; i<數(shù)組名.lenght; i++){
}
其他詳細(xì)使用見(jiàn)《JavaSE_柴林燕_相關(guān)工具.docx》
6.6 面向?qū)ο蟮幕咎卣髦?#xff1a;繼承
1、為什么要繼承?繼承的好處?(理解)
(1)代碼的復(fù)用
(2)代碼的擴(kuò)展
2、如何實(shí)現(xiàn)繼承?
語(yǔ)法格式:
【修飾符】 class 子類 extends 父類{}3、繼承的特點(diǎn)
(1)子類會(huì)繼承父類的所有特征(屬性、方法)
但是,私有的在子類中是不能直接使用的
(2)子類不會(huì)繼承父類的構(gòu)造器
因?yàn)?#xff0c;父類的構(gòu)造器是用于創(chuàng)建父類的對(duì)象的
(3)子類的構(gòu)造器中又必須去調(diào)用父類的構(gòu)造器
在創(chuàng)建子類對(duì)象的同時(shí),為從父類繼承的屬性進(jìn)行初始化用,可以借助父類的構(gòu)造器中的代碼為屬性賦值。
(4)Java只支持單繼承:一個(gè)子類只能有一個(gè)“直接”父類
(5)Java又支持多層繼承:父類還可以有父類,特征會(huì)代代相傳
(6)一個(gè)父類可以同時(shí)擁有很多個(gè)子類
6.7 關(guān)鍵字super
super關(guān)鍵字:引用父類的,找父類的xx
用法:
(1)super.屬性
當(dāng)子類聲明了和父類同名的成員變量時(shí),那么如果要表示某個(gè)成員變量是父類的,那么可以加“super.”
(2)super.方法
當(dāng)子類重寫(xiě)了父類的方法,又需要在子類中調(diào)用父類被重寫(xiě)的方法,可以使用"super."
(3)super()或super(實(shí)參列表)
super():表示調(diào)用父類的無(wú)參構(gòu)造
super(實(shí)參列表):表示調(diào)用父類的有參構(gòu)造
注意:
(1)如果要寫(xiě)super()或super(實(shí)參列表),必須寫(xiě)在子類構(gòu)造器的首行
(2)如果子類的構(gòu)造器中沒(méi)有寫(xiě):super()或super(實(shí)參列表),那么默認(rèn)會(huì)有 super()
(3)如果父類沒(méi)有無(wú)參構(gòu)造,那么在子類的構(gòu)造器的首行“必須”寫(xiě)super(實(shí)參列表)
6.8 方法的重寫(xiě)
1、方法的重寫(xiě)(Override)
當(dāng)子類繼承了父類的方法時(shí),又覺(jué)得父類的方法體的實(shí)現(xiàn)不適合于子類,那么子類可以選擇進(jìn)行重寫(xiě)。
2、方法的重寫(xiě)的要求
(1)方法名:必須相同
(2)形參列表:必須相同
(3)修飾符
? 權(quán)限修飾符: >=
(4)返回值類型
? 如果是基本數(shù)據(jù)類型和void:必須相同
? 如果是引用數(shù)據(jù)類型:<=
? 在Java中我們認(rèn)為,在概念范圍上:子類 <父類
3、重載(Overload)與重寫(xiě)(Override)的區(qū)別
? 重載(Overload):在同一個(gè)類中,方法名相同,形參列表不同,和返回值類型無(wú)關(guān)的兩個(gè)或多個(gè)方法。
? 重寫(xiě)(Override):在父子類之間。對(duì)方法簽名的要求見(jiàn)上面。
特殊的重載:
public class TestOverload {public static void main(String[] args) {B b = new B();//b對(duì)象可以調(diào)用幾個(gè)a方法b.a();b.a("");//從b對(duì)象同時(shí)擁有兩個(gè)方法名相同,形參不同的角度來(lái)說(shuō),算是重載} } class A{public void a(){//...} } class B extends A{public void a(String str){} }6.9 非靜態(tài)代碼塊
1、語(yǔ)法格式
【修飾符】 class 類名{{非靜態(tài)代碼塊} }2、作用
目的:在創(chuàng)建的過(guò)程中,為對(duì)象屬性賦值,協(xié)助完成實(shí)例初始化的過(guò)程
3、什么時(shí)候執(zhí)行?
(1)每次創(chuàng)建對(duì)象時(shí)都會(huì)執(zhí)行
(2)優(yōu)先于構(gòu)造器執(zhí)行
6.10 實(shí)例初始化過(guò)程
1、概念描述
-
實(shí)例初始化過(guò)程:實(shí)例對(duì)象創(chuàng)建的過(guò)程
-
實(shí)例初始化方法:實(shí)例對(duì)象創(chuàng)建時(shí)要執(zhí)行的方法
-
實(shí)例初始化方法的由來(lái):它是有編譯器編譯生成的
-
實(shí)例初始化方法的形式:()或(形參列表)
-
實(shí)例初始化方法的構(gòu)成:
①屬性的顯式賦值代碼
②非靜態(tài)代碼塊的代碼
③構(gòu)造器的代碼
其中
①和②按順序執(zhí)行,從上往下
③在①和②的后面
因此一個(gè)類有幾個(gè)構(gòu)造器,就有幾個(gè)實(shí)例初始化方法。
2、單個(gè)類實(shí)例初始化方法
示例代碼:
class Demo{{System.out.println("非靜態(tài)代碼塊1");}private String str = assign();//調(diào)用方法,來(lái)為str進(jìn)行顯式賦值public Demo(){System.out.println("無(wú)參構(gòu)造");}public Demo(String str){this.str = str;System.out.println("有參構(gòu)造");}{System.out.println("非靜態(tài)代碼塊2");}public String assign(){System.out.println("assign方法");return "hello";} }圖解:
3、父子類的實(shí)例初始化
注意:
(1)原先super()和super(實(shí)參列表)說(shuō)是調(diào)用父類的構(gòu)造器,現(xiàn)在就要糾正為調(diào)用父類的實(shí)例初始化方法了
(2)原先super()和super(實(shí)參列表)說(shuō)是必須在子類構(gòu)造器的首行,現(xiàn)在要糾正為必須在子類實(shí)例初始化方法的首行
結(jié)論:
(1)執(zhí)行順序是先父類實(shí)例初始化方法,再子類實(shí)例初始化方法
(2)如果子類重寫(xiě)了方法,通過(guò)子類對(duì)象調(diào)用,一定是執(zhí)行重寫(xiě)過(guò)的方法
示例代碼:
class Ba{private String str = assign();{System.out.println("(1)父類的非靜態(tài)代碼塊");}public Ba(){System.out.println("(2)父類的無(wú)參構(gòu)造");}public String assign(){System.out.println("(3)父類的assign()");return "ba";} } class Er extends Ba{private String str = assign();{System.out.println("(4)子類的非靜態(tài)代碼塊");}public Er(){//super() ==>調(diào)用父類的實(shí)例初始化方法,而且它在子類實(shí)例初始化方法的首行System.out.println("(5)子類的無(wú)參構(gòu)造");}public String assign(){System.out.println("(6)子類的assign()");return "er";} } class Test{public static void main(String[] args){new Er();//612645} }圖解:
6.11 面向?qū)ο蟮幕咎卣髦?#xff1a;多態(tài)
1、多態(tài):
語(yǔ)法格式:
父類 引用/變量 = 子類的對(duì)象;2、前提:
(1)繼承
(2)方法的重寫(xiě)
(3)多態(tài)引用
3、現(xiàn)象:
? 編譯時(shí)看左邊/“父類”,運(yùn)行時(shí)看右邊/“子類”。
? 編譯時(shí),因?yàn)榘锤割惥幾g,那么只能父類有的方法,子類擴(kuò)展的方法是無(wú)法調(diào)用的;
? 執(zhí)行時(shí)一定是運(yùn)行子類重寫(xiě)的過(guò)的方法體。
示例代碼:
class Person{public void eat(){System.out.println("吃飯");}public void walk(){System.out.println("走路");} } class Woman extends Person{public void eat(){System.out.println("細(xì)嚼慢咽的吃飯");}public void walk(){System.out.println("婀娜多姿走路");}public void shop(){System.out.println("買(mǎi)買(mǎi)買(mǎi)...");} } class Man extends Person{public void eat(){System.out.println("狼吞虎咽的吃飯");}public void walk(){System.out.println("大搖大擺的走路");}public void smoke(){System.out.println("吞云吐霧");} } class Test{public static void main(String[] args){Person p = new Woman();//多態(tài)引用p.eat();//執(zhí)行子類重寫(xiě)p.walk();//執(zhí)行子類重寫(xiě)//p.shop();//無(wú)法調(diào)用} }4、應(yīng)用:
(1)多態(tài)參數(shù):形參是父類,實(shí)參是子類對(duì)象
(2)多態(tài)數(shù)組:數(shù)組元素類型是父類,元素存儲(chǔ)的是子類對(duì)象
示例代碼:多態(tài)參數(shù)
class Test{public static void main(String[] args){test(new Woman());//實(shí)參是子類對(duì)象test(new Man());//實(shí)參是子類對(duì)象}public static void test(Person p){//形參是父類類型p.eat();p.walk();} }示例代碼:多態(tài)數(shù)組
class Test{public static void main(String[] args){Person[] arr = new Person[2];//多態(tài)數(shù)組arr[0] = new Woman();arr[1] = new Man();for(int i=0; i<arr.length; i++){all[i].eat();all[i].walk();}} }5、向上轉(zhuǎn)型與向下轉(zhuǎn)型:父子類之間的轉(zhuǎn)換
(1)向上轉(zhuǎn)型:自動(dòng)類型轉(zhuǎn)換
? 當(dāng)把子類的對(duì)象賦值給父類的變量時(shí)(即多態(tài)引用時(shí)),在編譯時(shí),這個(gè)對(duì)象就向上轉(zhuǎn)型為父類。此時(shí)就看不見(jiàn)子類“特有、擴(kuò)展”的方法。
(2)向下轉(zhuǎn)型:強(qiáng)制轉(zhuǎn)換。有風(fēng)險(xiǎn),可能會(huì)報(bào)ClassCastException異常。
? 當(dāng)需要把父類的變量賦值給一個(gè)子類的變量時(shí),就需要向下轉(zhuǎn)型。
? 要想轉(zhuǎn)型成功,必須保證該變量中保存的對(duì)象的運(yùn)行時(shí)類型是<=強(qiáng)轉(zhuǎn)的類型
示例代碼:
class Person{//方法代碼省略... } class Woman extends Person{//方法代碼省略... } class ChineseWoman extends Woman{//方法代碼省略... } public class Test{public static void main(String[] args){//向上轉(zhuǎn)型Person p1 = new Woman();//向下轉(zhuǎn)型Woman m = (Woman)p1; //p1變量中實(shí)際存儲(chǔ)的對(duì)象就是Woman類型,和強(qiáng)轉(zhuǎn)的Woman類型一樣//向上轉(zhuǎn)型Person p2 = new ChineseWoman();//向下轉(zhuǎn)型Woman w2 = (Woman) p2; //p2變量中實(shí)際存儲(chǔ)的對(duì)象是ChineseWoman類型,強(qiáng)制的類型是Woman,ChineseWoman<Woman類型 }}6、instanceof
表達(dá)式語(yǔ)法格式:
對(duì)象/變量 instanceof 類型運(yùn)算結(jié)果:true 或 false
作用:
用來(lái)判斷這個(gè)對(duì)象是否屬于這個(gè)類型,或者說(shuō),是否是這個(gè)類型的對(duì)象或這個(gè)類型子類的對(duì)象
示例代碼:
class Person{//方法代碼省略... } class Woman extends Person{//方法代碼省略... } class ChineseWoman extends Woman{//方法代碼省略... } public class Test{public static void main(String[] args){Person p = new Person();Woman w = new Woman();ChineseWoman c = new ChineseWoman();if(p instanceof Woman){//false}if(w instanceof Woman){//true}if(c instanceof Woman){//true}}}總結(jié)
以上是生活随笔為你收集整理的零基础学java(6)——面向对象的基本特征的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 程序猿笑话集合
- 下一篇: 干货深挖!从写简历,到面试、谈薪酬的那些