finalC++ 11中关键字用于函数的目的是什么?我理解它可以防止派生类的函数覆盖,但如果是这种情况,那么将你的final函数声明为非虚函数是不够的呢?还有其他我想念的东西吗?
是否有任何性能原因在Java中声明方法参数final?
如:
public void foo(int bar) { ... }
Run Code Online (Sandbox Code Playgroud)
与:
public void foo(final int bar) { ... }
Run Code Online (Sandbox Code Playgroud)
假设bar只读取并且从未修改过foo().
我一直在玩静态方法的修饰符,并遇到了一个奇怪的行为.
我们知道,静态方法不能被覆盖,因为它们与类而不是实例相关联.
所以,如果我有下面的代码片段,它编译得很好
//Snippet 1 - Compiles fine
public class A {
static void ts() {
}
}
class B extends A {
static void ts() {
}
}
Run Code Online (Sandbox Code Playgroud)
但是如果我在A类中将final修饰符包含到静态方法中,则编译失败 ,B中的ts()不能覆盖A中的ts(); 重写方法是静态最终的.
当静态方法根本无法被覆盖时,为什么会发生这种情况?
到目前为止,我认为有效的 final和final或多或少是等效的,如果在实际行为中不相同,JLS 会将它们相似地对待。然后我发现了这个人为的场景:
final int a = 97;
System.out.println(true ? a : 'c'); // outputs a
// versus
int a = 97;
System.out.println(true ? a : 'c'); // outputs 97
Run Code Online (Sandbox Code Playgroud)
显然,JLS 在这里两者之间产生了重要区别,我不知道为什么。
我阅读了其他主题,例如
但他们没有详细说明。毕竟,在更广泛的层面上,它们似乎几乎是等价的。但深入挖掘,它们显然不同。
是什么导致了这种行为,谁能提供一些解释这一点的 JLS 定义?
编辑:我发现了另一个相关的场景:
final String a = "a";
System.out.println(a + "b" == "ab"); // outputs true
// versus
String a = "a";
System.out.println(a + "b" == "ab"); // outputs false
Run Code Online (Sandbox Code Playgroud)
所以字符串实习在这里的行为也不同(我不想在实际代码中使用这个片段,只是对不同的行为感到好奇)。
我曾经认为private val并且private final val相同,直到我在Scala参考中看到4.1节:
形式是常量值定义
Run Code Online (Sandbox Code Playgroud)final val x = e其中e是常数表达式(§6.24).必须存在最终修饰符,并且不能给出类型注释.对常量值x的引用本身被视为常量表达式; 在生成的代码中,它们被定义的右侧e替换.
我写了一个测试:
class PrivateVal {
private val privateVal = 0
def testPrivateVal = privateVal
private final val privateFinalVal = 1
def testPrivateFinalVal = privateFinalVal
}
Run Code Online (Sandbox Code Playgroud)
javap -c 输出:
Compiled from "PrivateVal.scala"
public class PrivateVal {
public int testPrivateVal();
Code:
0: aload_0
1: invokespecial #19 // Method privateVal:()I
4: ireturn
public int testPrivateFinalVal();
Code:
0: iconst_1
1: ireturn
public PrivateVal();
Code:
0: aload_0
1: invokespecial #24 …Run Code Online (Sandbox Code Playgroud) 我只是想了解为什么在接口定义的所有域都默认static和final.保持字段的想法static对我来说是有道理的,因为你不能拥有接口的对象,但为什么它们final(隐含地)?
任何人知道为什么Java的设计者在接口使得场去static和final?
是什么区别const和final关键字飞镖?
说我有一节课:
public class R {
public static final int _1st = 0x334455;
}
Run Code Online (Sandbox Code Playgroud)
如何通过反射得到字段/属性"_1st"的值?
今天,我和我的同事讨论了finalJava中关键字的用法,以改进垃圾收集.
例如,如果您编写如下方法:
public Double doCalc(final Double value)
{
final Double maxWeight = 1000.0;
final Double totalWeight = maxWeight * value;
return totalWeight;
}
Run Code Online (Sandbox Code Playgroud)
声明方法中的变量final将有助于垃圾收集在方法退出后从方法中未使用的变量清除内存.
这是真的?
在Java中,目的是什么做的关键字final,finally并finalize履行?