我正在使用Java作为初学者我正在学习一个教程(http://www.javatpoint.com/object-and-class-in-java),该教程指出可以通过三种不同的方式将对象初始化为java。
我的问题是,对于单个任务使用三种不同方法的意义是什么。
实施例: 1)对象和类示例:通过引用初始化
class Student{
int id;
String name;
}
class TestStudent2{
public static void main(String args[]){
Student s1=new Student();
s1.id=101;
s1.name="Sonoo";
System.out.println(s1.id+" "+s1.name);//printing members with a white space
}
}
2)对象和类示例:通过方法初始化
class Student{
int rollno;
String name;
void insertRecord(int r, String n){
rollno=r;
name=n;
}
void displayInformation(){System.out.println(rollno+" "+name);}
}
class TestStudent4{
public static void main(String args[]){
Student s1=new Student();
Student s2=new Student();
s1.insertRecord(111,"Karan");
s2.insertRecord(222,"Aryan");
s1.displayInformation();
s2.displayInformation();
}
}
3)对象和类示例:通过构造函数初始化
class Employee{
int id;
String name;
float salary;
void insert(int i, String n, float s) {
id=i;
name=n;
salary=s;
}
void display(){System.out.println(id+" "+name+" "+salary);}
}
public class TestEmployee {
public static void main(String[] args) {
Employee e1=new Employee();
Employee e2=new Employee();
Employee e3=new Employee();
e1.insert(101,"ajeet",45000);
e2.insert(102,"irfan",25000);
e3.insert(103,"nakul",55000);
e1.display();
e2.display();
e3.display();
}
}
答案 0 :(得分:0)
对单个任务使用三种不同的方法有什么意义。
它与软件开发中的任何任务具有相同的意义:通常有多种编写代码的方法可以产生相同的最终状态,因此我们考虑哪一种最合适。可以说(恕我直言),这是真正的开发技巧:不仅仅是能够使计算机做特定的事情,而是编写代码来做那些简单/干净/可理解/可扩展的事情因为它可能是。
在这种特定情况下,我会强烈建议通过构造函数初始化字段。有时,对象的字段是可变的,并且在创建对象之后进行初始化(如情况1和2)。但在大多数情况下 - 特别是在这里" id"定义对象本身的字段 - 如果使用这些字段构造对象,则最清楚。这样,对象处于无效状态就没有意义;创建一个没有Employee
的{{1}}对象是不可能的。
请注意,您为示例3粘贴的内容是不是构造函数初始化的示例!仔细阅读页面,他们说他们将在稍后介绍。您粘贴的代码不相关。
我会做以下事情:
id
(请注意,我可能也会将class Student{
final int id;
final String name;
// This is the constructor that will initialise the fields with what's passed in
// (Note that because the fields are final, they MUST be set by the constructor)
public Student(int id, String name) {
this.id = id;
this.name = name;
}
}
class TestStudent6 {
public static void main(String args[]){
Student s1 = new Student(101, "Sonoo");
System.out.println(s1.id + " " + s1.name); //printing members with a white space
}
}
和id
字段设为私有,并设置name
和getId()
方法来代替访问它们,但是& #39;超出你所要求的范围。)
答案 1 :(得分:0)
对象具有state
及其内部,因此最好将其从外部隐藏,即外部类不可访问。将有其他类可能依赖于对象。理想情况下,这些外部类应该依赖于修改或读取状态的公共方法。隐藏内部细节(状态)并仅暴露所需方法是个好主意。
现在我们已经封装了我们的字段,因此请参阅使用构造函数与setter进行初始化。如果一个类由几个字段组成,没有这个字段,那个类的对象没有意义,就像MovingCar
由wheels
组成,所以如果有一个字段wheels
则必须与MovingCar
的对象的创建一起被启动。这些字段更好地通过构造函数来启动。可以使用setter方法来初始化诸如musicSystem
的其他字段。
有时我们可能会遇到这么多构造函数(重载),这可能会让这类类的用户感到困惑。方法更好,可以命名让用户知道意图。在这种情况下,更好的方法是builder pattern
。