日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

零基础学java(6)——面向对象的基本特征

發(fā)布時(shí)間:2024/3/13 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 零基础学java(6)——面向对象的基本特征 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第六章 面向?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ì)象

//調(diào)用無(wú)參構(gòu)造創(chuàng)建對(duì)象 類名 對(duì)象名 = new 類名();//調(diào)用有參構(gòu)造創(chuàng)建對(duì)象 類名 對(duì)象名 = new 類名(實(shí)參列表);

(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。