[轉載] java-繼承和多態

參考鏈接: Java中的繼承

繼承:?

繼承就是保持已有類的特性而構造新類的過程。繼承后,子類能夠利用父類中定義的變量和方法,就像它們屬于子類本身一樣。?

單繼承:在類層次中,子類只繼承一個父類的數據結構和方法,一個類只有一個父類?

多繼承:在類層次中,子類繼承了多個父類的數據結構和方法,一個類允許有多個繼承?

(java支持多層繼承)?

//父類

public class file{

? ? public long size;? ? ?//文件大小

? ? public String name;? ? //文件名

? ? public void info()? ? //顯示文件信息

? ? {

? ? ? ? System.out.println(name + " " + size);

? ? }

}

//子類

public class videofile extends file()

{

? ? //父類的public成員自動繼承

? ? //private不能被繼承,子類無權訪問? ??

? ? //只需要添加子類的特性

? ? public int duration //時長? ??

? ? public void play()

? ? {

? ? ? ?System.out.println("播放" + this.name);

? ? }

? ? public void stop()

? ? {

? ? ? ? System.out.println("停止" + this.name);

? ? }

}?

成員變量隱藏:是指在子類中定義了一個與直接超類的某個成員變量同名的成員變量,從而使超類中的那個成員變量不能直接被子類繼承。?

當成員變量隱藏時,在超類類題代碼中用簡單變量命名訪問的一定是超類中的成員變量,而在子類類體代碼中用簡單變量名訪問的則一定是在子類中的成員變量?

可以用下列各式訪問超類中被隱藏的成員變量?

super.<變量名>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 在子類類體里,訪問直接超類中被隱藏的成員變量?

((<超類名>)<子類實例引用>).變量名? ? 訪問指定超類中被隱藏的成員變量?

<超類名>.<變量名>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?訪問指定超類中被隱藏的類變量?

public class number {

? ? int x;

? ? static int y; //類變量

? ? void set(int a)

? ? {

? ? ? ? x = a;

? ? ? ? y = a;

? ? }

? ? void print()

? ? {

? ? ? ? System.out.println("x" + "\t" + x);

? ? }

}

?

public class newnumber extends number {

? ? int x;

? ? static int y;

? ? void newset(int a)

? ? {

? ? ? ? x = a;

? ? ? ? y = a;

? ? }

? ? void newprint()

? ? {

? ? ? ? System.out.println("x" + "\t" + x);? ? ?//x = 100

? ? ? ? System.out.println("y" + "\t" + y);? ? ?//y = 100

? ? ? ? System.out.println("x" + "\t" + super.x);? ? ?//x = 10

? ? ? ? //在子類類體里,訪問直接超類中被隱藏的成員變量

? ? ? ? System.out.println("y" + "\t" + super.y);? ? ?//y = 10

? ? }

}

?

public class HelloWorld {

? ? public static void main(String[] args) {

? ? ? ? newnumber n = new newnumber();

? ? ? ? n.set(10);

? ? ? ? n.print();?

? ? ? ? n.newset(100);

? ? ? ? n.newprint();

? ? ? ? System.out.println("y" + "\t" + number.y);? ? ?//y = 10

? ? ? ? System.out.println("x" + "\t" + ((number)n).x);? ? ?//x= 10

? ? }

}?

若子類和父類里都有相同的名字定義的方法,但是實現不一致。覆蓋的方法是按照子類中重定義的方法進行調用,而繼承的方法直接調用父類的方法?

覆蓋 (重寫)(Override):?

1、方法名稱要一樣?

2、返回值數據類型要一樣?

3、所使用的參數列表要一樣,參數列表包括參數個數及每個參數的數據類型,不包括參數的變量名?

4、訪問修飾符只能越來越開放,不能越來越封閉?

public class file {

? ? public long size;

? ? public String name;

? ? public void info()

? ? {

? ? ? ? System.out.println(name +? "\t" + size);

? ? }

}

?

public class vediofile extends file{

? ? public int duration;

? ? public void play()

? ? {

? ? ? ? System.out.println("播放" + this.name);

? ? }

? ? public void stop()

? ? {

? ? ? ? System.out.println("停止" + this.name);

? ? }

? ? ?//Override 覆蓋

? ? public void info() {

? ? ? ? ?System.out.println("name : " + name + "? size : " + size + " time : " + time);

? ? ? ? }

}

?

public class HelloWorld {

? ? public static void main(String[] args) {

? ? ? ? vediofile v = new vediofile();

? ? v.size = 20000;

? ? v.name = "abc.mp4";

? ? v.duration = 70;

? ? v.info();?

? ? //name : abc.mp4? size : 20000? time : 70

? ? }

}?

泛化:?

抽取調整代碼到父類的過程,稱為泛化?

Eclipse自動添加覆蓋功能:?

點擊source,選擇Override/Implement Methods?

?

選擇要覆蓋的方法?

?

創建完成?

?

子類可以選擇完全重寫或者在父類方法中補充?

public void info() {

? ? ? ? // TODO Auto-generated method stub

? ? ? ? super.info();? ? //調用父類的實現

? ? ? ? System.out.println("time : " + duration);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? //name : abc.mp4? size : 20000? time : 70

? ? }?

構造方法的繼承:?

創建子類對象時,父類的構造方法會被自動調用?

public class parent {

? ? public parent()

? ? {

? ? ? ? System.out.println("父類構造...");

? ? }

}

?

public class child extends parent {

? ? public child()

? ? {

? ? ? ? System.out.println("子類構造...");

? ? }

}

?

public class HelloWorld {

? ? public static void main(String[] args) {

? ? ? ? child c = new child();????????????

? ? }

}?

?

若父類有很多個構造方法,可以在子類里顯示指定用哪個構造方法?

public class parent {

? ? private int a;

? ? public parent()? ? //默認構造

? ? {

? ? ? ? System.out.println("父類構造...");

? ? }

? ? public parent(int a)? ? ?//帶參構造

? ? {

? ? ? ? this.a = a;

? ? ? ? System.out.println("帶參父類構造...");

? ? }

}

?

public class child extends parent {

? ? public child()

? ? {

? ? ? ? super(23);? ? //調用帶參構造

? ? ? ? System.out.println("子類構造...");

? ? }

}

?

public class HelloWorld {

? ? public static void main(String[] args) {

? ? child c = new child();????

? ? }

}?

單根繼承:Java語言里,一個類只能繼承一個父類?

如果一個類沒有指定父類,則它的默認父類就是Object?

toString() 方法返回此對象本身(它已經是一個字符串)?

public class Student {

? ? public String id;

? ? public String name;

? ? public boolean sex;

? ? @Override

? ? public String toString() {

? ? ? ? String s = " 學號 : " + id + " 姓名 : " + name;

? ? ? ? if(sex)

? ? ? ? {

? ? ? ? ? ? s = s + "(男)";

? ? ? ? }

? ? ? ? else

? ? ? ? {

? ? ? ? ? ? s = s + "(女)";

? ? ? ? }

? ? ? ? return s;

? ? }?

}

?

public class HelloWorld {

? ? public static void main(String[] args) {

? ? ? ? Student s = new Student();

? ? ? ? s.id = "20003";

? ? ? ? s.name = "lisi";

? ? ? ? System.out.println(s.toString());? ? // 學號 20003 姓名 lisi(女)

? ? }

}?

多態?

1、使用父類類型的引用只想子類的對象?

2、該引用只能調用父類中定義的方法和變量?

3、如果子類中重寫(覆蓋)了父類中的一個方法,那么在調用這個方法的時候,將會調用子類中的這個方法?

4、變量不能被重寫(覆蓋),重寫只針對方法,如果在子類中重寫了父類的變量,編譯時會報錯?

子類轉成父類是可以的(隱式轉換)?

當調用一個方法的時候,不是看引用類型,而是看對象的實際類型。?

轉化原則?

子類對象可以當作父類對象使用?

父類對象不能當作子類對象使用?

如果父類引用實際只想的是子類對象,那么該父類引用可以通過強制轉化成子類對象使用?

public class file {

? ? public long size;

? ? public String name;

? ? public void info()

? ? {

? ? ? ? System.out.println("name : " + name + "? size : " + size);

? ? }

}

?

public class vediofile extends file{

? ? public int duration;

? ? public void play()

? ? {

? ? ? ? System.out.println("播放" + this.name);

? ? }

? ? public void stop()

? ? {

? ? ? ? System.out.println("停止" + this.name);

? ? }

? ? @Override

? ? public void info() {

? ? ? ? // TODO Auto-generated method stub

? ? ? ? super.info();

? ? ? ? System.out.println("time : " + duration);

? ? }????

}

?

public class HelloWorld {

? ? public static void main(String[] args) {

? ? ? ? vediofile v = new vediofile();

? ? ? ? v.size = 20000;

? ? ? ? v.name = "abc.mp4";

? ? ? ? v.duration = 70;

? ? ? ? file f = v;

? ? ? ? f.info();? ? ?//調用的子類的info

? ? }

}?

覆蓋是動態綁定?

重載是靜態綁定?

用instanceof操作符測試一個對象是否是一個類的實例?

instanceof返回值是true或false?

對象名 instanceof 類名 -> true or false?

class SchoolMember

{??

? ? public void introduce()

? ? {

? ? ? ? System.out.println("a schoolmember");

? ? }

?}

?

class Student extends SchoolMember

{?

? ? public void study()

? ? {

? ? ? ? System.out.println("study");

? ? }? ?????

}

class Teacher extends SchoolMember

{

? ? public void teach()

? ? {

? ? ? ? System.out.println("teach");

? ? }

}

class Test

{

? ? static void use(SchoolMember obj)

? ? {

? ? ? ? obj.introduce();

? ? ? ? //判斷實例化的對象是Student還是Teacher

? ? ? ? if(obj instanceof Student)? ? ?

? ? ? ? {

? ? ? ? ? ? Student s = (Student)obj;

? ? ? ? ? ? s.study();

? ? ? ? }

? ? ? ? if(obj instanceof Teacher)

? ? ? ? {

? ? ? ? ? ? Teacher t = (Teacher)obj;

? ? ? ? ? ? t.teach();

? ? ? ? }

? ? }

? ? public static void main(String[] args)

? ? {

? ? ? ? Student s1 = new Student();

? ? ? ? //Teacher t1 = new Teacher();

? ? ? ? use(s1);

? ? ? ? //use(t1);

? ? }

}

?

eg:

a schoolmember

study

?

方法看右側,屬性看左側?

先訪問父類的構造方法再訪問子類的構造方法?

eg1:?

class A

? ? {? ? ?String? s="class A";? ? }

? ? class B extends A

? ? {? ? ?String? s="class B";? ? }

? ? public class TypeConvert

? ? {

? ? ? ? public static void main(String args[])

? ? ? ? {

? ? ? ? ? ? B b1,b2=new B();

? ? ? ? ? ? A a1,a2;

? ? ? ? ? ? a1=(A)b2;

? ? ? ? ? ? a2=b2;

? ? ? ? ? ? System.out.println(a1.s);? ? //class A

? ? ? ? ? ? System.out.println(a2.s);? ? //class A

? ? ? ? ? ? b1=(B)a1;

? ? ? ? ? ? System.out.println(b1.s);? ? //class B

? ? ? ? ? ? System.out.println(b2.s);? ? //class B

?

? ? ? ? }

? ? }

?

?

eg2 :?

class A

? ? {? ? ?String s="class A";??

? ? ? ? ? void show()? ? {? ? ? ?System.out.println(s);}

? }

? ? class B extends A

? ? {? ? ?String s="class B";? ??

? ? ? ? void show()? ? ? {? ?System.out.println(s);}

}

? ? public class TypeConvert

? ? {? ? public static void main(String args[])? ? ? ? {

? ? ? ? ? ? B b1;

? ? ? ? ? ? B b2=new B();

? ? ? ? ? ? A a1,a2;

? ? ? ? ? ? a1=(A)b2;

? ? ? ? ? ? a2=b2;

? ? ? ? ? ? System.out.println(a1.s);? ? //class A

? ? ? ? ? ? a1.show();? ? //class B

? ? ? ? ? ? System.out.println(a2.s);? ? //class A

? ? ? ? ? ? a2.show();? ? //class B

? ? ? ? ? ? b1=(B)a1;

? ? ? ? ? ? System.out.println(b1.s);? ? //class B

? ? ? ? ? ? b1.show();? ? //class B

? ? ? ? ? ? System.out.println(b2.s);? ? //class B

? ? ? ? ? ? b2.show();? ? //class B

? ? ? ? }

? ? }?

eg3:?

class A

{

? ? public A()

? ? {

? ? ? ? System.out.println(“The default constructor of A is invoked”);

}

}

class B extends A

{

? ? public B()

? ? {

? ? }

}

public class C

{

? ? public static void main(String[] args)

? ? {

? ? ? ? B b = new B();

? ? }

}

輸出 The default constructor of A is invoked

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

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

相關文章

走進SQL Server 2005:備份與恢復功能

每當有任何新的軟件發布的時候&#xff0c;你通常都會發現一些你從來不知道或者從來不知道你需要的新的特性。SQL Server 2000中存在的許多的備份和恢復特性都同樣保留在了SQL Server 2005中&#xff0c;但是有一些新的提高同樣值得你的關注。 鏡像備份 SQL Server 2005讓你可以…

[轉載] Java對返回值的封裝

參考鏈接&#xff1a; 用Java封裝 定義自己所需要的返回值類型 public class CodeMsg implements Cloneable { private int retCode; private String message; // 通用異常 public static CodeMsg SUCCESS new CodeMsg(0, "success"); public static CodeMsg EMP…

stateful set 學習筆記

2019獨角獸企業重金招聘Python工程師標準>>> 1、創建pv # cat pv.yaml kind: PersistentVolume apiVersion: v1 metadata:name: task-pv-volumelabels:type: local spec:capacity:storage: 3GiaccessModes:- ReadWriteOncehostPath:path: "/tmp/data" 2、…

[轉載] Java中對象數組的使用

參考鏈接&#xff1a; 如何在Java中交換或交換對象 Java對象數組使用 一、Java數組的使用二、Java的對象數組2.1 問題提出2.2 問題解析2.3 問題拆分2.4 代碼實現 一、Java數組的使用 對象數組其實和Java的數組類似的&#xff0c;所以要很清楚Java的數組是如何使用的&#xf…

Python自動化開發學習13-聯合唯一

聯合唯一 聯合唯一&#xff0c;就是一個表中的多個字段的組合需要唯一。 使用mysql語句創建 比如創建一張hosts表&#xff0c;記錄登錄的ip地址或者hostname&#xff08;表中對應字段host&#xff09;和 端口號&#xff08;表中對應字段port&#xff09;&#xff0c;要求host 和…

[轉載] Java獲取泛型T的類型 T.class

參考鏈接&#xff1a; Java中的抽象 import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class Main{ public static void main(String[] args) { Foo<String> foo new Foo<String>(){}; // 在類的外部這樣獲取 Type type ((…

自定義控件---重寫Listbox實現item圖標變換和item點擊事件

博客開通有一陣了&#xff0c;就是沒有時間寫&#xff0c;遺憾啊。&#xff01; 這幾天做了個排序的自定義控件&#xff0c;在listbox item里放是button 并支持圖標的交替變換 效果如下&#xff1a; 把代碼貼上&#xff1a;1using System; 2using System.Collections.…

[轉載] Spring面試題整理

參考鏈接&#xff1a; Java中的動態方法Dispatch和運行時多態 Spring面試題整理 2018年03月07日 21:11:46 hrbeuwhw 閱讀數&#xff1a;49116 Spring 概述 1. 什么是spring? spring 是個Java企業級應用的開源開發框架。Spring主要用來開發Java應用&#xff0c;但是有…

ansible: Linux批量管理神器

我們已經知道&#xff0c;基于集群可實現服務器橫向擴展slace out。可是&#xff0c;當上百臺主機集合成共同為一個站點提供web頁面訪問的形式時&#xff0c;怎么管理整個集群體呢&#xff1f; 一些小伙伴大概聽說過pxe等可實現自動安裝系統。可是&#xff0c;要我們一臺一臺主…

[轉載] Python numpy函數:all()和any()比較矩陣

參考鏈接&#xff1a; Python中的any和all 數組元素的比對&#xff0c;我們可以直接使用“”進行比較&#xff0c;比如&#xff1a; 但是當數組元素較多時&#xff0c;查看輸出結果便變得很麻煩&#xff0c;這時我們可以使用all&#xff08;&#xff09;方法&#xff0c;直接…

MySQL初識-架構-安裝-初始化-連接-管理工具-數據文件

MySQL架構和結構分析 官方架構圖 內部組件結構圖 MySQL安裝方式 MySQL初始化 MySQL工作模式及常用命令 交互式模式&#xff1a;mysql> 1234567891011121314# 交互式模式下的客戶端命令mysql> help # 獲取命令幫助 mysql> \? # 同上 mysql> \c # 取消命令執行 mysq…

[轉載] Java基礎——關聯、聚合、組合

參考鏈接&#xff1a; Java中的關聯 | 組合和聚合 一.引言 其實自己也不知道&#xff0c;在需求設計、架構設計、開發階段是否真正需要弄明白“關聯、聚合、組合”。原本計劃這篇博文寫“繼承“和”多態”&#xff0c;但是一翻閱資料&#xff0c;基本上都會把“繼承”和“組…

[轉載] WSDL2Java詳細使用說明【官方最全說明】

參考鏈接&#xff1a; Java中的this說明 WSDL to Java 命名 wsdl2java - 獲取WSDL文檔并生成完全帶注釋的Java代碼&#xff0c;并實現相關服務。 概要 用例 : wsdl2java -fe|-frontend <front-end-name> -db|-databinding <data-binding-name> -wv <…

mdm.Dialogs.promptModal()使用

這是prompt的擴展&#xff0c;提供了更多的功能&#xff0c;比如可以添加其他按鈕和圖標import mdm.*;mdm.Application.init(this, onInit);function onInit():void {// 啟動程序...}quit.addEventListener(MouseEvent.CLICK,quitProgram);function quitProgram(evt:MouseEvent…

[轉載] JAVA 構造函數及其重載

參考鏈接&#xff1a; Java重載Overload public class Student{ public int stuId; public String stuName; public int stuAge; public int stuScore; public Student(){ } public Student(int sId,String sName){ stuId sId; sName stuName; } public Student(int sld,S…

學生機房虛擬化(十)系統操作設計實現

引入&#xff1a; 在前篇思路的指導下&#xff0c;進行了為期三個星期的調試最終建立了一個初步成熟的&#xff0c;具有親和力的配置界面&#xff0c;現在此虛擬系統已經初步部署了一個機房&#xff0c;用來學生日常上課。在本篇中&#xff0c;本人并不試圖去花篇幅講解彼此之間…

[轉載] java之重寫toString

參考鏈接&#xff1a; Java程序的輸出| 重寫Override 1.toString()就是是重寫&#xff0c;對于一般的對象來說都會有這個方法&#xff0c;其實這個方法的目的&#xff0c;主要就是將對象按字符串的方式輸出出來&#xff1a;打個比方&#xff0c;比如一個People類&#xff0c;里…

Gson的使用,對于不需要html escape的情況的處理

引入&#xff1a; 雖然是小問題&#xff0c;但是我還是需要記錄下&#xff0c;我們知道&#xff0c;Google提供了一個Gson框架讓我們高效的吧普通對象&#xff08;一般VO為佳&#xff09; 和json字符串之間進行互轉。因為轉換多數是和瀏覽器打交道的&#xff0c;所以一般默認的…

[轉載] Java 重寫paint繪圖

參考鏈接&#xff1a; 用Java重寫Override 感謝原文&#xff1a;https://zhidao.baidu.com/question/260060153.html 這個方法需要注意的地方不多&#xff0c;也就是重寫時&#xff0c;先調用 super.paint(g) 方法 paint方法不需要編寫代碼調用&#xff0c;只需要重寫。 其他…

教你如何進入有密碼的 XP 系統(下)

自動登錄時禁用Shift鍵 當使用自動登錄功能時&#xff0c;用戶可通過按住Shift鍵忽略登錄進程&#xff0c;輸入其他用戶名及密碼進入電腦。該技巧可以禁用自動登錄時的Shift鍵功能。操作步驟如下&#xff1a;打開“注冊表編輯器”&#xff0c;找到[HKEY_LOCAL_MACHINE\Softwar…