Tag: 最终

c#sealed和Java的final关键字之间是否有任何function差异?

可能重复: 在C#中Java的最终结果是什么? 在Java中,final不仅适用于一个类。 所以,我想知道:两个关键字之间是否有任何function差异? 谢谢,对不起相对noob的问题。 快速的Google搜索无法满足我的需求。

为什么不声明一个数组最终使它在Java中不可变?

为什么不声明一个数组最终使它在Java中不可变? 不宣布最终意味着它无法改变? 从与不可变数组相关的问题中可以清楚地看出,声明一个数组final并不能使它不可更改。 以下是可能的。 final int[] array = new int[] {0, 1, 2, 3}; array[0] = 42; 我的问题是:在这里宣布决赛的function是什么?

无法分配最终的局部变量,因为它是在封闭类型中定义的

ratingS = new JSlider(1, 5, 3); ratingS.setMajorTickSpacing(1); ratingS.setPaintLabels(true); int vote; class SliderMoved implements ChangeListener { public void stateChanged(ChangeEvent e) { vote = ratingS.getValue(); } } ratingS.addChangeListener(new SliderMoved()); 如果我写上面的代码Eclipse告诉我这个: 不能引用在不同方法中定义的内部类中的非最终变量投票 但如果我在int vote之前添加final ,它会给我这个错误: 无法分配最终的局部变量投票,因为它是在封闭类型中定义的 那么,如何解决?

最终字段对于线程安全是否真的有用?

我已经每天使用Java Memory Model工作多年了。 我认为我对数据竞争的概念以及避免它们的不同方法(例如,同步块,易变变量等)有很好的理解。 但是,我仍然认为我完全不了解内存模型,这是最终的类字段在没有任何进一步同步的情况下应该是线程安全的方式。 所以根据规范,如果一个对象被正确初始化(也就是说,没有引用对象在其构造函数中以某种方式转义,使得引用可以被另一个线程看到),那么,在构造之后,任何看到该对象的线程对象将保证看到对象的所有最终字段的引用(在它们构造时的状态),没有任何进一步的同步。 特别是,标准( http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4 )说: final字段的用法模型很简单:在该对象的构造函数中设置对象的最终字段; 并且在对象的构造函数完成之前,不要在另一个线程可以看到的地方写入对正在构造的对象的引用。 如果遵循此操作,那么当另一个线程看到该对象时,该线程将始终看到该对象的最终字段的正确构造版本。 它还将看到那些最终字段引用的任何对象或数组的版本,这些字段至少与最终字段一样是最新的。 他们甚至给出了以下示例: class FinalFieldExample { final int x; int y; static FinalFieldExample f; public FinalFieldExample() { x = 3; y = 4; } static void writer() { f = new FinalFieldExample(); } static void reader() { if (f != null) { int i […]

复合inheritance:如何在子类构造函数中分配一个最终字段,该字段取决于’this’值(向后引用)?

我使用复合类来分组function。 但是,A类(具有复合A1)由B(具有复合B1)inheritance,并且A1处存在的行为将在B1处被调整,但是最终a1必须是B1实例才能使其工作。 Obs。:我有办法确保复合实例化正确发生(仅由其复合伙伴)。 无法将B1对象分配给a1 final字段: class finalFieldTestFails{ class A1{ A1(A a){} } class A{ protected final A1 a1; A(){ this.a1 = new A1(this); } A(A1 a1){ this.a1 = a1; } } class B1 extends A1{ B1(B b){ super(b); } } class B extends A{ //B(){ super.a1=new B1(this); } //FAIL: cant change final value //B(){super(new B1(this));} […]

从内部类引用的局部变量必须是最终的或有效的最终

这个程序是我class级的最后一个任务,我有问题弄清楚为什么我收到错误“从内部类引用的局部变量必须是最终的或有效的最终版本”。 程序正在运行并发线程来对#的数组进行排序,然后找到该数组的高值和低值。 当我在没有并发的情况下创建它时,我没有出现此错误。 我在努力确定高低变量的最终位置。 public void HiLo(int[] numbers){ int high = numbers[0]; int low = numbers[0]; Runnable r2 = new Runnable(){ @Override public void run() { System.out.println(“The highest value is: “); for (int index = 1; index high) high = numbers[index]; System.out.println(high); } System.out.println(); System.out.println(“The lowest value is: “); for (int ind = 1; ind […]

为什么实例变量是最终的?

我读了关于不可变对象的这个问题 ,并留下了关于不可变对象和最终字段的问题: 为什么我们需要在不可变类中的实例变量为final? 例如,考虑这个不可变类: public final class Immutable { private final int someVal; public Immutable(int someVal) { this.someVal= someVal; } public int getVal() { return val; } } 如果在上面的代码中没有set方法,并且实例变量只在构造函数中设置,为什么要求将实例变量声明为final?

用作锁的瞬态最终字段为空

以下代码抛出NullPointerException 。 import java.io.*; public class NullFinalTest { public static void main(String[] args) throws IOException, ClassNotFoundException { Foo foo = new Foo(); foo.useLock(); ByteArrayOutputStream buffer = new ByteArrayOutputStream(); new ObjectOutputStream(buffer).writeObject(foo); foo = (Foo) new ObjectInputStream(new ByteArrayInputStream(buffer.toByteArray())).readObject(); foo.useLock(); } public static class Foo implements Serializable { private final String lockUsed = “lock used”; private transient final […]

Java最终字段的值的’最新’保证是否延伸到间接引用?

Java语言规范定义了第17.5节中最终字段的语义: 最终字段的使用模型很简单。 在该对象的构造函数中设置对象的最终字段。 在对象的构造函数完成之前,不要在另一个线程可以看到的地方写入对正在构造的对象的引用。 如果遵循此操作,那么当另一个线程看到该对象时,该线程将始终看到该对象的最终字段的正确构造版本。 它还将看到那些最终字段引用的任何对象或数组的版本,这些字段至少与最终字段一样是最新的。 我的问题是 – ‘最新’保证是否扩展到嵌套数组和嵌套对象的内容? 简而言之:如果一个线程将可变对象图分配给对象中的最终字段,并且对象图永远不会更新,那么所有线程都可以通过最终字段安全地读取该对象图吗? 示例场景: 线程A构造一个ArrayLists的HashMap,然后在类’MyClass’的实例中将HashMap分配给final字段’myFinal’ 线程B看到对MyClass实例的(非同步)引用并读取’myFinal’,并访问和读取其中一个ArrayLists的内容 在这种情况下,线程B看到的ArrayList的成员是否保证至少与MyClass的构造函数完成时一样最新? 我正在寻找澄清Java内存模型和语言规范的语义,而不是像同步这样的替代解决方案。 我的梦想答案是肯定或否定,并参考相关文字。 更新: 我对Java 1.5及更高版本的语义感兴趣,即通过JSR 133引入更新的Java内存模型。此更新中引入了最终字段的“最新”保证。

java中的最终变量和同步块

Java中的最终变量是什么? 例如:如果我写final int temp; 在函数中final关键字的含义是什么? 此外,我什么时候想使用最终变量(作为类变量和函数变量)? 为什么同步块中的变量必须声明为final?