final_抽象類_模版模式_接口

----------- android培訓java培訓、java學習型技術博客、期待與您交流! ------------
【final】
繼承打破了封裝性,本來一個類寫的好好的,你一繼承全給我覆寫了。。。
final最終作爲一個修飾符,
1,可以修飾類,函數,變量。
2,被final修飾的類不可以被繼承。爲了避免被繼承,被子類覆寫功能。
繼承都可以覆寫方法,有利有弊
如我一個類中封裝了調用底層的代碼,你一繼承,把我調用底層的方法一覆寫,唉了問題了?
解決:我這個類不讓你繼承,不讓你覆寫,用final修飾此種類
3,被final修飾的方法不可以被覆寫。
父類中不讓覆寫的方法用final
4,被final修飾的變量是一個常量只能賦值一次,既可以修飾成員變量,也可以修飾局部變量。
當在描述事物時,一些數據的出現值是固定的,那麼這時爲了增強閱讀性,都給這些值起個名字。方便於閱讀。
而這個值不需要改變,所以加上final修飾。作爲常量:常量的書寫規範所有字母都大寫,如果由多個單詞組成。
單詞間通過_連接。
比如:final double MY_PI= 3.14;
如果final修飾成員變量,此成員變量可以被共享,則在加上static:(全局常量)
如public static final double MY_PI= 3.14;
5,內部類定義在類中的局部位置上時,只能訪問該局部被final修飾的局部變量。
6, 現在修飾類的成員有兩個了:public final
【抽象類】
當多個類中出現相同功能,但是功能主體不同,
這時可以進行向上抽取。這時,只抽取功能定義,而不抽取功能主體。
抽象:看不懂
抽象方法:看不懂的方法,用abstract標識一下。 abstract void study();
抽象方法必須存放在抽象類中; abstract class Student
抽象類的特點:
1,抽象方法一定在抽象類中。
2,抽象方法和抽象類都必須被abstract關鍵字修飾。
3,抽象類不可以用new創建對象。因爲調用抽象方法沒意義。
4,抽象類中的抽象方法要被使用,必須由子類覆寫所有的抽象方法後,建立子類對象調用。
如果子類只覆蓋了部分抽象方法,那麼該子類還是一個抽象類。
抽象類和一般類沒有太大的不同。
該如何描述事物,就如何描述事物,只不過,該事物出現了一些看不懂的東西。
這些不確定的部分,也是該事物的功能,需要明確出現。但是無法定義主體。
通過抽象方法來表示。
抽象只能用來修飾類和方法,抽象類中可以有非抽象方法。
抽象類比一般類多個了抽象函數。就是在類中可以定義抽象方法。
抽象類不可以實例化。
特殊:抽象類中可以不定義抽象方法,這樣做僅僅是不讓該類建立對象。
抽象例子
假如我們在開發一個系統時需要對員工進行建模,員工包含 3 個屬性:
姓名、工號以及工資。經理也是員工,除了含有員工的屬性外,另爲還有一個
獎金屬性。請使用繼承的思想設計出員工類和經理類。要求類中提供必要的方
法進行屬性訪問。
員工類:name id pay
經理類:繼承了員工,並有自己特有的bonus。
【模版模式】
需求:獲取一段程序運行的時間。
原理:獲取程序開始和結束的時間並相減即可。
獲取時間:long start = System.currentTimeMillis();1秒=1000毫秒
abstract class GetTime
{
public final void getTime()
{
long start = System.currentTimeMillis();
runcode();

long end = System.currentTimeMillis();

System.out.println("毫秒:"+(end-start));
}
public abstract void runcode();
}

class SubTime extends GetTime
{
public void runcode()
{

for(int x=0; x<4000; x++)
{
System.out.print(x);
}
}
}

class  TemplateDemo
{
public static void main(String[] args) 
{
//GetTime gt = new GetTime();
SubTime gt = new SubTime();
gt.getTime();
}

}

什麼是模版方法呢?
在定義功能時,功能的一部分是確定的,但是有一部分是不確定,而確定的部分在使用不確定的部分,
那麼這時就將不確定的部分暴露出去。由該類的子類去完成。

抽象練習:
abstract 關鍵字,和哪些關鍵字不能共存。
final:被final修飾的類不能有子類。而被abstract修飾的類一定是一個父類。
private: 抽象類中的私有的抽象方法,不被子類所知,就無法被複寫。
而抽象方法出現的就是需要被複寫。
static:如果static可以修飾抽象方法,那麼連對象都省了,直接類名調用就可以了。
可是抽象方法運行沒意義。

抽象類中是否有構造函數?
有,抽象類是一個父類,要給子類提供實例的初始化。

Interface:(implements)

【接口】

初期理解,可以認爲是一個特殊的抽象類

當抽象類中的方法都是抽象的,那麼該類可以通過接口的形式來表示。
class用於定義類; interface 用於定義接口。
接口定義時,格式特點:
1,接口中常見定義:常量,抽象方法。
2,接口中的成員都有固定修飾符。
常量:public static final int NUM = 3;
方法:public abstract void show();
記住:接口中的成員都是public的。
接口:是不可以創建對象的,因爲有抽象方法。
需要被子類實現,子類對接口中的抽象方法全都覆蓋後,子類纔可以實例化。
否則子類是一個抽象類。 
接口可以被類多實現,也是對多繼承不支持的轉換形式。java支持多實現。
java不支持多繼承的原因是因爲:父類當中的方法有重複,會導致子類調用的時候產生問題;
多繼承有方法體,而多實現沒有方法體
class Test extends Demo implements Inter,InterA
只有接口和接口有多繼承
類與類之間是繼承關係,類與接口的是實現關係,接口與接口是繼承關係(多繼承)
設計抽象,接口存在多實現時,一定要避免方法名相同
繼承:(子類)你屬於我(抽象類)
接口:(子類)你像我(接口)中的
接口中嚴禁這樣寫:
interface A
{
void methodA();
int show();  //注意
}
interface B 
{
void methodB();
boolean show();//注意
}
interface C extends B,A
{
void methodC();
}

class D implements C
{
public void methodA(){}
public void methodC(){}
public void methodB(){}
public int show(){}//接口中不允許出現這種同名但返回值不同的方法
public boolean show(){}
}
接口的好處:
對外暴露規則,提高了功能的擴展性,降低了耦合性(模塊化開發就這樣完成的)
【抽象類和接口的區別】

抽象類是含有抽象方法的類,不能被實例化,抽象類常用作當做模板類使用。
一個類可以有多個接口 只能有繼承一個父類
抽象類可以有構造方法,接口中不能有構造方法。
抽象類中可以有普通成員變量,接口中沒有普通成員變量
接口裏邊全部方法都必須是abstract的 抽象類的可以有實現了的方法
抽象類中的抽象方法的訪問類型可以是public,protected   但接口中的抽象方法只能是public類型的,並且默認即爲public abstract類型
抽象類中可以包含靜態方法,接口中不能包含靜態方法
抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,並且默認即爲public static final類型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章