在声明String变量时,final有什么用?

时间:2018-02-11 11:24:35

标签: java class static

我的编译器在声明String变量时显示错误,但提示显示final缺失。纠正后,它有效但 final 的用途是什么?

class Outerclass
{
    private static String upa = "tobby";

    static class A
    {
        void printmessage(){
            System.out.println("who is a good boy?"+upa);                
        }           
    }
    class B
    {
        void printagain()
        {
            System.out.println("who is a bad boy?"+upa);
        }                    
    }
}

public class Main {

    public static void main(String[] args) {
        Outerclass.A oa=new Outerclass.A();
        oa.printmessage();

        Outerclass outer= new Outerclass();
        outerclass.B ob= outer.new B();
        ob.printagain();         
    }
}

1 个答案:

答案 0 :(得分:0)

final可用于类,方法和变量。如果在类上使用,则意味着您不能将其子类化。例如,String是最终类,这意味着您无法使用自己的类扩展它。

在方法上使用时,意味着无法在子类中重写该方法。如果您想确保没有人使用您的代码会改变您的方法的实现,这可能很有用。

在变量上,它有点复杂。当你创建一个变量final时,这意味着你必须在decleration期间给它一个值:

final String dogSound = "woof";

或在构造函数中:

final String dogSound;

public MyClass() {
    dogSound = "woof";
}

在此之后,您无法分配新值,即使在构造函数中也是如此。编译器不会让你。

然而,意味着最终对象不能更改其内容。给定这个数组:

final String[] dogSounds = new String[1];
dogSounds[0] = "woof";
dogSounds[0] = "bark";

完全合法。

所以它与C和C ++中所谓的const-correctness不同,其中const对象实际上有不同的类型。