这些案例中哪一种是使用方法变量的正确方法?
第一种情况:
private static String var1;
public static void main(String[] args) {
var1 = "Hello";
method1();
}
private static void method1(){
System.out.println(var1);
}
但是,在这种情况下,我引用Oracle:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
在声明字段时,并不总是需要分配值。声明但未初始化的字段将由编译器设置为合理的默认值。一般来说,此默认值将为零或null,具体取决于数据类型。但是,依赖于这样的默认值通常被认为是糟糕的编程风格。
如果我理解这一点,那么使用非初始化变量进行操作是一种糟糕的编程习惯。这包括分配非默认值吗?他们是说String test="abcd"
比String test; test = "abcd"
好吗?
第二种情况:
public static void main(String[] args) {
String var1 = "Hello";
method1(var1);
}
private static void method1(String chain){
System.out.println(chain);
}
这2个案例中哪一个会使用更多硬件?
答案 0 :(得分:3)
首先,扩展我的评论:您带来的报价警告您不要依赖字段的默认值。
定义字段时,例如:
private int diff;
它的值为零。您可以在您的某个方法中编写代码,其中包含以下内容:
result = 5 + diff;
由于diff
为零,这将起作用。但这是不好的做法。如果你想依赖diff为零的事实,你应该将其声明为
private int diff = 0;
或者在开始使用之前初始化它。
这与你的实际两个问题无关。那么,这两种情况中哪一种会使用更多的硬件?
private static String var1;
在加载类时,这会在堆内存中为String
引用分配足够的字节。这是专用于类变量的堆的一部分(因为变量是静态的)。
var1 = "Hello";
这会将内存分配给“Hello”(这个分配是提前完成的,因为这是一个文字,但它仍然被分配),并将引用分配(复制)到变量var1
。
所以:
"Hello"
)println
方法的堆栈的引用的副本。在第二种方法中,您使用局部变量和方法参数。在堆栈上执行代码期间分配局部变量和参数。调用方法时,会为它将使用的所有参数和局部变量分配足够的空间。
main
至var1
"Hello"
var1
method1
chain
分配的参考堆栈位置。var1
的值传递给chain
。println
方法的堆栈的引用的副本。因此,如果不考虑在这些操作中花费了多少字节和多少CPU周期,很明显第二种方法比第一种方法需要更多的硬件。
这有关系吗?不,不是真的。只有在应用程序中实际遇到缓慢或内存膨胀时,才应进行优化(节省资源)。正确设计课程更为重要。为此,我认为共识是第二种情况,即局部变量和参数传递,优于第一种情况,其静态变量。
为什么呢?这是一个长期且倾向于意见的讨论,但是,例如,使用类甚至实例变量就像使用全局变量一样。您可以在使用它们的方法之外更改它们,这意味着如果更改实现,您可能会更改方法所依赖的值。它可能更难阅读和理解,并且更难调试。最好保持实例变量来表示对象的真实“状态”,并且应尽可能少地使用类变量(静态)。
清洁设计通常胜过硬件考虑因素。
答案 1 :(得分:2)
如果你问为什么
String var1 = "Hello"
优于
String var1;
var1 = "hello"
然后是因为。
最好初始化变量,因为它可以防止可能的NullPointerException
和错误代码。 如果你没有初始化一个变量,大多数语言会分配一个默认值。(总是更好地处理一个已知的恶魔而不是一个未知的。)
在某些情况下,它可以帮助编译器预编译代码。
从纯粹主义的角度来看,String var = null;
应该被认为比String var;
更好,因为它增加了代码的可读性。
也可以更好地编写一行代码而不是两行代码来实现相同的功能。
关于性能的查询,差异应该是微不足道的。