对象实例化的不同方式及其差异

时间:2016-09-27 06:56:32

标签: java c#

有什么区别:

Student s = new Student(); //instantiating in the same line as declaration

Student s; 
s = new Student(); // instantiation and declaration in different lines

使用第二种方法比第一种方法有什么优势?我们在什么情况下使用这两种方法?

(第二种方法在收藏中非常明显)

5 个答案:

答案 0 :(得分:4)

对于Java来说,这无关紧要。假设这两行紧跟在彼此之后。唯一微妙的区别:

1: Student s1, s2 = new Student();
2: s1 = new Student();

第1行后,s1 null ;但是如果你试图实际使用未初始化的s1,编译器会给你一个错误信息。

我认为“最佳实践”是“在一个地方做事”。含义:您在declaration处初始化变量;当你有充分的理由时,你只会偏离这条规则。但请注意,这更像是一个风格的问题。

最后:我眼中更重要的方面 - 至少在讨论类的字段时(而不是方法中的局部变量);使用 final 关键字是您应该更喜欢的事情。因为编译器会强制您只定义一次变量。

答案 1 :(得分:1)

在C#和Java中,Student s;声明一个名为s的变量,它是未分配的(未初始化)。您无法在初始化之前访问它。

Student s;
Student ss = s;  //compile error because s is not assigned

未初始化的变量与null不同:

Student s = null;
Student ss = s;  //compiles fine

你问题中的两个实现都很好,但我更喜欢第一个单行代码,因为它更简单。当您想要使用不同类型初始化变量时,第二个非常有用。

Fruit f;

if (wantApple)
{
    f = new Apple();
}
else
{
    f = new Orange();
}

答案 2 :(得分:1)

对于C#,这两种方法之间存在一个显着差异。通过在一个语句中声明和赋值变量,可以使用var

var s = new Student(); //compiler can infer that s is of type Student

Student s; // Type must be specified as it cannot be inferred.
s = new Student(); 

答案 3 :(得分:0)

使用构造函数总是更好。您还可以使用以下代码:

Student s = new Student(){
Name='abc',
Age=15
}

您可以使用在初始化期间传递给构造函数的参数进行一些额外的处理,或者如果您想在调用构造函数之后确保一致的状态。我更喜欢第一个。

public class Student
{
    public string Name { get; private set; }
    public int Age { get; private set; }

    public Student(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

但出于可读性/可维护性的原因,请避免创建具有太多参数的构造函数。

答案 4 :(得分:-1)

这就是我们所说的初始化:

Student s = new Student();

而这只是作业:

s = new Student();

之间没有重要区别。在某些情况下,我们应该使用第二种方式,例如在我们即时流动时:

InputStream inputStream;
try {
    inputStream = new FileInputStream("c:\\data\\input.txt");
} catch (FileNotFoundException e) {
    e.printStackTrace();
}