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