Java 对象实例化的不同方式及其差异
以下两者之间的区别是什么:Java 对象实例化的不同方式及其差异,java,c#,Java,C#,以下两者之间的区别是什么: Student s=新学生()//与声明在同一行实例化 Student s; s = new Student(); // instantiation and declaration in different lines 与第一种方法相比,使用第二种方法的优势是什么?我们在什么情况下使用这两种方法 (第二种方法在集合中非常明显)对于Java,这真的不重要。假设这两条线紧随其后。唯一细微的区别是: 1: Student s1, s2 = new Student();
Student s=新学生()//与声明在同一行实例化
Student s;
s = new Student(); // instantiation and declaration in different lines
与第一种方法相比,使用第二种方法的优势是什么?我们在什么情况下使用这两种方法
(第二种方法在集合中非常明显)对于Java,这真的不重要。假设这两条线紧随其后。唯一细微的区别是:
1: Student s1, s2 = new Student();
2: s1 = new Student();
在第1行之后,s1是空的;但是,如果您试图实际使用未初始化的s1,编译器将给您一条错误消息
我认为“最佳实践”是“在一个地方做事”。意思是:您可以在变量的正确位置初始化变量;只有当你有充分的理由这样做时,你才会偏离这条规则。但请注意,这更像是一个风格问题
最后:在我看来更重要的方面——至少在谈论类的字段时(而不是方法中的局部变量);使用final关键字是您更愿意做的事情。因为编译器会强制您只定义一次变量。使用构造函数总是更好。您还可以使用以下代码:
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;
}
}
但出于可读性/可维护性的原因,避免创建参数过多的构造函数。这就是我们所说的初始化:
Student s = new Student();
鉴于这只是一项任务:
s = new Student();
这两者之间没有重要区别。在某些情况下,我们应该使用第二种方法,例如,在实例化流时:
InputStream inputStream;
try {
inputStream = new FileInputStream("c:\\data\\input.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
在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();
}
对于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();
是哪一个?Java或c#?没有任何变化,两者都是相同的,除了可读性计数。唯一的区别是,如果它们不在同一行上,您可以在它们之间插入代码。Schweet,一切都很好。:)没有人怀疑NullPointerException?我认为这应该是一个编译错误,无论是在C#还是Java中。@DannyChen很好地捕捉到了。你完全正确,还没有人注意到。我相应地更新了我的答案。
Fruit f=wantApple?新苹果():新橙子()代码>@DavidArno首先,这不仅仅是Java,因为OP的问题被标记为Java和C。其次,有时在if
块中有多个new
表达式。三元运算符也存在于C#中。如果在if
中有多条语句,则将它们重构为单独的方法,并且仍然可以使用三元运算符。上面的三元表达式不会在C#中编译,因为C#不会根据其赋值推断表达式的类型。啊,你是对的。我总是忘记C#的那个讨厌的特性。