1. 程式人生 > >Java 介面不能例項化之匿名內部類

Java 介面不能例項化之匿名內部類

上面的程式碼是安卓開發裡面及其常見的一段程式碼,最近僥倖撿起了一點基礎,有些不解,就去原始碼裡面查了查,

    public void setOnClickListener(@Nullable OnClickListener l) {
        if (!isClickable()) {
            setClickable(true);
        }
        getListenerInfo().mOnClickListener = l;
    }


就看到了上面的這段程式碼

   tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                
            }
        });

上面程式碼大家很熟悉,往下看原始碼
 ListenerInfo getListenerInfo() {
        if (mListenerInfo != null) {
            return mListenerInfo;
        }
        mListenerInfo = new ListenerInfo();
        return mListenerInfo;
    }
static class ListenerInfo {
        /**
         * Listener used to dispatch focus change events.
         * This field should be made private, so it is hidden from the SDK.
         * {@hide}
         */
        protected OnFocusChangeListener mOnFocusChangeListener;

        /**
         * Listeners for layout change events.
         */
        private ArrayList<OnLayoutChangeListener> mOnLayoutChangeListeners;

        protected OnScrollChangeListener mOnScrollChangeListener;

        /**
         * Listeners for attach events.
         */
        private CopyOnWriteArrayList<OnAttachStateChangeListener> mOnAttachStateChangeListeners;

        /**
         * Listener used to dispatch click events.
         * This field should be made private, so it is hidden from the SDK.
         * {@hide}
         */
        public OnClickListener mOnClickListener;

        /**
         * Listener used to dispatch long click events.
         * This field should be made private, so it is hidden from the SDK.
         * {@hide}
         */
        protected OnLongClickListener mOnLongClickListener;

上面只是儲存物件的資訊類

這裡new的不是介面,而是介面的匿名內部實現類...

匿名內部類也就是沒有名字的內部類

正因為沒有名字,所以匿名內部類只能使用一次,它通常用來簡化程式碼編寫

但使用匿名內部類還有個前提條件:必須繼承一個父類或實現一個介面


例項1:不使用匿名內部類來實現抽象方法

12345678910111213141516abstract class Person {public abstract void eat();}class Child extends Person {public void eat() {System.out.println("eat something");}}public
 class Demo {public static void main(String[] args) {Person p = new Child();p.eat();}}

執行結果:eat something

可以看到,我們用Child繼承了Person類,然後實現了Child的一個例項,將其向上轉型為Person類的引用

但是,如果此處的Child類只使用一次,那麼將其編寫為獨立的一個類豈不是很麻煩?

這個時候就引入了匿名內部類

例項2:匿名內部類的基本實現

1234567891011121314abstract class Person {public abstract void eat();}public class Demo {public static void main(String[] args) {Person p = new Person() {public void eat() {System.out.println("eat something");}};p.eat();}}

執行結果:eat something

可以看到,我們直接將抽象類Person中的方法在大括號中實現了

這樣便可以省略一個類的書寫

並且,匿名內部類還能用於介面上

例項3:在介面上使用匿名內部類

interface Person {public void eat();}public class Demo {public static void main(String[] args) {Person p = new Person() {public void eat() {System.out.println("eat something");}};p.eat();}}

執行結果:eat something

由上面的例子可以看出,只要一個類是抽象的或是一個介面,那麼其子類中的方法都可以使用匿名內部類來實現

最常用的情況就是在多執行緒的實現上,因為要實現多執行緒必須繼承Thread類或是繼承Runnable介面

例項4:Thread類的匿名內部類實現

public class Demo {public static void main(String[] args) {Thread t = new Thread() {public void run() {for (int i = 1; i <= 5; i++) {System.out.print(i + " ");}}};t.start();}}

執行結果:1 2 3 4 5

例項5:Runnable介面的匿名內部類實現

12345678910111213public class Demo {public static void main(String[] args) {Runnable r = new Runnable() {public void run() {for (int i = 1; i <= 5; i++) {System.out.print(i + " ");}}};Thread t = new Thread(r);

相關推薦

Java 介面不能例項匿名部類

上面的程式碼是安卓開發裡面及其常見的一段程式碼,最近僥倖撿起了一點基礎,有些不解,就去原始碼裡面查了查, public void setOnClickListener(@Nullable OnClickListener l) { if (!isClick

[Java基礎]介面能否被例項以及匿名部類

首先回答我們標題中的問題,介面能否被例項化呢? 答案是顯而易見的,不能! 下面我們考慮如下的程式碼: Runnable r1 = new Runnable(){ @Override public void run(){

java 多執行緒 匿名部類實現多執行緒

package 匿名內部類實現多執行緒; public class Demo { public static void main(String[] args) { // 繼承Thread類實現多執行緒 new Thread() {

Java瘋狂講義第六章習題"定義一個介面,並使用匿名部類方式建立介面例項""

//定義一個介面,並使用匿名內部類方式建立介面的例項// Graph.javapublic interface Graph{void draw();}// Triangle.javaclass Triangle implements Graph{public void dra

Java部類匿名部類

urn nat 看到了 math 通過 rri 內部 test mat ??我們都知道Java中可以使用內部類,將一個類的定義放在另一個類的定義的內部,這就是內部類,但是匿名內部類往往使我們摸不著頭腦,因為它並沒有特定的名稱,那麽該如何使用它呢? 定義一個匿名內部類 pu

java匿名部類、成員部類、方法部類、靜態部類

一、匿名內部類:必須繼承一個類或者實現介面,不能建立建構函式。 /** * 匿名內部類 * * @author: Rodge * @time: 2018年10月4日 下午3:44:03 * @version: V1.0.0 */ public class AnonymousInner

Java程式設計思想(第4版) 15.5 泛型匿名部類

15.5   匿名內部類 泛型還可以應用於內部類以及匿名內部類。下面的示例使用匿名內部類實現了Generator介面:     Customer和Teller類都只有private的構造器,這可以強制你必須使用Generator物件。Customer有一個generator(

java學習匿名部類

java學習 stat () pri class sys demo out dem /*匿名內部類 * * 一般用於抽象類和接口 * 因為他們不能實例化對象所以可以通過匿名內部類來幫助他們實例化 * 下面demo是抽象類的例子 * * */ abstract clas

Java匿名部類詳解

表示 div -h UNC 花括號 繼承 匿名對象 對象 但是 前言 本文講解Java中最後一種內部類,叫做匿名內部類。顧名思義,所謂的匿名內部類就是一個沒有顯式的名字的內部類,在實際開發中,此種內部類用的是非常多的。 匿名內部類 本質:匿名內部類會隱式的繼承一個類或

java 類的成員部類

java 類的成員之五 內部類 1. *類的第五個成員:內部類 1. *類的第五個成員:內部類 相當於說,我們可以在類的內部再定義類,外面的類:外部類,裡面的類:內部類 內部類的分類:成員內部類(宣告在類內

Java介面,抽象類,部類

介面的概念     在Java中介面是一個全部由抽象方法組成的集合,介面需要用interface定義,裡面只能有抽象的方法和常量。 介面體現的是事物擴充套件的功能,在Java中,類定義了一個實體,包括實體的屬性,實體的行為。而介面定義了一個實體可能發生的動作,只有一個宣告,

java提高篇-----詳解匿名部類

在java提高篇-----詳解內部類中對匿名內部類做了一個簡單的介紹,但是內部類還存在很多其他細節問題,所以就衍生出這篇部落格。在這篇部落格中你可以瞭解到匿名內部類的使用、匿名內部類要注意的事項、如何初始化匿名內部類、匿名內部類使用的形參為何要為final。 一、使用匿名內部類內部類 &nb

Kotlin匿名部類

物件表示式: window.addMouseListener(object : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { // ... }

Java中怎麼定義一個匿名部類,定義匿名部類的條件是什麼?

一.匿名內部類:   1.匿名內部類其實就是內部類的簡寫格式。   2.定義匿名內部類的前提:內部類必須是繼承一個抽象類或者實現介面。只要一個類是抽象的或是一個介面,那麼其子類中的方    法都可以使用匿名內部類來實現   3.匿名內部類的格式:  new 父類或者介面()

避免使用反射例項非靜態部類

//考慮到從Java 程式到class 檔案的對映的複雜度,請避免使用反射來例項化內部類。 //更一般地講,當我們在用高階語言特性定義的程式元素之上使用反射的時候,一定要小心, //從反射的視角觀察程式可能不同與從程式碼的視角去觀察它。 //一個非靜態的巢狀類的構造器,在編譯的時候會將一個隱藏的引數作為它的

Java學習筆記1:匿名部類的相關錯誤

class Test1_NoNameInnerClass { public static void main(String[] args) { //如何呼叫PersonDemo中的method方法呢? PersonDemo p=new PersonDemo(); //p.method(new

部類匿名部類

匿名內部類 匿名內部類顧名思義,即沒有名字的內部類,一般表現形式為使用父類的引用指向你一個匿名物件,方法的實現在匿名語句塊中完成 eg: Animal a = new Animal() {    @Override    public void sleep() {

-1-2 java 面向物件基本概念 封裝繼承多型 變數 this super static 靜態變數 匿名物件 值傳遞 初始過程 程式碼塊 final關鍵字 抽象類 介面 區別 多型 包 訪問許可權 內部類 匿名內部類 == 與 equal

java是純粹的面向物件的語言 也就是萬事萬物皆是物件 程式是物件的集合,他們通過傳送訊息來相互通訊 每個物件都有自己的由其他的物件所構建的儲存,也就是物件可以包含物件 每個物件都有它的型別  也就是類 某一特定型別的所有物件都可以接收相同的訊息,因為同一類事物有共同的特性 面向物件開發 •

#隨筆java匿名部類

比較 很好 個人 技術 希望 兩個 ava public 類方法 隨筆之java匿名內部類 從今天起開始每日一篇技術博客,當然這只是我當天所學的一些隨筆,裏面或多或少會有理解不當的地方,希望大家多多指教,一起進步! 在講匿名內部類之前,先講講內部類的一些概念。 1.內部類:

java基礎個人筆記抽象類,介面與多型,部類

抽象類: 抽象:籠統,模糊,看不懂!不具體。 特點: 1,方法只有宣告沒有實現時,該方法就是抽象方法,需要被abstract修飾。 抽象方法必須定義在抽象類中。該類必須也被abstract修飾。 2,抽象類不可以被例項化。為什麼?因為呼叫抽象方法沒意義。 3,抽象類必須有其子類覆蓋了所有