在Java中,我们使用带有变量的final关键字来指定其不被更改的值。
但我看到你可以改变类的构造函数/方法的值。同样,如果变量是静态的,那么这是一个编译错误。
代码如下:
import java.util.ArrayList;
import java.util.List;
class Test {
private final List foo;
public Test()
{
foo = new ArrayList();
foo.add("foo"); // Modification-1
}
public static void main(String[] args)
{
Test t = new Test();
t.foo.add("bar"); // Modification-2
System.out.println("print - " + t.foo);
}
}
以上代码工作正常,没有错误。
现在将变量更改为静态:
private static final List foo;
现在它是一个编译错误。期末考试是怎么进行的呢?
这是一个非常好的面试问题。有时他们甚至会问你final对象和immutable对象的区别是什么。
1)当有人提到一个最终对象时,这意味着引用不能改变,但它的状态(实例变量)可以改变。
2)不可变对象的状态不能改变,但其引用可以改变。
例:
String x = new String("abc");
x = "BCG";
可以修改Ref变量x指向另一个字符串,但是不能修改abc的值。
3)实例变量(非静态字段)在调用构造函数时初始化。所以你可以在构造函数中初始化变量的值。
4)“但是我看到你可以改变类的构造函数/方法的值”。—您不能在方法中更改它。
5)静态变量在类加载过程中初始化。所以你不能在构造函数内部初始化,它甚至必须在构造函数之前完成。因此,需要在声明过程中为静态变量赋值。
这是一个非常好的面试问题。有时他们甚至会问你final对象和immutable对象的区别是什么。
1)当有人提到一个最终对象时,这意味着引用不能改变,但它的状态(实例变量)可以改变。
2)不可变对象的状态不能改变,但其引用可以改变。
例:
String x = new String("abc");
x = "BCG";
可以修改Ref变量x指向另一个字符串,但是不能修改abc的值。
3)实例变量(非静态字段)在调用构造函数时初始化。所以你可以在构造函数中初始化变量的值。
4)“但是我看到你可以改变类的构造函数/方法的值”。—您不能在方法中更改它。
5)静态变量在类加载过程中初始化。所以你不能在构造函数内部初始化,它甚至必须在构造函数之前完成。因此,需要在声明过程中为静态变量赋值。
我只能回答你的问题,在这种情况下,你不能改变foo的参考值。你只需要在同一个引用中放入值,这就是为什么你可以在foo引用中添加值。这个问题发生在你不能很好地理解参考值和原始值之间的区别。引用值也是在堆内存中存储对象地址(即value)的值。
public static void main(String[] args)
{
Test t = new Test();
t.foo.add("bar"); // Modification-2
System.out.println("print - " + t.foo);
}
但是在这种情况下,您可以看到,如果尝试编写以下代码,将会出现编译时错误。
public static void main(String[] args)
{
Main main = new Main();
main.foo=new ArrayList<>();//Cannot assign a value to final variable 'foo'
System.out.println("print - " + main.foo);
}
java中的final关键字用于限制用户。java final关键字可以在许多上下文中使用。Final可以是:
变量
方法
类
final关键字可以与变量一起应用,没有值的final变量称为空白final变量或未初始化final变量。它只能在构造函数中初始化。空白的final变量也可以是静态的,它只会在静态块中初始化。
Java final变量:
如果你让任何变量作为final,你不能改变final变量的值(它将是常量)。
final变量示例
有一个最终变量的速度限制,我们将改变这个变量的值,但它不能改变,因为最终变量一旦赋值就永远不能改变。
class Bike9{
final int speedlimit=90;//final variable
void run(){
speedlimit=400; // this will make error
}
public static void main(String args[]){
Bike9 obj=new Bike9();
obj.run();
}
}//end of class
Java最终类:
如果将任何类设置为final类,则不能扩展它。
final类示例
final class Bike{}
class Honda1 extends Bike{ //cannot inherit from final Bike,this will make error
void run(){
System.out.println("running safely with 100kmph");
}
public static void main(String args[]){
Honda1 honda= new Honda();
honda.run();
}
}
Java final方法:
如果您将任何方法设置为final,则不能重写它。
final方法示例
(Honda中的run()不能覆盖Bike中的run())
class Bike{
final void run(){System.out.println("running");}
}
class Honda extends Bike{
void run(){System.out.println("running safely with 100kmph");}
public static void main(String args[]){
Honda honda= new Honda();
honda.run();
}
}
共享:
http://www.javatpoint.com/final-keyword