在Java中,final
在接口方法中定义参数并且不遵循实现类中的参数是完全合法的,例如:
public interface Foo {
public void foo(int bar, final int baz);
}
public class FooImpl implements Foo {
@Override
public void foo(final int bar, int baz) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,bar
并且在类VS的接口中baz
有相反的final
定义.
以同样的方式,final
当一个类方法扩展另一个类时,不会强制执行任何限制abstract
.
虽然final
在类方法体内有一些实用价值,但是有没有指定final
接口方法参数的点?
首先,一个难题:以下代码打印什么?
public class RecursiveStatic {
public static void main(String[] args) {
System.out.println(scale(5));
}
private static final long X = scale(10);
private static long scale(long value) {
return X * value;
}
}
Run Code Online (Sandbox Code Playgroud)
回答:
0
下面的剧透.
如果您打印X
的规模(长),并重新定义X = scale(10) + 3
,印刷品会X = 0
那么X = 3
.这意味着X
暂时设置为0
以后设置为3
.这是违反final
!
static修饰符与final修饰符结合使用,也用于定义常量.最终修饰符表示此字段的值不能更改.
来源:https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html [强调添加]
我的问题:这是一个错误吗?被final
定义不清?
这是我感兴趣的代码.
X
分配了两个不同的值:0
和3
.我认为这违反了 …
有什么理由禁止Java中的继承,例如使用单个私有无参数构造函数使用final类或类?使方法最终成功的理由是什么?
我发现了一些建议使用的参考文献(例如)final
尽可能多地使用,我想知道它有多重要.这主要是在方法参数和局部变量的上下文中,而不是最终方法或类.对于常数,它显然是有道理的.
一方面,编译器可以进行一些优化,这使得程序员的意图更加清晰.另一方面,它增加了详细程度,优化可能是微不足道的.
这是我应该努力记住的事情吗?
我经常遇到如下所示的方法:
public void foo(final String a, final int[] b, final Object1 c){
}
Run Code Online (Sandbox Code Playgroud)
如果在不传递最终参数的情况下调用此方法会发生什么.即稍后更改的Object1(因此未声明为final)可以很好地传递给此方法
我找到了一个声明代码的代码
private final static String API_RTN_SUCCESS = "0";
private final static String API_RTN_ERROR = "1";
public static final String SHARED_PREFERENCE_CONFIG = "shared_preference_config";
public static final String STARTUP_SETTING_KEY = "startup_setting";
Run Code Online (Sandbox Code Playgroud)
它们之间有什么区别或它们是一样的?或者它的不同private
或public
?
从我得知该类java.lang.String
在Java中被宣布为final时,我想知道为什么会这样?当时我没有找到任何答案,但这篇文章:如何在Java中创建String类的副本?让我想起了我的疑问.
当然,String提供了我所需要的所有功能,并且从未想过任何需要扩展String类的操作,但你仍然永远不会知道某人可能需要什么!
那么,有没有人知道设计师在决定最终时的意图是什么?
我试图找出Java中常量的原因我已经了解到Java允许我们使用final
关键字来声明常量.
我的问题是为什么Java没有引入Constant(const
)功能.由于很多人说它来自C++,所以在C++中我们有const
关键字.
请分享你的想法.
在Java类中,可以定义一个方法final
,以标记此方法可能不会被覆盖:
public class Thingy {
public Thingy() { ... }
public int operationA() {...}
/** this method does @return That and is final. */
public final int getThat() { ...}
}
Run Code Online (Sandbox Code Playgroud)
这很清楚,它可能有助于防止意外覆盖,或者表现 - 但这不是我的问题.
我的问题是:从OOP的角度来看,我理解通过定义一个方法final
,类设计者承诺这个方法将始终如所描述或隐含的那样工作.但是,这通常可能超出了班级作者的影响,如果该方法所做的事情比传递财产更复杂.
句法约束对我来说很清楚,但OOP意义上的含义是什么?final
大多数班级作者在这个意义上是否正确使用?
final
方法承诺什么样的"合同" ?