[英]Instantiate an inner class inherited with protected access specifier
我想在Bruce Eckel的TIJ內部課程上做以下練習:
Create an interface with at least one method, in its own package.
Create a class in a separate package. Add a protected inner class
that implements the interface. In a third package, inherit from
your class and, inside a method, return an object of the protected
inner class, upcasting to the interface during the return.
這是我的實現:
一,界面:
package workers;
public interface Employable {
void work();
}
然后,一個具有實現接口的內部類的類:
package second;
import workers.Employable;
public class WorkersClass {
protected class Worker implements Employable {
@Override
public void work() {
System.out.println("Hello, I'm a worker!");
}
}
}
最后是繼承的類:
package third;
import second.WorkersClass;
import workers.Employable;
public class Third extends WorkersClass {
Employable getWorker() {
return new Worker();//the line is reported to be incorrect
}
}
IDEA強調了getWorker
Worker()
行,並建議將Worker
類public
。 但為什么? 它受到保護,這就是為什么WorkersClass
的后繼者可以在他們的方法中實例化Worker
類。 我誤解了什么嗎?
問題不在於訪問說明符。
如果在類中沒有提供任何構造函數,編譯器會自動為您插入一個默認的no-args構造函數
在這種情況下,這不是真的。 因為編譯的內部類沒有獲得默認構造函數,因為它被編譯為outer$inner
而inner
沒有編譯器提供的默認構造函數。
手動提供默認的no org constructor
,看看魔術:)
package second;
import workers.Employable;
public class WorkersClass {
protected class Worker implements Employable {
public Worker() {
// TODO Auto-generated constructor stub
}
@Override
public void work() {
System.out.println("Hello, I'm a worker!");
}
}
}
修改WorkersClass
public class WorkersClass {
protected class Worker implements Employable {
public Worker(){}
@Override
public void work() {
System.out.println("Hello, I'm a worker!");
}
}
}
你的Third
類繼承了WorkersClass
而不是 Worker
。
Java並不真正考慮內部類,它是Java 1.1中引入的一個簡單的hack。 編譯器生成類Worker
類的“外部” WorkersClass
,但在相同的包中。
這就是為什么,為了從Third
方法實現一個新的Worker
實例,你需要向Worker
添加一個公共構造函數:
protected class Worker implements Employable {
public Worker(){
}
@Override
public void work() {
System.out.println("Hello, I'm a worker!");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.