0

我对 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

4 回答 4

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 和软件中是非常关键的。

请查看Oracle 的以下 Java 教程,其中介绍了 getter 和 setter 的使用以及构造函数的使用

于 2013-09-19T12:59:10.817 回答
0

main方法是声明的static,这意味着它不属于您的类的任何特定副本。如果要创建类的副本以用于任何目的,请使用new,这会导致构造函数为您构建副本,并在您的情况下设置适当的变量(属于类的特定副本,例如副本你持有的vv2变量)。

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

于 2013-09-19T13:03:21.100 回答
0

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

在java平台GC是JVM的主要部分,不可变对象使得GS减少了清理堆内存中不可用对象的工作。

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

于 2013-09-19T13:11:28.173 回答
0

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

public Vehicle()

如果你不定义

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

那么它就不存在了,你也不能使用它。

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

于 2013-09-19T13:35:04.090 回答