您好,登錄后才能下訂單哦!
------- android培訓、java培訓、期待與您交流! ----------
繼承
1 繼承的概述
多個類中存在相同屬性和行為時,將這些內容抽取到單獨一個類中,那么多個類無需再定義這些屬性和行為,只要繼承單獨的那個類即可。
多個類可以稱為子類,單獨這個類稱為父類或者超類。
子類可以直接訪問父類中的非私有的屬性和行為。
繼承:
1,提高代碼的復用性。
2,讓類與類之間產生了關系。有了這個關系,才有了多態的特征。
注意:不要為了獲取其他類的功能,簡化代碼而繼承。必須是類與類之間有所屬關系才可以繼承,所屬關系 is a。
java語言中:java只支持單繼承,不支持多繼承。
因為多繼承容易帶來安全隱患:當多個父類中定義了相同功能,但功能內容不同時,子類對象不確定要運行哪一個。但是java保留了這種機制,并用另一種體現形式來完成表示:多實現。
java支持多層繼承。也就是一個繼承體系。
如何使用一個繼承體系中的功能呢?
1.想要使用體系,先查閱體系父類的描述,因為父類中定義的是該體系中的共×××。
2.通過了解共×××,就可以知道該體系的基本功能。
那么這個體系已經可以基本使用了。
在具體調用時,要創建最子類的對象,為什么呢?
一是因為有可能父類不能創建對象;
二是創建子類對象可以使用更多的功能,包括基本的也包括特有的。
簡單一句話:查閱父類功能,創建子類對象使用功能。
class ExtendsDemo { public static void main(String[] args) { } } class Person { String name; int age; } class Student extends Person { //String name; //int age; void study() { System.out.println("good good study"); } } class Worker extends Person { //String name; //int age; void work() { System.out.println("good good work"); } }
2 繼承的特點
子父類出現后,類中成員的特點。
類中成員:1,變量。2,函數。3,構造函數。
1、變量
如果子類中出現非私有的同名成員變量時,子類要訪問本類中的變量,用this。子類要訪問父類中的同名變量,用super。super的使用和this的使用幾乎一致。this代表的是本類對象的引用。super代表的是父類對象的引用。
代碼體現:
class Fu { int num = 4; } class Zi extends Fu { int num = 5; void show() { System.out.println(super.num); } } class ExtendsDemo2 { public static void main(String[] args) { Zi z = new Zi(); System.out.println(z.num); } }
2,子類中的函數。
當子類出現和父類一模一樣的函數時,子類對象調用該函數時,會運行子類函數的內容。如同父類的函數被覆蓋一樣。這種情況是函數的另一個特性:重寫(覆蓋)。當子類繼承父類,沿襲了父類的功能到子類中。但是子類雖具備該功能,但是功能的內容卻與父類不一致。這時,沒有必要定義新功能,而是使用覆蓋特性,保留父類的功能定義,并重寫功能內容。
覆蓋:
1,子類覆蓋父類,必須保證資料權限大于等于父類權限,才可以覆蓋,否則編譯失敗。
2,靜態只能覆蓋靜態。
重載:只看同名函數的參數列表。
重寫:子父類方法要一模一樣。
代碼體現:
class Fu { void show() { System.out.println("fu show"); } void speak() { System.out.println("vb"); } } class Zi extends Fu { void show() { System.out.println("zi show"); } void speak() { System.out.println("java"); } } class ExtendsDemo3 { public static void main(String[] args) { Zi z = new Zi(); z.show(); } }
3,子父類中的構造函數。
在對子類對象進行初始化時,父類的構造函數也會運行。那是因為子類的構造函數默認第一行有一條隱式的語句 super();
super ():會訪問父類中空參數的構造函數。而且子類中所有的構造函數默認第一行都是super();
為什么子類一定要訪問父類中的構造函數。
因為父類中的數據子類可以直接獲取,所以子類對象在建立時,需要先查看父類是如何對這些數據進行初始化的。所有子類在對象初始化時,要先訪問一下父類中的構造函數。
如果要訪問父類中的指定構造函數,可以通過手動定義super語句的方式來指定。
注意:super語句一定定義在構造函數的第一行。
子類的實例化過程。
結論:子類的所有的構造函數,默認都會訪問父類中空參數的構造函數。因為子類每一個構造函數內的第一行都有一句隱式的super();當父類中沒有空參數的構造函數時,子類必須手動通過super語句形式來制定訪問父類中的構造函數。當然,子類的構造函數第一行也可以手動指定this語句來訪問本類中的構造函數。子類中至少會有一個構造函數會訪問父類中的構造函數。
class ExtendsDemo4 { public static void main(String[] args) { new Zi(); } } class Fu { Fu() { System.out.println("fu run"); } Fu(int x) { System.out.println("fu..."+x); } } class Zi extends Fu { Zi() { //super (); System.out.println("zi run"); } Zi(int x) { this();//沒有隱式的super(); //super (); System.out.println("zi..."+x); } void show(){} }
3 final關鍵字
final :最終。作為一個修飾符,
1,可以修飾類,函數,變量。
2,被final修飾的類不可以被繼承。為了避免被繼承,被子類復寫功能。
3,被final修飾的方法不可以被復寫。
4,被final修飾的變量時一個常量只能賦值一次,既可以修飾成員變量,又可以修飾局部變量。
當在描述事物時,一些數據的出現值是固定的,那么這時為了增強閱讀性,都給這些值起個名字,方便于閱讀。
而這個值不需要改變,所以加上final修飾。
作為常量:常量的書寫規范所有字符都大寫,如果由多個單詞組成。單詞間通過_連接。
5,內部類定義在類中的局部位置上時,只能訪問該局部被final修飾的局部變量。
class Demo { public static final double PI = 3.14;//全局常量。 final void show1() {} void show2() {} } class SubDemo extends Demo { void show1() {} } class FinalDemo { public static void main(String[] args) { System.out.println("Hello World!"); } }
4 抽象類
抽象類:Java中可以定義沒有方法體的方法,該方法的具體實現由子類完成,該方法稱為抽象方法,包含抽象方法的類就是抽象類。
抽象方法的由來:
多個對象都具備相同的功能,但是功能具體內容有所不同,那么在抽取過程中,只抽取了功能定義,并未抽取功能主體,那么只有功能聲明,沒有功能主體的方法稱為抽象方法。
抽象類的特點:
1,抽象方法一定在抽象類中。
2,抽象方法和抽象類必須被abstract關鍵字修飾。
3,抽象類不可以用new創建對象。因為調用抽象方法沒意義。
4,抽象類中的抽象方法要被使用,必須有子類復寫其所有的抽象方法后,建立子類對象調用。如果子類值覆蓋了部分抽象方法,那么該子類還是抽象類。
抽象類與一般類沒有太大的不同。
該如何描述事物,就如何描述事物,只不過,該事物中出現了一些看不懂的東西。這些不確定的部分,也是該事物的功能,需要明確出來,但是無法定義主體。通過抽象方法來表示。
抽象類比一般類多了抽象函數。
抽象類不可以實例化。
特殊:抽象類中可以不定義抽象方法,這樣做僅僅是不讓該類建立對象。
抽象類的細節:
1:抽象類中是否有構造函數?有,用于給子類對象進行初始化。
2:抽象類中是否可以定義非抽象方法?
可以。其實,抽象類和一般類沒有太大的區別,都是在描述事物,只不過抽象類在描述事物時,有些功能不具體。所以抽象類和一般類在定義上,都是需要定義屬性和行為的。只不過,比一般類多了一個抽象函數。而且比一般類少了一個創建對象的部分。
3:抽象關鍵字abstract和哪些不可以共存?final , private , static
4:抽象類中可不可以不定義抽象方法?可以。抽象方法目的僅僅為了不讓該類創建對象。
雇員示例:
需求:公司中程序員有姓名,工號,薪水,工作內容。項目經理除了有姓名,工號,薪水,還有獎金,工作內容。對給出需求進行數據建模
abstract class Employee { private String name; private String id; private double pay; Employee(String name,String id,double pay) { this.name = name; this.id = id; this.pay = pay; } public abstract void work(); } class Manger extends Employee { private int bonus; Manger(String name,String id,double pay,int bones) { super(name,id,pay); this.bonus= bouns; public void work() { System.out.println("manger work"); } } } class Pro extends Employee { Pro(String name,String id,double pay) { super(name,id,pay); } public void work() { System.out.println("pro work"); } }
模板方法設計模式
什么是模板方法?
在定義功能時,功能的一部分是確定的。但是由一部分是不確定,而確定的部分在使用不確定的部分。那么這時就將不確定的部分暴露出去。由該類的子類去完成。
abstractclass GetTime{ public final void getTime(){ //此功能如果不需要復寫,可加final限定 long start = System.currentTimeMillis(); code(); //不確定的功能部分,提取出來,通過抽象方法實現 long end =System.currentTimeMillis(); System.out.println("毫秒是:"+(end-start)); } public abstract void code(); //抽象不確定的功能,讓子類復寫實現 } classSubDemo extends GetTime{ public void code(){ //子類復寫功能方法 for(int y=0; y<1000; y++){ System.out.println("y"); } } }
5 接口
接口:初期理解,可以認為是一個特殊的抽象類。當抽象類中的方法都是抽象的,那么該類可以通過接口的形式來表示。
class用于定義類。interface用于定義接口。
接口定義時,格式特點:
1,接口中常見定義:常量,抽象方法。
2,接口中的成員都有固定修飾符。
常量:public static final
方法:public abstract
接口中的成員都是public的。
接口:是不可以創建對象的,因為有抽象方法。需要被子類實現,子類對接口中的抽象方法全部覆蓋后,子類才可以實例化。否則子類是一個抽象類。
interfaceInter { public static final int NUM = 3; public abstract void show(); } interfaceInterA { public abstract void show(); } classDemo { public void function(){} } classTest extends Demo implements Inter,InterA { public void show(){} } 接口可以被類多實現,也是對多繼承不支持的轉換形式,java支出多實現。 interfaceA { void mehtodA(); } interfaceB //extends A { void mehtodB(); } interfaceC extends B,A//接口可多繼承。 { void mehtodC(); } class Dimplements C { puclic void mehtodA(){} puclic void mehtodB(){} puclic void mehtodC(){} }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。