final可以用来定义类

时间:2014-08-14 15:02:49

标签: java

这里 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);
    }
}

5 个答案:

答案 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)都指向同一个对象。