实例化使用受保护的访问说明符继承的内部类

时间:2015-08-25 14:52:25

标签: java inheritance inner-classes

我想在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在Worker()中强调getWorker行,并建议制作Workerpublic。但为什么?它受到保护,这就是WorkersClass的后继者可以在他们的方法中实例化Worker类的原因。我误解了什么吗?

3 个答案:

答案 0 :(得分:3)

问题不在于访问说明符。

当你没有在类中提供任何构造函数时,编译器会自动为你插入一个默认的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!");
        }
    }
}

答案 1 :(得分:1)

修改WorkersClass

public class WorkersClass {
  protected class Worker implements Employable {

    public Worker(){}

    @Override
    public void work() {
        System.out.println("Hello, I'm a worker!");
    }
  }
}

答案 2 :(得分:0)

您的Third班级会继承WorkersClass不会 Worker

Java并不真正考虑内部类,它是Java 1.1中引入的一个简单的hack。编译器在类Worker的“外部”生成类WorkersClass,但是在同一个包中 这就是为什么,为了从Worker方法实现新的Third实例,您需要向Worker添加公共构造函数:

protected class Worker implements Employable {

  public Worker(){
  }

  @Override
  public void work() {
    System.out.println("Hello, I'm a worker!");
  }
}