在Java中通过三种不同的方式初始化对象有什么用?

时间:2017-02-20 11:37:15

标签: java

我正在使用Java作为初学者我正在学习一个教程(http://www.javatpoint.com/object-and-class-in-java),该教程指出可以通过三种不同的方式将对象初始化为java。

  1. 通过参考变量
  2. 按方法
  3. 通过构造函数
  4. 我的问题是,对于单个任务使用三种不同方法的意义是什么。

    实施例: 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();  
        }  
        } 
    

2 个答案:

答案 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字段设为私有,并设置namegetId()方法来代替访问它们,但是& #39;超出你所要求的范围。)

答案 1 :(得分:0)

对象具有state及其内部,因此最好将其从外部隐藏,即外部类不可访问。将有其他类可能依赖于对象。理想情况下,这些外部类应该依赖于修改或读取状态的公共方法。隐藏内部细节(状态)并仅暴露所需方法是个好主意。

现在我们已经封装了我们的字段,因此请参阅使用构造函数与setter进行初始化。如果一个类由几个字段组成,没有这个字段,那个类的对象没有意义,就像MovingCarwheels组成,所以如果有一个字段wheels则必须与MovingCar的对象的创建一起被启动。这些字段更好地通过构造函数来启动。可以使用setter方法来初始化诸如musicSystem的其他字段。

有时我们可能会遇到这么多构造函数(重载),这可能会让这类类的用户感到困惑。方法更好,可以命名让用户知道意图。在这种情况下,更好的方法是builder pattern