下面的代码之间最后做了什么区别。 宣布论证是否有任何优势是最终的。 public String changeTimezone( Timestamp stamp, Timezone fTz, Timezone toTz){ return …. } public String changeTimezone(final Timestamp stamp, final Timezone fTz, final Timezone toTz){ return …. }
class Foo{ public static void main(String args[]){ final int x=101; int y; if(x>100){ y=-1; } System.out.println(y); } } Java编译器理解if语句的条件总是为true,因此y将始终被初始化。 没有编译错误,正如所料。 class Bar{ public static void main(String args[]){ final int x; x=101; int y; if(x>100){ y=-1; } System.out.println(y); } } 但是当我把x的声明和初始化分解成两行时,编译器似乎并没有得到这个条件总是正确的,y总是被初始化。 final int x; x=101; byte b; b=x; System.out.println(b); 同样的事情发生在这里,编译器会导致精度错误的丢失。 final int x=101; byte b; b=x; […]
我在这里相当确信 final int i; try { i = calculateIndex(); } catch (Exception e) { i = 1; } 如果控制达到捕捉块, i不可能已经分配。 但是,Java编译器不同意并声明the final local variable i may already have been assigned 。 在这里还有一些微妙之处,还是这只是Java语言规范用来识别潜在的重新分配的模型的一个弱点? 我的主要担心是像Thread.stop()这样的事情,这可能会导致exception抛出“空气”,但我仍然不知道如何可以抛出后,这显然是最后一个行动在try-block内。 如果允许的话,上面的习语会使我的许多方法更简单。 请注意,这个用例对语言有一stream的支持,比如Scala,它始终使用Maybe monad: final int i = calculateIndex().getOrElse(1); 我认为这个用例是一个非常好的动机,可以允许我在一个特定的情况下, i 绝对没有在catch-block内分配 。 UPDATE 经过一番思考,我更加确定这只是JLS模型的一个弱点:如果我在上面的例子中声明了公理,当控制到达catch-block时, i肯定是未分配的,它不会和其他任何冲突公理或定理。 编译器将不会允许i在读取i之前将其分配给catch-block,所以无论i是否被分配,都不能被观察到。
在Java中,您可以使用final关键字限定本地variables和方法参数。 public static void foo(final int x) { final String qwerty = "bar"; } 这样做会导致无法在方法的主体中重新分配x和qwerty。 这种做法会使您的代码朝着不可变性的方向发展,而这一般被认为是一个加号。 但是,它也倾向于将代码与“最终”出现在各处。 你对Java中的局部variables和方法参数的最终关键字有什么看法?
我惊讶地看到,下面的Java代码片段被编译和运行: for(final int i : listOfNumbers) { System.out.println(i); } 其中listOfNumbers是一个整数数组。 我以为最后的声明只能分配一次。 编译器是否创build一个Integer对象并更改它所引用的内容?
我想知道是否有意义的宣布私有方法是最终的,我认为这是没有意义的。 但我想象中有一种独特的情况,写下代码来搞清楚: public class Boom { private void touchMe() { System.out.println("super::I am not overridable!"); } private class Inner extends Boom { private void touchMe() { super.touchMe(); System.out.println("sub::You suck! I overrided you!"); } } public static void main(String… args) { Boom boom = new Boom(); Boom.Inner inner = boom.new Inner(); inner.touchMe(); } } 它编译和工作。 “我应该touchMe()最后”我以为做到了: public […]
public class A { private static final int x; public A() { x = 5; } } final意味着variables只能被赋值一次(在构造函数中)。 static意味着它是一个类实例。 我看不出为什么这是禁止的。 这些关键字在哪里互相干扰?
我有一个这样的程序: class Test { final int x; { printX(); } Test() { System.out.println("const called"); } void printX() { System.out.println("Here x is " + x); } public static void main(String[] args) { Test t = new Test(); } } 如果我尝试执行它,我得到编译器错误为: variable x might not have been initialized基于java的默认值,我应该得到下面的输出吗? "Here x is 0". 最终的variables是否有默认值? 如果我这样更改我的代码, class Test { […]
在Java中,关键字的final目的是什么, finally并finalize落实?
Java for C ++程序员教程说(重点是我自己的): final关键字大致等于C ++中的const 在这方面“粗略”是什么意思? 他们不完全一样吗? 有什么区别?