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
訪問許可權,而MainClass
與SupperClass
不在同個包中,所以並不能直接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