final

Can object access be reordered with that object's final field access in Java?

耗尽温柔 提交于 2020-06-25 04:41:08
问题 Below code sample is taken from JLS 17.5 "final Field Semantics": 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 = f.x; // guaranteed to see 3 int j = f.y; // could see 0 } } } Since the instance of FinalFieldExample is published through a data race, is it possible that the f != null check evaluates successfully, yet

Modifying final fields inside the class in Dart

吃可爱长大的小学妹 提交于 2020-06-10 11:20:49
问题 Dart docs read: If you never intend to change a variable, use final or const, either instead of var or in addition to a type. A final variable can be set only once; Ok, this means that assigning a final variable second time will not work, but nothing is said about modifying, i.e. void main() { final List<int> list = [1,2,3]; list = [10, 9, 8]; //error! list ..clear() ..addAll([10, 9, 8]); //works! } As one can see, in essence, I re- assigned final variable list . Doesn't it contradict the

Using ` LinkedBlockingQueue` may cause null pointer exception

白昼怎懂夜的黑 提交于 2020-06-09 07:13:06
问题 I am learning java concurrent programming recently. I know that the final keyword can guarantee a safe publication. However, when I read the LinkedBlockingQueue source code, I found that the head and last field did not use the final keyword. I found that the enqueue method is called in the put method, and the enqueue method directly assigns the value to last.next . At this time, last may be a null because last is not declared with final . Is my understanding correct? Although lock can

Why a final class cannot be inherited but a final method can be inherited?

岁酱吖の 提交于 2020-05-10 06:24:39
问题 I have a big confusion in the usage of "final" keyword between classes and methods i.e.why final methods only support inheritance but not final classes final class A{ void print(){System.out.println("hello world");} } class Final extends A{ public static void main(String[] args){ System.out.println("hello world"); } } ERROR: cannot inherit from Final A class Final extennds A{ FINAL METHOD IS.. class Bike{ final void run(){System.out.println("run");} } class Honda extends Bike{ public static

Why a final class cannot be inherited but a final method can be inherited?

泄露秘密 提交于 2020-05-10 06:23:27
问题 I have a big confusion in the usage of "final" keyword between classes and methods i.e.why final methods only support inheritance but not final classes final class A{ void print(){System.out.println("hello world");} } class Final extends A{ public static void main(String[] args){ System.out.println("hello world"); } } ERROR: cannot inherit from Final A class Final extennds A{ FINAL METHOD IS.. class Bike{ final void run(){System.out.println("run");} } class Honda extends Bike{ public static

Java中static、final用法小结

痴心易碎 提交于 2020-04-17 03:49:51
【推荐阅读】微服务还能火多久?>>> 一、final 1.final变量: 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。其 初始化 可以在两个地方,一是其 定义 处,也就是说在final变量定义时直接给其赋值,二是在 构造函数 中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。 当 函数参数为final 类型时,你可以读取使用该参数,但是无法改变该参数的值。 另外方法中的 内部类 在用到方法中的参变量时,此参变也必须声明为final才可使用 2.final方法 如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。 使用final方法的原因有二: 第一、把方法锁定,防止任何继承类修改它的意义和实现。 第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。 3.final类 final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。 二、static

使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

前提是你 提交于 2020-04-10 18:08:45
使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句: Final StringBuffer a=new StringBuffer(" Hello "); 上面的这条语句在堆中创建了一个StringBuffer类型的"Hello"对象,并创建了一个变量a指向堆中该对象的首地址。 如果再执行如下语句将报告编译期错误: a=new StringBuffer(" immutable "); 但是,执行如下语句则可以通过编译: a.append(" world!"); 由于上面这条代码,只是修改了对象中的内容,而并没有修改变量的引用,即变量的引用还是堆中的那个地址,只是那个地址中的内容发生了改变罢了。 有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:即在参数类型前面添加final修饰 public void method(final StringBuffer param) { // param.append("a"); } 实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象的内容: param.append("a"); 来源: oschina 链接: https://my.oschina.net/u/858284/blog/229164

How compile time constant will work internally in java

本小妞迷上赌 提交于 2020-03-23 14:33:15
问题 My question is how compile time constant works internally so we didn't get an error in Below statement. final int a = 10; byte b = a; And why am I getting error in this statement. int a = 10; byte b = a; 回答1: This is because not all ints will fit into a byte. In your first example, the value of a is known and cannot change. The compiler knows that it will fit into a byte. In your second example, because a is not final, it's possible that it could have been changed (though not in your example)

JAVA 中的static、final

北城以北 提交于 2020-03-22 03:07:12
1、static 如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main(),所以它被声明为static。 有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static成员的最常见的例子是main( )。因为在程序开始执行时必须调用main(),所以它被声明为static。 static变量: 声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量,也就是说不管你new多少个类的对象,这个static变量永远只有一个。 static定义的变量会优先于任何其它非static变量,不论其出现的顺序如何。 在static后加大括号({)里面有一段代码,是用来进行显式的静态变量初始化,这段代码只会初始化一次

final

試著忘記壹切 提交于 2020-03-17 06:36:01
final 修饰的类不能被继承,且类中的方法自动成为final,域不是 修饰的方法不能被重写 修饰的域不能被改变值 final关键字修饰的方法所要实现的活动,在虚拟机的即时编译器编译时会形成内联,可以减少动态绑定过程的开销 public class Employee{ private String name; public final String getName(){ return this.name; } } Employee e = new Employee(); getName()没有被覆盖时,当调用e . getName() 时,通过内联调用,变为e . name 来源: CSDN 作者: D_pfei 链接: https://blog.csdn.net/D_pfei/article/details/104854529