java - 实例化一个使用 protected 访问说明符继承的内部类

标签 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();
}

然后,一个带有实现该接口(interface)的内部类的类:

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 类的原因。我是不是误解了什么?

最佳答案

问题不全在于访问说明符。

当您不在类中提供任何构造函数时,编译器会自动为您插入一个默认的无参数构造函数

在这种情况下,情况并非如此。因为编译的内部类没有获得默认构造函数,因为它被编译为 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!");
        }
    }
}

关于java - 实例化一个使用 protected 访问说明符继承的内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32207302/

相关文章:

java - 将 Jparepository 的 FindAll 方法与 ModelAndView 结合使用

java - Pentaho 数据集成用户定义的 Java 类

Scala:如何使子类(在其他实例上)可以访问 protected 方法?

java - 具有自己变量的子类的复制构造函数

java - 为什么要传递引用本身?

java - 匿名内部类(相对于非匿名内部类)有哪些优势?

java - 为什么使用或不使用java 7来制作JAVA EE应用程序

java - 如何在 JPanel 数组中使用 JCheckbox 数组

c# - 为什么声明派生类时必须在接口(interface)之前指定基类?

java - 如何从内部 AsyncTask 访问 fragment