Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实现最后一个类,但不使用;“最后的”;关键词_Java - Fatal编程技术网

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
}
  • 将构造函数标记为私有
  • 在类上提供静态方法以创建类的实例。这将允许您实例化该类的对象

将该类的所有构造函数设置为私有,以停止继承,但不建议这样做。

您可以使类不可变,而不使用final关键字:

public class Immutable {       
    private int val;

    public Immutable(int v)
    { 
        this.val = v;
    }

    public int getVal() { return this.val; }
}
  • 将实例变量设为私有
  • 使构造函数私有化
  • 创建一个将返回此类实例的工厂方法
  • 我在这里用Java提供不可变类

    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方法不起作用。无论如何,很好的尝试。谢谢你指出我的错误。我已经更新了我的代码@叶甫根尼耶夫