Java:声明对象或整数时

时间:2012-01-20 22:12:11

标签: java object declare

在java中创建对象(或任何东西)时,执行之间的区别是什么,例如

Dog d = new Dog();

而不是

Dog d;

然后用

完成它(有时在内部和方法的开头)
d = new Dog();

第一个更简单,更容易吗?为什么人们会采取第二种方式呢?

11 个答案:

答案 0 :(得分:5)

考虑以下情况。假设Dog的构造函数可以抛出异常:

try {
    Dog d = new Dog();    
} catch(Exception ex) {
    // treat exception
}

d.bark();

这不会编译,因为在d块之外看不到try。你需要做的是:

Dog d = null;
try {
    d = new Dog();    
} catch(Exception ex) {
    // treat exception
}
if(d != null) d.bark();

还有很多其他情况。例如,您可能有一个if-else块,其中d根据某些条件进行了不同的初始化:

Dog d = null;
if(/* condition */)
    d = new Dog("Lassie");   
} else {
    d = new Dog("Sam");
}
d.bark();

答案 1 :(得分:3)

这个问题缺乏一些重要的背景。如果变量定义和用法在不同的范围内,则存在很大差异。例如:

class A { 
  Dog d;

  void foo() { d = new Dog(); }
}

...允许class A的每个成员访问Dog。

如果用法在同一范围内,

class A {
  void foo() {
     Dog d;
     d = new Dog();
  }
}

...那么这是一个可读性问题,因为代码将在一行或两行中与它运行相同。

答案 2 :(得分:1)

因为您在声明对象时并不总是知道如何构造对象。 例如:

Dog dog;
if ("M".equals(sex)) {
    dog = new Dog("Medor");
}
else {
    dog = new Dog("Mirza");
}
dog.walk();

答案 3 :(得分:1)

很多原因。一个原因可能是初始化取决于运行时确定的条件。例如,

Animal pet;
...
if(input == 0) pet = new Dog();
else pet = new Cat();
...
pet.sleep();

答案 4 :(得分:1)

这只是声明引用(您说d将具有类型Dog):

Dog d;

这是创建一个新对象,指定它引用变量d

new Dog();

你可以将它组合起来,因为你经常同时做这两件事,但并非总是如此。

答案 5 :(得分:1)

虽然习惯分离声明和初始化

并不是一个好主意
  • 在某些情况下,需要执行此操作(请参阅try catch示例),

  • 在某些情况下,它可以提高代码的可读性(参见Max Schmidt的例子),

  • 在某些情况下,它会使您的代码更加健壮。

为了说明最后一点,请考虑Max Schmidt的修改示例:

Dog d = null;
if (input.equals("lab")) {
   d = new Labrador();
} else if (input.equals("bull")) {
   d = new Bulldog();
}
d.walk();

看到错误?如果input既不是"lab"也不是"bull",那么当我们走null狗时,代码就会死亡。

但是,如果我们删除d的初始化,那么编译器会告诉我们代码中有一条路径使d未初始化。如果我们正在关注,我们会在代码运行之前看到错误并修复它。

答案 6 :(得分:0)

这是延迟初始化的粗略示例。在您的程序中,您可能永远不需要Dog对象的实际实例。在这些情况下,您可以简单地声明Dog引用,它不会消耗太多内存,并在需要时稍后进行初始化。

答案 7 :(得分:0)

对象创建和对象声明。你可以阅读它here

当您执行Dog d = new Dog();时,您声明了d类型的变量Dog,并使用new运算符创建变量。

因此,您通常会在开头声明所需的变量,并仅在真正使用它们时才创建它们。

答案 8 :(得分:0)

没有理由,这只是一个糟糕的编码习惯。由于在初始化之前无法使用d,因此没有必要在之前声明它:

Dog d;
//...you cannot use `d` in any way! It won't compile
d = new Dog();
//now you can

然而:

Dog d = null;
//...
d = new Dog();

有意义,因为有人可能会检查null(延迟初始化等)

为了简单起见,您实际上应该更喜欢:

final Dog d = new Dog();

答案 9 :(得分:0)

第二个可能更有用的是你有类似try / catch的东西,其中Dog将被创建,创建dog实例不应该停止你在该方法中的其他逻辑。如果你想在dog / catch之后使用dog实例,那么继续你的逻辑。

如果您在try / catch中使用第一种语法,则无法在外部使用它。

try {
    Dog d = new Dog();    
} catch(Exception ex) {

}

d.methodCall();

答案 10 :(得分:0)

有时除了第二个之外别无他法,例如,如果狗是拉布拉多和斗牛犬的超类:

Dog d;

if (input == "lab"){
  d = new Labrador();
}else if {
 d = new  Bulldog();
}

d.urinate():