如何使用方法

时间:2015-04-27 07:42:47

标签: java

这些案例中哪一种是使用方法变量的正确方法?

第一种情况:

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个案例中哪一个会使用更多硬件?

2 个答案:

答案 0 :(得分:3)

首先,扩展我的评论:您带来的报价警告您不要依赖字段的默认值。

定义字段时,例如:

private int diff;

它的值为零。您可以在您的某个方法中编写代码,其中包含以下内容:

result = 5 + diff;

由于diff为零,这将起作用。但这是不好的做法。如果你想依赖diff为零的事实,你应该将其声明为

private int diff = 0;

或者在开始使用之前初始化它。

这与你的实际两个问题无关。那么,这两种情况中哪一种会使用更多的硬件?

private static String var1;

在加载类时,这会在堆内存中为String引用分配足够的字节。这是专用于类变量的堆的一部分(因为变量是静态的)。

var1 = "Hello";

这会将内存分配给“Hello”(这个分配是提前完成的,因为这是一个文字,但它仍然被分配),并将引用分配(复制)到变量var1

所以:

  • 分配的内存中的1个参考位置。
  • 分配了1个字符串对象。 ("Hello"
  • 1该字符串的赋值。
  • println方法的堆栈的引用的副本。

在第二种方法中,您使用局部变量和方法参数。在堆栈上执行代码期间分配局部变量和参数。调用方法时,会为它将使用的所有参数和局部变量分配足够的空间。

  • mainvar1
  • 中分配的1个筹码位置供参考
  • 分配给"Hello"
  • 的1个字符串对象
  • 1将该字符串分配给var1
  • method1 chain分配的参考堆栈位置。
  • 1对引用的分配 - 在方法调用中将var1的值传递给chain
  • println方法的堆栈的引用的副本。

因此,如果不考虑在这些操作中花费了多少字节和多少CPU周期,很明显第二种方法比第一种方法需要更多的硬件。

这有关系吗?不,不是真的。只有在应用程序中实际遇到缓慢或内存膨胀时,才应进行优化(节省资源)。正确设计课程更为重要。为此,我认为共识是第二种情况,即局部变量和参数传递,优于第一种情况,其静态变量。

为什么呢?这是一个长期且倾向于意见的讨论,但是,例如,使用类甚至实例变量就像使用全局变量一样。您可以在使用它们的方法之外更改它们,这意味着如果更改实现,您可能会更改方法所依赖的值。它可能更难阅读和理解,并且更难调试。最好保持实例变量来表示对象的真实“状态”,并且应尽可能少地使用类变量(静态)。

清洁设计通常胜过硬件考虑因素。

答案 1 :(得分:2)

如果你问为什么

String  var1 = "Hello" 

优于

String var1;
var1 = "hello"

然后是因为。

  1. 最好初始化变量,因为它可以防止可能的NullPointerException和错误代码。 如果你没有初始化一个变量,大多数语言会分配一个默认值。(总是更好地处理一个已知的恶魔而不是一个未知的。)

  2. 在某些情况下,它可以帮助编译器预编译代码。

  3. 从纯粹主义的角度来看,String var = null;应该被认为比String var;更好,因为它增加了代码的可读性。 也可以更好地编写一行代码而不是两行代码来实现相同的功能。

    关于性能的查询,差异应该是微不足道的。