在Java中,main()
方法的哪个声明是有效的?我们常用公共静态void main(String[]arr){}
,但我想知道的是:main()
方法可以声明为final吗?
final public static void main(String[] arr) {
//...
}
是的,您可以标记main
final
。
虽然这是可能的,但并没有真正意义。无法重写final
方法。但是静态方法无论如何都不行,因为它们在扩展时不是继承的。
但是,当通过在扩展类中引入同名的方法而实际隐藏时,它会有效果。参见最终静态方法的行为。
public class A {
public static void main(String[] args) {
System.out.println("Hello from A");
}
}
public class B extends A {
public static void main(String[] args) {
System.out.println("Hello from B");
}
}
假设您正在手动调用这些方法:
A.main(null); // "Hello from A"
B.main(null); // "Hello from B"
注意,Java还允许从实例调用static
方法:
A a = new A();
a.main(null); // "Hello from A"
B b = new B();
b.main(null); // "Hello from B"
但是,如果您将b
对象的视图缩小为a
对象,该怎么办:
A bAsA = new B();
bAsA.main(null); // "Hello from A"
将main
标记为final
将导致任何子类都不能再隐藏您的方法。也就是说,b
将不能再声明方法main
(使用相同的签名)。上述代码将无法编译。
我正在讨论以下问题:使用Java 8的可选和stream::FlatMap并希望向自定义的添加一个方法,然后检查它是否工作。 更准确地说,我希望向我的添加一个。如果不存在值,则返回一个空流,如果存在,则返回一个包含单个元素的流。 但是,我得出的结论是,声明为final。 为什么会这样呢?有一些类没有声明为final,我个人认为这里没有理由声明final。 作为第二个问题,为什么不是所有的方法都是f
问题内容: 有人可以澄清以下代码的重要性吗? 对象A被声明为final,但是我可以更改该对象的实例变量的值,也可以获取更新后的值。那么将对象声明为final的意义何在?我知道将原始数据类型声明为final,这使该变量保持不变。 问题答案: ob将无法引用任何其他对象:final关键字。 不能重新分配。但是您可以更改其内部(如果它是原始的,则是可变的)。所以这有效: 但这不是:
问题内容: 假设我有一个方法m(),该方法将字符串数组作为参数。有什么方法可以在我打电话时直接声明该数组?即代替: 我可以只用一行代替它,而避免声明一个我永远不会使用的命名变量吗? 问题答案:
问题内容: 当我得知该类在Java中被声明为final时,我想知道为什么会这样。那时我没有找到任何答案,但是这篇文章:如何在Java中创建String类的副本?让我想起了我的疑问。 当然,String提供了我所需要的所有功能,而且我从未想过需要扩展String类的任何操作,但是您仍然永远不会知道有人可能需要什么! 那么,有谁知道设计师决定将其定稿时的意图是什么? 问题答案: 将字符串实现为不可变对
问题内容: 我们可以重载Java中的方法吗? 问题答案: 您 可以 重载该方法,但仅在JVM启动您的类时使用。例如: 从命令行运行时,即使指定一个或两个命令行参数,该命令也 始终会 打印。 当然,您可以从代码中自己调用该方法-此时将应用常规的重载规则。 编辑:请注意,您可以使用varargs签名,因为从JVM的角度来看,这是等效的:
问题内容: 在阅读有关Java的书时,我看到了一个这样编写的示例。我想知道我可以在main方法之外声明变量吗?在main方法外部和内部声明变量之间有什么区别?“静态”在这里的作用是什么?请有人给我解释一下吗?我是Java新手。 最好的祝福。 问题答案: 1)内部与外部: 如果 在 方法 内部 声明对象,则该对象仅在该方法中可见。基本上,如果在其周围放置方括号,则只能从这些方括号内看到/访问它。 如