介面到底能不能例項化

韓師學子--胖佳發表於2019-03-01

                         介面到底能不能例項化

 

轉載:https://blog.csdn.net/MaoDunTi/article/details/47804121

先給大家看一個常用的程式碼:
 

 tv1.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                
            }
        });

注意到OnClickListener,Ctrl +左鍵進入原始碼看到,
 

 public interface OnClickListener {
        /**
         * Called when a view has been clicked.
         *
         * @param v The view that was clicked.
         */
        void onClick(View v);
    }

我們在學習Java基礎的時候知道,介面是不可以例項化的,那為什麼上面OnClickListener可以new,這不得不讓我們問一下,到底介面能不能例項化。答案是:NO!
解釋一下,這是匿名內部類的寫法。new OnClickListener(){}其實並沒有真正地例項化,new了一個實現介面的匿名內部類,然後new得到匿名內部類的物件再向上轉型為它實現的介面(原始型別)。這樣解釋可能還不夠,再讓大家看一段程式碼:

  class MyListener implements OnClickListener {
        @Override
        public void onClick(View v) {
        }
    }

 

 tv1.setOnClickListener(new MyListener());

這樣寫大家就不會有任何的疑惑了,因為不再看到介面被例項化了錯覺。我們看到只是一種省略的寫法,它例項化了一個匿名內部類,而這個類實現了一個介面。
 

相關文章