我的编译器在声明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();
}
}
答案 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
对象实际上有不同的类型。