代码之家  ›  专栏  ›  技术社区  ›  Ayush Goyal

我真的需要在java中定义默认构造函数吗?

  •  29
  • Ayush Goyal  · 技术社区  · 15 年前

    如果没有定义构造函数,它可以正常工作,但是如果我定义了参数化构造函数而不是默认构造函数,则会出现错误 在创建对象时不传递任何值 . 我以为构造函数是预定义的。

    如果定义了参数化构造函数,为什么需要定义默认构造函数?默认构造函数不是预定义的吗?

    5 回复  |  直到 9 年前
        1
  •  61
  •   Justin Ardini    15 年前

    将自动创建默认(无参数)构造函数 只有 当您自己没有定义任何构造函数时。

    如果需要两个构造函数,一个带参数,一个不带参数,则需要手动定义这两个构造函数。

        2
  •  18
  •   MC Emperor    8 年前

    虽然以上所有的答案都是正确的,但对于新来的人来说,想把这些都写进脑子里有点困难。我将为新来的人重新回答这个问题。

    Ayush面临的问题是试图实例化 Object 对于通过无参数构造函数的类。但是,这个类有一个或多个参数化构造函数,这会导致编译时错误。

    例如,让我们创建一个类 Student 并尝试通过no arg构造函数实例化它。

    public class Student {
    
        private String name;
        private int rollNo;
    
        public Student(String name, int rollNo) {
            this.name = name;
            this.rollNo = rollNo;
        }
    
        public static void main(String[] args) {
            // The line below will cause a compile error.
            Student s = new Student();
            // Error will be "The constuctor Student() is undefined"
        }
    }
    

    哇哈!但是当我们移除 public Student(String name, int rollNo)

    这种异常现象背后的原因在于 当我们不定义任何参数时,为我们提供默认(无参数)构造函数 这个类的构造函数。

    public class Student {
        private String name;
        private int rollNo;
    }
    

    变成:

    public class Student {
    
        private String name;
        private int rollNo;
    
        //Default constructor added by Java.
        public Student() {
            super();
        }
    }
    

    换句话说,当我们定义任何参数化构造函数的时候, 我们 必须 如果我们想实例化,也要定义一个无参数构造函数 通过无参数构造函数的该类的对象。

    同样在继承的情况下,提供了一个没有构造函数的子类 默认构造函数。如上所述,Java提供的这个默认构造函数调用超类的no-arg构造函数。如果找不到,就会抛出一个错误。

    因此,定义一个无参数/默认构造函数总是一个不错的选择。

    裁判: Oracle Java Tutorial

        3
  •  11
  •   Noon Silk    15 年前

        4
  •  2
  •   daphshez    15 年前

    这正是预期的行为。

    Java自动为没有任何构造函数的类生成一个默认值(没有参数构造函数)。

        5
  •  1
  •   manisha mulchandani    10 年前

    每当编译类时,若编译器在类中找不到任何有效的构造函数(默认值,参数化),则它将用自动生成的默认构造函数替换类。

    但是,如果在类中定义参数化构造函数,则意味着要限制对象具有该参数

    所以,在那个时候,编译器不会在那个里插入任何默认构造函数,因为在一个类。如果你也需要默认构造函数,你必须自己定义。

        6
  •  1
  •   EnGoPy    6 年前

    当您必须定义无参数构造函数时,还有一个奇怪的情况。 正如另一位所写,如果您不指定默认构造函数,Java将为您做这件事。理解“defaultgeneratedbyjava”构造函数的样子是很好的。 实际上,它调用了超类的构造函数,这很好。 现在让我们想象一个例子。 您正在创建车辆类:

    public class Vehicle {
    private String name;
    private String engine;
    
    public Vehicle(String name, String engine) {
        this.name = name;
        this.engine = engine;
    }
    
    public String makeNoise(){
        return "Noiseee";
    } 
    }
    

    现在让我们创建从Vehicle类继承的Car类:

    public class Car extends Vehicle {
    
    @Override
    public String makeNoise() {
        return "Wrrrrrrr....";
    }  }
    

    也许这看起来很奇怪,但它不能编译的唯一原因是Java不能为Car类创建默认构造函数,而Car类调用super Vehicle类。Vehicle类没有参数构造函数,并且当2参数构造函数已经存在时,它无法自动生成。