在同一个类中创建的构造函数的重要性是什么?

时间:2013-09-19 12:56:04

标签: java constructor

我是Java的新手。我知道构造函数的基本概念。我知道,如果我们不创建任何构造函数,编译器也会创建默认构造函数。

我创建了一个程序来检查这个toString()方法是如何可用的,

public class Vehicle{
    int rollNo;
    String name;
    int age;
    public Vehicle(int rollNo, String name, int age){
        this.rollNo=rollNo;
        this.name=name;
        this.age=age;
    }

    public String toString(){
        return rollNo+""+name+""+age;
    }

    public static void main(String[] args){
        Vehicle v=new Vehicle(100, "XXX", 23);
        Vehicle v2=new Vehicle(101, "XXXS", 24);

        System.out.println(v);
        System.out.println(v2);
    }
}

而且,我得到的输出为:

   100XXX23
   101XXXS24

但是,我怀疑为什么我们创建构造函数并将相同的变量作为参数传递给它?

为什么我们不能将值分配给这样的变量而不能在没有构造函数的情况下获取值?

public class Vehicle{
    int rollNo=100;
    String name="XXX";
    int age=23;
    // public Vehicle(int rollNo, String name, int age){
    //     this.rollNo=rollNo;
    //     this.name=name;
    //     this.age=age;
    // }
    // 


    public static void main(String[] args){
      //  Vehicle v=new Vehicle(100, "XXX", 23);
    //    Vehicle v2=new Vehicle(101, "XXXS", 24);

            Vehicle v=new Vehicle(rollno,name,age);
         //   Vehicle v2=new Vehicle();



        System.out.println(v);
      //  System.out.println(v2);
    }

     public String toString(){
        return rollNo+""+name+""+age;
    }
}

4 个答案:

答案 0 :(得分:0)

首先,可以在类定义中设置属性或属性的值,而无需定义构造函数。这可以通过在Java类中的属性/属性上使用setter来完成。例如:

public class Vehicle{
    int rollNo;
    String name;
    int age;

    // Note no constructor, so the default no-arg constructor can be used. 

    // Now the setters
    public void setRollNo(int anInt) {
        this.rollNo = anInt;
    }

    public String setName(String aName) {
        this.name = aName;
    }

    public void setAge(int anAge) {
        this.age = anAge;
    }

    public static void main(String[] args){
        Vehicle v=new Vehicle(); // note no-arg constructor being used.
        v.setRollNo(3);
        v.setName("Hello");
        v.setAge(12);
        System.out.println(v);
    }

}

当你遵守一个重要的OOP原则时,使用setter会好得多;封装的,在Java和软件中非常关键。

请查看以下Java Tutorial from Oracle that goes through the use of getters and setters and the use of constructors

答案 1 :(得分:0)

main方法声明为static,这意味着它不属于您班级的任何特定副本。如果要创建要用于任何目的的类的副本,可以使用new,这会导致构造函数为您构建副本,并在您的情况下设置适当的变量(属于特定的副本)类,就像您在vv2变量中保存的副本一样。

main方法属于同一个类的事实基本上无关紧要; main可以附加到任何类,甚至是空的。

答案 2 :(得分:0)

你必须使用带有参数的构造函数的原因是创建的实例是不可变对象,这意味着在创建后不能修改其状态。换句话说,对象没有setter它只有getter方法。

在java平台中,GC是JVM的主要部分,而不可变对象使得GS不太可能清理堆内存中的不可用对象。

请参阅链接http://c2.com/cgi/wiki?ImmutableObjectsAndGarbageCollection

答案 3 :(得分:0)

编译器的默认构造函数如下:

public Vehicle()

如果您没有定义

public Vehicle(int rollNo, String name, int age)

然后它将不存在,你不能使用它。

Java不会创建带参数的默认构造函数。