JavaSE (Java基礎):面向對象(下)

8.7 多態

? ? ? ? 什么是多態? 即同一方法可以根據發送對象的不同而采用多種不同的方式。

? ? ? ? 一個對象的實際類型是確定的,但可以指向對象的引用的類型有很多。在句話我是這樣理解的:

? ? ? ? 在實例中使用方法都是根據他最開始將類實例化最左邊的類型來定的,但是父類引用指向對象子類的話,如果子類有重寫的方法(即方法名與父類相同的方法但是內容不一定相同),那么執行的子類所重寫的方法,如果沒有重寫的方法,就執行父類的。在這句話中所說的“但可以指向對象的引用的類型有很多”,意思是一個父類可以有很多的子類,都可以使用他們的重寫方法。

示例:

父類Person:

package com.oop.demo06;public class Person {public void run(){System.out.println("run");}}

子類Student:

package com.oop.demo06;public class Student extends Person {@Overridepublic void run() {System.out.println("son");}public void eat(){System.out.println("eat");}
}

?測試類:

import com.oop.demo06.Student;
import com.oop.demo06.Person;public class AppLication{public static void main(String[] args) {// 一個對象的實際類型是確定的// 可以指向的引用類型就不確定了:父類的引用指向子類// Student 能調用的方法都是自己的或者繼承父類的!Student S1 = new Student();// Person是父類型的類,可以指向子類,但是不能調用子類獨有的方法Person S2 = new Student();Object S3 = new Student();S2.run(); // 子類重寫了父類的方法,執行子類的方法S1.run();// 對象能執行能執行哪些方法,主要看對象的左邊類型,和右邊關系不大!((Student) S2).eat(); //將S2的類型強制轉換為Student,就可以調用方法了!S1.eat();}
}/*多態注意事項:1. 多態是方法的多態,屬性沒有多態2. 父類和子類要有聯系    類型轉換異常!     ClassCastException!3. 存在條件:    繼承關系,方法需要重寫,父類引用指向子類對象!1. static 方法,屬于類,它不屬于實例2. final 常量;3. private 方法*/


8.8 instanceof 和 類型轉換

? ? ? ? instanceof 使用的方法格式:

? ? ? ? 【實例的名稱? ? ? ? instanceof? ? ? ? 類的類型名稱】,判斷一個對象是什么類型,就是判讀兩個類型的對象是否有父子關系,有的話就返回Ture,沒有就是返回False。

? ? ? ? 使用?【實例的名稱? ? ? ? instanceof? ? ? ? 類的類型名稱】時,能否編譯看的是實例化對象的類型名,輸出的結果看的是實例化對象時最右邊的所實例的對象值。

首先父類是Person,其余的類:Student、Teacher是Person的子類。

import com.oop.demo06.Student;
import com.oop.demo06.Person;
import com.oop.demo06.Teacher;public class AppLication{public static void main(String[] args) {// Object > Person > Student// Object > Person > Tercher// Object > StringObject object = new Student();System.out.println(object instanceof Student);  // trueSystem.out.println(object instanceof Person);   // trueSystem.out.println(object instanceof Object);   // trueSystem.out.println(object instanceof Teacher);  // falseSystem.out.println(object instanceof String);   // falseSystem.out.println("=====================================");Person person = new Student();System.out.println(person instanceof Student);  // trueSystem.out.println(person instanceof Person);   // trueSystem.out.println(person instanceof Object);   // trueSystem.out.println(person instanceof Teacher);  // false
//        System.out.println(person instanceof String);   // 編譯時就報錯了System.out.println("=====================================");Student student = new Student();System.out.println(student instanceof Student);  // trueSystem.out.println(student instanceof Person);   // trueSystem.out.println(student instanceof Object);   // true
//        System.out.println(student instanceof Teacher);  // 編譯時就報錯
//        System.out.println(student instanceof String);   // 編譯時就報錯}
}

類型轉換(關于對象的類型):

import com.oop.demo06.Student;
import com.oop.demo06.Person;
import com.oop.demo06.Teacher;public class AppLication{public static void main(String[] args) {// 類型之間的轉化: 父   子// 高              低Person student = new Student();// student 將這個對象轉換為Student的對象類型// 我們就可以使用這個對象類型中的方法了((Student) student).go(); // 這個是高轉低需要強制轉換// 如果是低轉高,子類轉換為父類不需要強制轉換,可能會丟失一些方法!Student student1 = new Student();Person person = student1;}
}

?

8.9 static 關鍵字詳解

? ? ? ? static修飾符有著靜態的意思,使用他代表著這個方法或者元素在類中是與類一起加載的。

package com.oop.demo07;// static
public class Student {private static int age; // 靜態變量     多線程private double score; // 非靜態變量public static void main(String[] args) {Student s1 = new Student();System.out.println(s1.score);System.out.println(age);}
}

????????在類中,還有著代碼塊這種東西,他的優先級比這個構造器還高。

package com.oop.demo07;public class Person {//    {
//        // 代碼塊(匿名代碼塊)
//    }
//
//    static {
//        // 靜態代碼塊
//    }// 第二個執行,可以用來賦初始值{System.out.println("匿名代碼塊");}// 第一個執行,與類一起加載,只執行一次,不管你實例化多少個對象static {System.out.println("靜態代碼塊");}// 第三個執行,構造器public Person(){System.out.println("構造方法");}public static void main(String[] args) {Person person = new Person();System.out.println("==============");Person person1 = new Person();}
}

????????在Java中有許許多多的有用又有趣的類,在這些類中有著許多有用的靜態方法,可以使用下面這個方法直接調用,想查看類的調用位置直接ctrl+左鍵就行。?

package com.oop.demo07;// 導入其他包中的類的靜態方法
import static java.lang.Math.random; // 返回一個隨機數(0,1)
import static java.lang.Math.PI;    // 圓周率
public class Test {public static void main(String[] args) {System.out.println(random());System.out.println(PI);}
}

需要注意的是:

? ? ? ? 如果給這些東西使用了常量修飾符final,那么他將會是唯一的,無無法擁有子類。?

?


8.10 抽象類

? ? ? ? 什么是抽象類?abstract?修飾符可以用來修飾方法也可以修飾類,如果修飾方法,那么該方法就是抽象方法;如果修飾類,那么就是抽象類。

? ? ? ? 抽象類中可以沒有抽象方法,但是有抽象方法的類一定要聲明為抽象類。

? ? ? ? 抽象類,不能用new關鍵字來創建對象,它是用來讓子類繼承的。

? ? ? ? 抽象方法,只有方法的聲明,沒有方法的實現,它是用來讓子類實現的。

? ? ? ? 子類繼承了抽象類,那么他就必須要實現抽象類沒有實現的抽象方法,否則該子類也要聲明為抽象類。

抽象父類:

package com.oop.demo08;//abstract 抽象類:類
public abstract class Action {// 約束~有人幫我們實現~// 這個就是抽象的方法,我們只定義了方法名字,他的具體功能由別人實現public abstract void doSomething();// 1.   不能new這個抽象類,只能靠子類去實現它;約束!// 2.   抽象類中可以寫普通的方法// 3.   抽象方法必須在抽象類中// 抽象的抽象:約束~
}

?抽象父類的子類,他里面有重寫父類的方法:

package com.oop.demo08;// 抽象類的所有方法,繼承了他的子類,都必須要實現他的方法
public class A extends Action {@Overridepublic void doSomething() {}
}

?

?


8.11 接口的定義與實現

?

接口的作用:1.  約束2.  定義一些方法,讓不同的人實現3.  public abstract4. public static final5. 接口不能實例化,接口中沒有構造方法6. implements可以實現多個接口7. 必須要重寫接口中的方法

接口UserService:

package com.oop.demo09;//interface 定義接口的修飾符(關鍵字),接口都需要有實現類
public interface UserService {// 接口中定義就是常量    public static finalint AGE = 9999;// 接口中的所有定義的方法其實都是抽象的   public abstractvoid add(String name);void delete(String name);void update(String name);void query(String name);
}

?接口TimeService:

package com.oop.demo09;public interface TimeService {void timer();
}

????????每個接口都需要有實現類。我是這樣理解的,每個接口就是定義一堆方法的名字與類型就是沒有里面的內容,而他們需要有實現類來實現里面的內容,需要用到關鍵字implements:

package com.oop.demo09;// 類 可以實現接口 implements 接口
// 實現了接口的類,就需要重新接口中的方法// 利用接口實現多繼承
public class UersServiceImpl implements UserService,TimeService{@Overridepublic void add(String name) {}@Overridepublic void delete(String name) {}@Overridepublic void update(String name) {}@Overridepublic void query(String name) {}@Overridepublic void timer() {}
}

?

?


8.12 N種內部類

package com.oop.demo10;public class Outer {private int id = 14203;public void out(){System.out.println("這是外部類的方法");}public class Inner{public void in(){System.out.println("這是內部類的方法");}// 內部類能夠獲得外部類的私有屬性public void getID(){System.out.println(id);}}
}
import com.oop.demo10.Outer;import java.util.Optional;public class AppLication{public static void main(String[] args) {Outer outer = new Outer();// 通過這個外部類來實例化內部類Outer.Inner inner = outer.new Inner();inner.in();inner.getID();}
}

?局部內部類:

package com.oop.demo10;public class Outer {// 局部內部類,在方法里的屬性也叫做局部變量public void method(){class Inner{}}
}

匿名內部類:

package com.oop.demo10;public class Test {public static void main(String[] args) {// 沒有名字初始化類,匿名類// 不用將實例保存在對象中new Apple();new Apple().eat();// 甚至可以匿名一個接口new Userservice(){@Overridepublic void happle() {}};}
}class Apple{public void eat(){System.out.println("eat");}
}interface Userservice{void happle();
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40128.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40128.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40128.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

消息中間件ApacheKafka在windows簡單安裝

一.背景 之前公司需要API網關管理軟件ApacheShenYu,我相信把調用的記錄都存到一個數據庫。他支持日志推送到kafka,所以,我準備嘗試一下通過kafka接收調用的日志信息。第一步,當然是安裝kafka了。 二.ApacheKafka的下載 打開下載…

【C++】 解決 C++ 語言報錯:Memory Leak

文章目錄 引言 內存泄漏(Memory Leak)是 C 編程中常見且嚴重的內存管理問題之一。當程序分配了內存而沒有正確釋放,導致內存無法被重新利用時,就會發生內存泄漏。這種錯誤會導致程序占用越來越多的內存,最終可能導致系…

關于人情世故的小討論

大家好,我是阿趙。 ??最近國內籃球界內出了不少事情,讓人對籃球這項運動產生了很多疑問。 ??去年的CUBA,擁有全國最好生源的清華大學居然輸給了連985 、211都不是的廣東工業大學。作為廣工的畢業生,我知道廣工的籃球一直都很強…

Unity PC和Android端的數據存儲和讀取

使用Resource&#xff1a; 提示&#xff1a;使用resouce打包后會被壓縮進.resources文件中&#xff0c;意味著它是只讀文件&#xff0c;且必須使用resouce.load加載&#xff1a; /// <summary>/// 全平臺使用/// </summary>/// <typeparam name"T"&g…

論文學習——動態多目標優化的一種新的分位數引導的對偶預測策略

論文題目&#xff1a;A novel quantile-guided dual prediction strategies for dynamic multi-objective optimization 動態多目標優化的一種新的分位數引導的對偶預測策略&#xff08;Hao Sun a,b, Anran Cao a,b, Ziyu Hu a,b, Xiaxia Li a,b, Zhiwei Zhao c&#xff09;In…

“免費”的可視化大屏案例分享-智慧園區綜合管理平臺

一.智慧園區是什么&#xff1f; 智慧園區是一種融合了新一代信息與通信技術的先進園區發展理念。它通過迅捷信息采集、高速信息傳輸、高度集中計算、智能事務處理和無所不在的服務提供能力&#xff0c;實現了園區內及時、互動、整合的信息感知、傳遞和處理。這樣的園區旨在提高…

自定義注解-手機號驗證注解

注解 package com.XX.assess.annotation;import com.XX.assess.util.MobileValidator;import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*;/*** 手機號校驗注解* @author super*/ @Retention(RetentionPolicy.RUNTIME) @Ta…

正確使用Pytorch Geometric打開Cora(Planetoid)數據集

文章目錄 關于報錯&#xff08;"Cannot connect to host"&#xff09;解決方法 關于報錯&#xff08;“Cannot connect to host”&#xff09; 我們在使用PyG調用Planetoid數據集的時候&#xff0c;常會碰到如下報錯&#xff1a; 解決方法就是手動下載這個數據集。…

在 AWS Lambda 中使用 Flask 應用

本文將介紹如何在 AWS Lambda 中創建和部署一個使用 Flask 框架的應用。 1. 創建 Lambda 函數 首先,在 AWS Lambda 控制臺創建一個新的函數,命名為 ??flask-app??。 2. 準備 Flask 層 為了在 Lambda 中使用 Flask,我們需要創建一個包含 Flask 庫的層。按照以下步驟操…

java中如何使用ffmpeg命令來實現視頻編碼轉換

在Java中使用FFmpeg命令來進行視頻編碼轉換&#xff0c;可以通過調用系統命令來執行FFmpeg命令。下面是一個使用FFmpeg進行視頻轉碼的示例代碼&#xff1a; import java.io.BufferedReader; import java.io.InputStreamReader;public class FFmpegVideoConverter {public stat…

前端播放RTSP視頻流,使用FLV請求RTSP視頻流播放(Vue項目,在Vue中使用插件flv.js請求RTSP視頻流播放)

簡述&#xff1a;在瀏覽器中請求 RTSP 視頻流并進行播放時&#xff0c;直接使用原生的瀏覽器 API 是行不通的&#xff0c;因為它們不支持 RTSP 協議。為了解決這個問題&#xff0c;開發者通常會選擇使用像 flv.js 這樣的庫&#xff0c;它專為在瀏覽器中播放 FLV 和其他流媒體格…

MySQL 代理層:ProxySQL

文章目錄 說明安裝部署1.1 yum 安裝1.2 啟停管理1.3 查詢版本1.4 Admin 管理接口 入門體驗功能介紹3.1 多層次配置系統 讀寫分離將實例接入到代理服務定義主機組之間的復制關系配置路由規則事務讀的配置延遲閾值和請求轉發 ProxySQL 核心表mysql_usersmysql_serversmysql_repli…

Java實現日志全鏈路追蹤.精確到一次請求的全部流程

廣大程序員在排除線上問題時,會經常遇見各種BUG.處理這些BUG的時候日志就格外的重要.只有完善的日志才能快速有效的定位問題.為了提高BUG處理效率.我決定在日志上面優化.實現每次請求有統一的id.通過id能獲取當前接口的全鏈路流程走向. 實現效果如下: 一次查詢即可找到所有關…

自定義一個背景圖片的高度,隨著容器高度的變化而變化,小于圖片的高度時裁剪,大于時拉伸100%展示

1、通過js創建<image?>標簽來獲取背景圖片的寬高比&#xff1b; 2、當元素的高度大于原有比例計算出來的高度時&#xff0c;背景圖片的高度拉伸自適應100%&#xff0c;否則高度為auto&#xff0c;會自動被裁減 3、背景圖片容器高度變化時&#xff0c;自動計算背景圖片的…

Android network - NUD檢測機制(Android 14)

Android network - NUD檢測機制 1. 前言2. 源碼分析2.1 ClientModeImpl2.2 IpClient2.3 IpReachabilityMonitor 1. 前言 在Android系統中&#xff0c;NUD&#xff08;Neighbor Unreachable Detection&#xff09;指的是網絡中的鄰居不可達檢測機制&#xff0c;它用于檢測設備是…

數據驅動測試實踐:Postman 中使用數據文件的指南

Postman 是一個強大的 API 開發和測試工具&#xff0c;它支持數據驅動測試&#xff0c;允許測試者使用外部數據文件來驅動測試&#xff0c;實現測試用例的參數化。數據驅動測試可以顯著提高測試效率&#xff0c;減少重復工作&#xff0c;并允許測試用例覆蓋更廣泛的輸入場景。本…

一文了解常見DNS問題

當企業的DNS出現故障時&#xff0c;為不影響企業的正常運行&#xff0c;團隊需要能夠快速確定問題的性質和范圍。那么有哪些常見的DNS問題呢&#xff1f; 域名解析失敗&#xff1a; 當您輸入一個域名&#xff0c;但無法獲取到與之對應的IP地址&#xff0c;導致無法訪問相應的網…

【代碼隨想錄算法訓練營第五十九天|卡碼網110.字符串接龍、105.有向圖的完全可達性、106.島嶼的周長】

文章目錄 卡碼網110.字符串接龍105.有向圖的完全可達性106.島嶼的周長 卡碼網110.字符串接龍 這題是在字符串上進行廣搜&#xff0c;字符串廣搜是對一個字符串按照位置來搜索&#xff0c;與原字符串只有一個位置字符不同那么就是在原字符串的基礎上距離加1。因此需要一個字典來…

獲取VC賬號,是成為亞馬遜供應商的全面準備與必要條件

成為亞馬遜的供應商&#xff0c;擁有VC&#xff08;Vendor Central&#xff09;賬號&#xff0c;是眾多制造商和品牌所有者的共同目標。這不僅代表了亞馬遜對供應商的高度認可&#xff0c;也意味著獲得了更多的銷售機會和更廣闊的市場前景。 全面準備與必要條件是獲取VC賬號的關…

代碼轉換成AST語法樹移除無用代碼console.log、import

公司中代碼存在大量,因此產生 可以使用 @babel/parser 解析代碼生成 AST (抽象語法樹),然后使用 @babel/traverse 進行遍歷并刪除所有的 console.log 語句,最后使用 @babel/generator 生成修改后的代碼。 這里有一個網址,可以線上解析代碼轉換成AST語法樹: https://astex…