簡體   English   中英

實例化使用受保護的訪問說明符繼承的內部類

[英]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()行,並建議將Workerpublic 但為什么? 它受到保護,這就是為什么WorkersClass的后繼者可以在他們的方法中實例化Worker類。 我誤解了什么嗎?

問題不在於訪問說明符。

如果在類中沒有提供任何構造函數,編譯器會自動為您插入一個默認的no-args構造函數

在這種情況下,這不是真的。 因為編譯的內部類沒有獲得默認構造函數,因為它被編譯為outer$innerinner沒有編譯器提供的默認構造函數。

手動提供默認的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM