Java 实现最后一个类,但不使用;“最后的”;关键词
我的一个朋友在几天的电话面试中被问到了这个问题。 我一点也不知道。有人能提出解决办法吗? (他的工作面试结束了,只是出于好奇)Java 实现最后一个类,但不使用;“最后的”;关键词,java,Java,我的一个朋友在几天的电话面试中被问到了这个问题。 我一点也不知道。有人能提出解决办法吗? (他的工作面试结束了,只是出于好奇) 10x.静态类不能继承自我不知道最终类的确切含义。如果它们指的是不能通过继承来扩展的类,那么很明显这是不能做到的,除非用final(或sealed,或任何语言关键字)标记该类 但是如果meanfinal与immutable一样,使得派生类不能修改类中字段的值,那么基类应该将所有文件和访问器方法都设置为私有。创建一个没有参数的私有构造函数吗 public class Ba
10x.静态类不能继承自我不知道最终类的确切含义。如果它们指的是不能通过继承来扩展的类,那么很明显这是不能做到的,除非用final(或sealed,或任何语言关键字)标记该类
但是如果meanfinal与immutable一样,使得派生类不能修改类中字段的值,那么基类应该将所有文件和访问器方法都设置为私有。创建一个没有参数的私有构造函数吗
public class Base
{
private Base()
{
}
}
public class Derived : Base
{
//Cannot access private constructor here error
}
- 将构造函数标记为私有
- 在类上提供静态方法以创建类的实例。这将允许您实例化该类的对象
public class Immutable {
private int val;
public Immutable(int v)
{
this.val = v;
}
public int getVal() { return this.val; }
}
class Immutable {
private int i;
private Immutable(int i){
this.i = i;
}
public static Immutable createInstance(int i){
return new Immutable(i);
}
public int getI(){return i;}
}
class Main {
public static void main(string args[]){
Immutable obj = Immutable.createInstance(5);
}
}
您尝试创建一个从静态类继承的类。这是办不到的。无论出于何种目的,静态类都是最终的/密封的。
public class Test{static class A{}静态类B扩展了{}公共静态void main(String[]args)抛出异常{B B=new B();System.err.println(“+B”);}
请粘贴到Test.java
,编译并运行。“静态类”使用具有final
的语言?如果它们指的是一个不能通过继承来扩展的类,那么很明显这是不能做到的,除非用final“-error”标记该类。这也可以通过将构造函数私有化来实现。如果我回答面试问题,我想说,“如果我想要一个final
类,我会使用flippin'final
关键字。这是有原因的。”我知道他们可能在收集受访者的创造力,但有更好的方法,而不是问某人如何避免使用语言来达到它的最大能力。一个很好的答案是下面的技巧,但是如果一个应试者能够说“当然,这给出了最终类的‘不能扩展’语义,但是由于它们在技术上不是最终类,所以HotSpot可能没有意识到它可以做一些优化,……等等”,那么当然这也是额外的分数。这两个部分都显示了对最终版
相关性的了解,后者显示了意识和“好”与“坏”的感觉,而不仅仅是“功能上正确”的代码。@Andrzej Doyle-观点正确。我想这取决于面试官和他们如何处理这个问题。我想我的评论有点下意识。如果你想避免不安全的发布,请标记你的字段volatile
。当final关键字与建议的两行一起使用时,它还有什么额外的好处吗@字节正确,但这只会阻止对象创建。但最后一个类不能被重写,所以问题是如何防止继承?如何阻止类被继承(不使用final)?您能给答案添加一些解释吗?代码中有一些错误。First-createInstance方法缺少返回类型。最大的一个,不能在静态上下文中使用。我的一个-应该尝试相等,而不是这个。i==i。但这并不重要,因为createInstance方法不起作用。无论如何,很好的尝试。谢谢你指出我的错误。我已经更新了我的代码@叶甫根尼耶夫