1. 程式人生 > >Java基礎-new一個在不同個包中且只有protected構造方法的類的物件(匿名內部類的使用)

Java基礎-new一個在不同個包中且只有protected構造方法的類的物件(匿名內部類的使用)

目錄

前言

  如何new一個在不同個包中且只有protected構造方法的類的物件呢?在講解如何實現之前,來講一下事情的緣由。下面將說明如何實現(這裡主要講的是如何使用匿名內部類實現)。後續描述的內容如有問題請廣大讀者能夠耐心指出,給讀者帶來不便之處,還請見諒。
  在使用gson解析json字串的時候,使用到如下程式碼:

Gson gson = new Gson();
List<OrderDetail> orderDetailList = new ArrayList<>();
orderDetailList = gson.fromJson(orderForm.getItems(), new
TypeToken<List<OrderDetail>>() {}.getType());

  其中最引人注目的當屬,這部分程式碼:

new TypeToken<List<OrderDetail>>() {}.getType()

  這裡使用了匿名內部類(且內部未做任何操作),檢視TypeToken類原始碼會發現,該類中只存在一個使用protected修飾的無參構造方法,在正常情況下,我們使用在不同的包中new出這樣的物件(當然我指的是new的使用呼叫的構造方法是使用protected修飾的。),那麼這裡已經教我們如何處理了,即採用匿名內部類。

實現過程

  為更好的描述一個實現過程,我們先來建立一個類,SupperClass,且位於com.wm103.test包中,如下:

package com.wm103.test;

public class SupperClass {
    private String message;

    protected SupperClass() {
        System.out.println("supper class init.");
    }

    public void print() {
        System.out.println("This is supper class."
); System.out.println("message: " + this.getMessage()); } public String getMessage() { return this.message; } public void setMessage(String message) { this.message = message; } }

  我們再來建立一個主類,MainClass,且位於com.wm103包中,如下:

package com.wm103;

import com.wm103.test.SupperClass;

public class MainClass {

    public static void main(String[] args) {
        new SupperClass();
    }
}

  直接new SupperClass(),我想你會在IDE中看到類似這樣的提示:

'SupperClass()' has protected access in 'com.wm103.test.SupperClass'

  因為SupperClass()構造方法是protected訪問許可權,而MainClassSupperClass不在同個包中,所以並不能直接new SupperClass()。那麼我們該怎麼做呢?採用匿名內部類。如下:

new SupperClass() {}.print();

  在這樣的情況下,我們即可建立匿名內部類物件,且呼叫SupperClass類的print方法。

擴充套件

  匿名內部類中是不能定義建構函式的。而我們一般都是利用構造器來完成某個例項的初始化工作的,那麼在匿名內部類中我們應該如何實現初始化操作呢?使用構造程式碼塊!利用構造程式碼塊能夠達到為匿名內部類建立一個構造器的效果。
  還是以上述中的例子為例,如下:

new SupperClass() {
    {
        setMessage("Hello Supper Class.");
        innerPrint();
    }

    public void innerPrint() {
        System.out.println("This is inner class.");
    }
}.print();

  在上述的匿名內部中,定義了構造程式碼塊用來實現初始化操作,還定義了一個屬於自己的方法。執行這樣的例子,將在控制檯看到這樣的輸出結果:

supper class init.
This is inner class.
This is supper class.
message: Hello Supper Class.

  具體流程如下:呼叫SupperClass的構造方法進行初始化 -> 執行匿名內部類的構造程式碼塊 -> 呼叫print方法(方法內輸出了在構造程式碼塊初始化的message的值)。
  如果在匿名內部中定義與SupperClass中同名的方法,又會將如何呢(會發生方法覆蓋),如下:

new SupperClass() {
    {
        setMessage("Hello Supper Class.");
        innerPrint();
    }

    public void innerPrint() {
        System.out.println("This is inner class.");
    }

    public void print() {
        System.out.println("inner class::print");
    }
}.print();

  執行結果如下:

supper class init.
This is inner class.
inner class::print

知識點擴充套件或參考

相關推薦

Java基礎-new一個不同只有protected構造方法物件匿名部類的使用

目錄 前言   如何new一個在不同個包中且只有protected構造方法的類的物件呢?在講解如何實現之前,來講一下事情的緣由。下面將說明如何實現(這裡主要講的是如何使用匿名內部類實現)。後續描述的內容如有問題請廣大讀者能夠耐心指出,給讀者帶來不便

java面向物件匿名部類,訪問修飾符,程式碼塊

1.匿名內部類 new 父類或介面(){ //進行方法重寫 }; //已經存在的父類: public abstract class Person{ public abstract void eat(); } //定義並建立該父類的子類物件,並用多型的方式賦值給父類引用變數

關於java程式碼進行重定義的探究匿名部類。包含欄位定義,方法重寫,追加方法

寫這篇部落格的時候是在看java8實戰,其中發現了一段程式碼,感覺很奇怪,之前雖然接觸過方法的動態重寫,但是沒見過此種程式碼 大致長這樣: 問題的關鍵不在於這是一個lambda表示式,而是後面大括號內直接追加程式碼,最後實現的效果跟你新建一個HashMap,然後在呼叫兩次

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

內部類 內部類是定義在一個類內部進行其他類結構的巢狀的操作。 為什麼存在內部類?1.首先看下內部類和不用內部類實現相同功能的程式碼: 不用內部類 //////不用內部類 class Outter { private String msg="pick";

一個有意思的面試題關於部類

題目:        要求不全main方法以及填寫Demo01中的輸出語句,依次輸出30,20,10筆記:        1、內部類和外部類沒有繼承關係        2、通過外部類限定this.物件                                      

java程式設計思想讀書筆記 第十五章 泛型 匿名部類和擦除

1.匿名內部類 泛型還可以應用於內部類以及匿名內部類。下面的例子使用匿名內部類實現了Generator介面: public class Customer { private static long counter = 1; private f

Java部類成員部類

概念: 內部類也是一個語法糖,內部類指的就是在一個類的內部再定義一個類。 內部類之所以也是語法糖,是因為它僅僅是一個編譯時的概念,outer.java裡面定義了一個內部類inner,一旦編譯成功,就會生成兩個完全不同的.class檔案了,分別是outer.clas

工廠方法模板java程式設計思想 使用匿名部類

package innerclasses; interface Service{ void method1(); void method2(); } interface ServiceFactory{ Service getService(); } class

一個".java"原始檔是否可以包括多不是部類?有什麼限制?

可以有多個類,但只能有一個public的類,可以是package或者abstract或者final的類,並且public的類名必須與檔名一致。 package Example; public cla

java基礎】多執行緒匿名部類和lambda建立方式,及多執行緒的兩面試題

一、可以用匿名類和lambda兩個種方式建立多執行緒。 1.利用匿名內部類建立多執行緒並開啟。 new Thread() {//建立方式1 public void run() { for(int x=0; x<50; x++) { System.out

【一道面試題】一個".java"原始檔是否可以包括多不是部類?有什麼限制?

這個面試題的答案在網上一搜一大把 但都是兩句話就結束了,我們來仔細看一下具體是什麼情況! 首先 肯定的一點是一個.java的原始檔中是可以包含多個類的,但是public類只能有一個,並且類名要和檔名相同,如果有兩個public類 就會報出以下的錯誤 這

一個所實現的兩不同的介面,有同名的方法,怎麼知道實現的是哪個介面方法

今天遇到一個問題,程式碼(後面各個版本的程式碼都是基於此程式碼進行變更的)如下: public interface Type1 { void f(); void f1(); void f11(); } public interface Type2 { void f(); void f

java.lang不能被繼承的 -- JAVA 基礎

java.lang包中不能被繼承的類: public final class Byte public final class Character public static final class

Java基礎------生成一個六位數的驗證碼包含大寫字母、小寫字母、數字,並且不允許重復

參考 數組 rand 定義 ole ava length log post 問題描述:生成一個六位數的驗證碼(包含大寫字母、小寫字母、數字,並且不允許重復)? 參考代碼如下: import java.util.Arrays;import java.util.Random

java基礎---第一個java程序

int out spa print back family ont 程序 文件中 第一個java程序 public class Hello { public static void main(String[] args) { System

Java》完成一個“將使用者通過鍵盤輸入的文字動態加入到Vector物件,並顯示此Vector物件儲存的字串”的應用程式

一、任務目標     完成一個java application應用程式,通過接收使用者通過鍵盤輸入的文字,把每次回車輸入的字串動態加入到Vector類物件中,並顯示此Vector類物件中儲存的字串。   二、Vector類     Vector 類可實現自動增長的物件陣列,提供了

JAVA基礎程式設計程式碼50

【程式1】 題目:古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子對數為多少? 程式分析: 兔子的規律為數列1,1,2,3,5,8,13,21.... public cl

Java練習】獲取兩字串最長的相同欄位

獲取兩個字串中最長的子串並輸出。 思路解析: 1.首先考慮我們要知道長度最短的字串,這樣子在比較的次數會更少。 2.我們首先從長度最小的字串每次擷取一小段判斷是否在大串中 3.考慮到有可能有多個長度相同的子串,那麼我們就應該將他們同時儲存到集合中 4.要多考慮到各種異常的發生。

第7天 Java基礎語法(練習加強+在eclipse實現)

第7天 Java基礎語法 今日內容介紹  迴圈練習  陣列方法練習 第1章 迴圈練習 1.1 編寫程式求 1+3+5+7+……+99 的和值。 題目分析: 通過觀察發現,本題目要實現的奇數(範圍1-100之間)的累加和。 為了記錄累加和的值,我們需要定義一

程式 'java' 已包含在下列軟體: * default-jre * gcj-4.8-jre-headless * openjdk-7-jre-headless * gcj-4.6-jr

程式 'java' 已包含在下列軟體包中:  * default-jre  * gcj-4.8-jre-headless  * openjdk-7-jre-headless  * gcj-4.6-jre-headless  * openjdk-6-jre-headless