这里 1.final在课堂上使用,所以它必须是不可修改的。所以任何人都可以解释。 和 2. java中允许使用copy构造函数吗?
final class Complex {
private double re, im;
public Complex(double re, double im) {
this.re = re;
this.im = im;
}
Complex(Complex c)
{
System.out.println("Copy constructor called");
re = c.re;
im = c.im;
}
public String toString() {
return "(" + re + " + " + im + "i)";
}
}
public class Main {
public static void main(String[] args) {
Complex c1 = new Complex(10, 15);
Complex c2 = new Complex(c1);
Complex c3 = c1;
System.out.println(c2);
}
}
答案 0 :(得分:2)
引用类的final
关键字未声明其实例无法修改。它只允许子类化它。最后一个关键字应为applied to fields JLS 8.3.1.2,以使实例不可变。
请参阅JLS 8.1.1.2:
如果一个类的定义完整且不需要或不需要子类,则可以将其声明为final。
如果最终类的名称出现在另一个类声明的extends子句(第8.1.4节)中,则是编译时错误;这意味着最终的类不能有任何子类。
如果一个类被声明为final和abstract,那么这是一个编译时错误,因为这样一个类的实现永远无法完成(§8.1.1.1)。
因为final类永远不会有任何子类,所以不会覆盖final类的方法(第8.4.8.1节)。
您的复制构造函数是可以接受的。
答案 1 :(得分:0)
当您将class
声明为final
时,它不会使其成为不可变的,而是使该类无法被其他类扩展,即它不能被子类化。
如果您想让自己的课程不可变,则应将字段标记为final
:
class Complex {
private final double re, im;
}
这在Java Language Specification. 8.1.1.2. final Classes中注明:
如果一个类的定义完整且不需要或不需要子类,则可以将其声明为final。
Java中允许使用复制构造函数。你只做了一个,编译器没有抱怨它。
答案 2 :(得分:0)
声明课程final
并不会使不可变。这很简单意味着类无法扩展。
答案 3 :(得分:0)
无法扩展声明为final的类。该类的实例仍然是可变的。请参阅Oracle Docs
您可以自由地使用Java编写自己的复制构造函数,但它们就像普通的构造函数一样。编译器不会为您或任何东西生成一个。
答案 4 :(得分:0)
1-最终关键字意味着无法再扩展课程
2-复杂c3 = c1在Java中有效,但两个变量(c1和c3)都指向同一个对象。