目的
學(xué)習(xí):
1.抽象類的定義
2.抽象類的規(guī)則
3.接口的使用
技術(shù)及其使用
一.抽象類
所有的對象都是通過類來描述的愿卸,但不是所有類都能描述完全對象,一個不能具體描述出一個對象的類被稱為抽象類。
/**
* 抽象類 abstract
* 模板的作用 模具 -> 玩具(顏色不一樣 材質(zhì)不一樣)
* 學(xué)習(xí)路線 ——> C語言 -> java -> 界面 網(wǎng)絡(luò) 多線程 數(shù)據(jù)庫
*
* */
/**定義一個抽象類 管理學(xué)習(xí)Android 開發(fā)的路線
* 抽象類里面定義使用這個功能就有必要實現(xiàn)的方法或?qū)傩? * 抽象類不能實例化 不能創(chuàng)建抽象類的對象
* */
abstract class AndroidStudy{
//定義一個代碼塊
{
System.out.println("fitness");
}
//定義一個屬性 用于保存數(shù)據(jù)
public String javaBook;
public Dream dream;
//提供一個構(gòu)造方法
public AndroidStudy(String javaBook,String dream){
this.javaBook = javaBook;
this.dream = new Dream();
this.dream.name = dream;
}
//定義一個靜態(tài)的常量
public static final String cBook = "C premier";
//定義一個抽象方法 不需要實現(xiàn) 子類來實現(xiàn)
public abstract void studyC();
//定義一個普通方法 已經(jīng)確定了這個方法的具體實現(xiàn)
public void studyJava(){
System.out.println("參加java培訓(xùn)班");
}
//定義一個內(nèi)部類 用于管理每個人的理想
class Dream{
public String name;
public void show(){
System.out.println("my dream is : "+name);
}
}
}
如果你想設(shè)計這樣一個類,該類包含一個特別的成員方法,該方法的具體實現(xiàn)由它的子類確定丽猬,那么你可以在父類中聲明該方法為抽象方法宿饱。
Abstract 關(guān)鍵字同樣可以用來聲明抽象方法,抽象方法只包含一個方法名宝鼓,而沒有方法體刑棵。
抽象方法沒有定義巴刻,方法名后面直接跟一個分號愚铡,而不是花括號。
聲明抽象方法會造成以下兩個結(jié)果:
1.如果一個類包含抽象方法胡陪,那么該類必須是抽象類沥寥。
2.任何子類必須重寫父類的抽象方法,或者聲明自身為抽象類柠座。
3.繼承抽象方法的子類必須重寫該方法邑雅。否則,該子類也必須聲明為抽象類妈经。最終淮野,必須有子類實現(xiàn)該抽象方法,否則吹泡,從最初的父類到最終的子類都不能用來實例化對象骤星。
總結(jié):
1. 抽象類不能被實例化(初學(xué)者很容易犯的錯),如果被實例化爆哑,就會報錯洞难,編譯無法通過。只有抽象類的非抽象子類可以創(chuàng)建對象揭朝。
2. 抽象類中不一定包含抽象方法队贱,但是有抽象方法的類必定是抽象類。
3. 抽象類中的抽象方法只是聲明潭袱,不包含方法體柱嫌,就是不給出方法的具體實現(xiàn)也就是方法的具體功能。
4. 構(gòu)造方法屯换,類方法(用 static 修飾的方法)不能聲明為抽象方法编丘。
5. 抽象類的子類必須給出抽象類中的抽象方法的具體實現(xiàn),除非該子類也是抽象類趟径。
二.接口
接口(英文:Interface)瘪吏,在JAVA編程語言中是一個抽象類型,是抽象方法的集合蜗巧,接口通常以interface來聲明掌眠。一個類通過繼承接口的方式,從而來繼承接口的抽象方法幕屹。
接口并不是類蓝丙,編寫接口的方式和類很相似级遭,但是它們屬于不同的概念。類描述對象的屬性和方法渺尘。接口則包含類要實現(xiàn)的方法挫鸽。
除非實現(xiàn)接口的類是抽象類,否則該類要定義接口中的所有方法鸥跟。
接口無法被實例化丢郊,但是可以被實現(xiàn)。一個實現(xiàn)接口的類医咨,必須實現(xiàn)接口內(nèi)所描述的所有方法枫匾,否則就必須聲明為抽象類。另外拟淮,在 Java 中干茉,接口類型可用來聲明一個變量,他們可以成為一個空指針很泊,或是被綁定在一個以此接口實現(xiàn)的對象角虫。
接口與類相似點:
1.一個接口可以有多個方法。
2.接口文件保存在 .java 結(jié)尾的文件中委造,文件名使用接口名戳鹅。
3.接口的字節(jié)碼文件保存在 .class 結(jié)尾的文件中。
4.接口相應(yīng)的字節(jié)碼文件必須在與包名稱相匹配的目錄結(jié)構(gòu)中争涌。
5.接口與類的區(qū)別:
6.接口不能用于實例化對象粉楚。
7.接口沒有構(gòu)造方法。
8.接口中所有的方法必須是抽象方法亮垫。
9.接口不能包含成員變量模软,除了 static 和 final 變量。
10.接口不是被類繼承了饮潦,而是要被類實現(xiàn)燃异。
11.接口支持多繼承。
接口特性:
1.接口中每一個方法也是隱式抽象的,接口中的方法會被隱式的指定為 public abstract(只能是 public abstract继蜡,其他修飾符都會報錯)回俐。
2.接口中可以含有變量,但是接口中的變量會被隱式的指定為 public static final 變量(并且只能是 public稀并,用 private 修飾會報編譯錯誤)仅颇。
3.接口中的方法是不能在接口中實現(xiàn)的,只能由實現(xiàn)接口的類來實現(xiàn)接口中的方法碘举。
抽象類和接口的區(qū)別
1. 抽象類中的方法可以有方法體忘瓦,就是能實現(xiàn)方法的具體功能,但是接口中的方法不行引颈。
2. 抽象類中的成員變量可以是各種類型的耕皮,而接口中的成員變量只能是 public static final 類型的境蜕。
3. 接口中不能含有靜態(tài)代碼塊以及靜態(tài)方法(用 static 修飾的方法),而抽象類是可以有靜態(tài)代碼塊和靜態(tài)方法凌停。
4. 一個類只能繼承一個抽象類粱年,而一個類卻可以實現(xiàn)多個接口。
測試:
/**
* 接口 interface 定義一套方法 用于對象之間的通信
* 接口就是定義一套規(guī)則/規(guī)范
*
*
* 接口里面默認的變量都是static final 常量
*默認情況下不需要自己寫 public static final
* 不能定義變量
*
* 接口里面不能定義代碼塊
*
* 接口里面不能定義構(gòu)造方法
*
* 接口里面不能添加普通/對象/實例方法
* 只有抽象方法
* 默認就是 public abstract
*
* 如果需要定義已經(jīng)有實現(xiàn)的方法
* 使用default
*
* 接口里面可以定義內(nèi)部類
* 一個類可以實現(xiàn)多個接口
*
* 一個接口可以繼承多個接口
* interface testInterface2 extends testInterface
* */
interface testInterface{
public static final int I = 100;
int COUNT =20;
void test();
public void test2();
public abstract void test3();
static class inner{
int name;
public void show(){
System.out.println("woo");
}
}
}
interface testInterface2 extends testInterface{
public static final int I = 100;
int COUNT =20;
void test();
public void test2();
public abstract void test3();
static class inner{
int name;
public void show(){
System.out.println("woo");
}
}
}
class WYClass implements testInterface,testInterface2{
@Override
public void test(){
testInterface2.inner in = new testInterface2.inner();
in.show();
}
@Override
public void test2(){
}
@Override
public void test3(){
}
}
class Te{
public static void main(String[] args){
WYClass go = new WYClass();
testInterface t =new WYClass();
}
}
接口的聲明
接口的聲明語法格式如下:
[可見度] interface 接口名稱 [extends 其他的接口名] {
// 聲明變量
// 抽象方法
}
接口的實現(xiàn)
當類實現(xiàn)接口的時候罚拟,類要實現(xiàn)接口中所有的方法台诗。否則,類必須聲明為抽象的類舟舒。
類使用implements關(guān)鍵字實現(xiàn)接口拉庶。在類聲明中,Implements關(guān)鍵字放在class聲明后面秃励。
實現(xiàn)一個接口的語法,可以使用這個公式:
...implements 接口名稱[, 其他接口名稱, 其他接口名稱..., ...] ...
實際使用
用接口實現(xiàn)模擬按鈕的點擊和對代碼運行時間的計算
/**
* 管理界面的抽象類 定義了一個界面創(chuàng)建到結(jié)束的模板
*
* **/
import java.util.ArrayList;
public class Start {
public static void main(String[] args){
//啟動程序 創(chuàng)建界面
MainActivity main = new MainActivity();
//模擬觸摸
main.touch();
MyCode code =new MyCode();
code.calculate();
}
}
public abstract class Activity{
//保存這個界面的所有子視圖
public ArrayList<View> childs = new ArrayList<>();
//界面創(chuàng)建
public abstract void onCreate();
//界面銷毀
public abstract void onDestory();
//將一個子控件添加到主界面上
//接收的時候是用父類去接收子類
//當需要訪問子類內(nèi)容的時候就要降至轉(zhuǎn)化為對應(yīng)的類
public void addChild(View v){
//保存子類控件
if(v instanceof Button) {
Button btn = (Button)v;
System.out.println(btn.title+"按鈕顯示到界面上了");
}else {
ImageView img = (ImageView)v;
System.out.println(((ImageView) v).picture+"的圖片顯示到界面上了");
}
childs.add(v);
}
}
//創(chuàng)建主界面
//管理主界面(程序運行起來的第一個界面)
public class MainActivity extends Activity implements View.onClickListener{
Button btn;
ImageView img;
//構(gòu)造方法
//當界面被創(chuàng)建 就自動調(diào)用oncreate方法
public MainActivity(){
onCreate();
}
@Override
public void onCreate() {
btn = new Button("share","Red");
img = new ImageView("jay zhou");
//將創(chuàng)建的控件添加到當前界面
addChild(btn);
addChild(img);
//如果一個控件需要監(jiān)聽事件 就必須實現(xiàn)監(jiān)聽事件的接口
//告訴按鈕是誰在監(jiān)聽這個事件
btn.listener = this;
//2.
//給imageview添加一個事件
img.listener = new View.onClickListener(){
@Override
public void onClick(View v){
System.out.println("圖片被點擊了");
}
};
}
//模擬觸摸屏幕
public void touch(){
//將屏幕觸摸的時間傳遞給按鈕
btn.getTouchEvent();
img.getTouchEvent();
}
@Override
public void onDestory() {
}
//當事件觸發(fā)了 就會來調(diào)用這個onClick方法
@Override
public void onClick(View v) {
System.out.println("按鈕被點擊了");
}
}
public class Button extends View{
String title;
String titleColor;
public Button(String title,String titleColor){
this.title = title;
this.titleColor =titleColor;
}
}
public class ImageView extends View{
String picture;
public ImageView(String picture){
this.picture = picture;
}
}
//管理一個視圖顯示和事件監(jiān)聽
//什么情況下需要將一個父類做成抽象類(模板)
//1.不能直接創(chuàng)建這個類的對象
//2.這個類里面的某些方法 還不確定如何實現(xiàn)
//
public class View{
//所有視圖都共有的屬性
String backogoundColor;
String borderColor;
//所有的視圖都要監(jiān)聽事件
//定義內(nèi)部接口 封裝
//暫時我不確定是誰要監(jiān)聽 但是要監(jiān)聽事件的人肯定實現(xiàn)了這個接口
onClickListener listener;
public interface onClickListener{
//定義一套方法 約束外部使用這些方法來監(jiān)聽事件
public abstract void onClick(View v);
}
public void getTouchEvent(){
//調(diào)用監(jiān)聽者里面的onclick方法
listener.onClick(this);
}
}
public abstract class TimeTemplate {
public abstract void code();
public void calculate(){
long start = System.currentTimeMillis();
code();
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}
class MyCode extends TimeTemplate{
@Override
public void code() {
//寫自己的測試代碼
int[] nico =new int[10000000];
for (int nicos:nico){
System.out.println("1314521"+nicos);
}
}
}
運行結(jié)果
Be better