首页 > 试题广场 >

对文件名为Test.java的java代码描述正确的是()

[单选题]
对文件名为Test.java的java代码描述正确的是()
class Person {
	String name = "No name";
	public Person(String nm) {
		name = nm;
	}
}
class Employee extends Person {
	String empID = "0000";
	public Employee(String id) {
		empID = id;
	}
}
public class Test {
	public static void main(String args[]) {
		Employee e = new Employee("123");
		System.out.println(e.empID);
	}
}
  • 输出:0000
  • 输出:123
  • 编译报错
  • 输出:No name
    子类的构造方法总是先调用父类的构造方法,如果子类的构造方法没有明显地指明使用父类的哪个构造方法,子类就调用父类不带参数的构造方法。
而父类没有无参的构造函数,所以子类需要在自己的构造函数中显示的调用父类的构造函数。
发表于 2015-10-11 10:00:00 回复(28)
选C
父类没有无参的构造函数,所以子类需要在自己的构造函数中显式调用父类的构造函数,
添加
super("nm");
否则报错:
Implicit super constructor Person() is undefined. Must explicitly invoke another constructor
class Person {
    String name = "No name";
    public Person(String nm) {
        name = nm;
    }
    
}
class Employee extends Person {
    public Employee(String nm) {
		super(nm);
		// TODO Auto-generated constructor stub
	}

	String empID = "0000";
}
public class Test {
    public static void main(String args[]) {
        Employee e = new Employee("123");
        System.out.println(e.empID);
    }
}

编辑于 2015-09-06 16:45:03 回复(11)
选C 父类没有无参的构造函数,所以子类需要在自己的构造函数中显式调用父类的构造函数, 添加 super("nm"); 否则报错: Implicit super constructor Person() is undefined. Must explicitly invoke another constructor class Person { String name = "No name"; public Person(String nm) { name = nm; } } class Employee extends Person { public Employee(String nm) { super(nm); // TODO Auto-generated constructor stub } String empID = "0000"; } public class Test { public static void main(String args[]) { Employee e = new Employee("123"); System.out.println(e.empID); } }
发表于 2017-09-06 10:26:12 回复(0)
        如果子类构造器没有显示地调用超类的构造器,则将自动地调用超类默认(没有参数)的构造器。如果超类没有不带参数的构造器,并且在子类的构造器中有没有显示地调用超类的其他构造器,则Java编译器将报告错误。使用super调用构造器的语句必须是子类构造器的第一条语句。
                                                                                             ——p153《Java核心技术卷I》
编辑于 2016-01-13 21:08:00 回复(8)
子类的构造方法的第一行隐式的默认调用父类的无参构造器即super();上面Emlpoyee的构造方法其实为:
publicEmployee(String id) {
        super();//这一行隐式的调用
        empID = id;
    }
而在父类Person中,由于已经提供了一个有参的构造方法,编译器也就不会再给Person添加默认的无参构造器了,因此Emlpoyee的构造器中super()这一句报错,因为父类中没有这种无参的构造器。

发表于 2016-06-07 09:47:23 回复(1)
这道题简单通俗的说就是:你爸爸在说话,你没有在听倒是在插嘴了,你说你有没有规矩啦
所以编译器爷爷要生气了
发表于 2017-01-15 23:25:33 回复(10)
Java中子类默认调用父类的无参构造函数,此时父类已经定义了自己的构造函数,这时要显示的调用父类的构造函数publicEmployee(String id) {
        super(id);
        empID = id;
    }
编辑于 2015-09-06 16:08:51 回复(0)
只是要让程序正确的话有3种方法可以改进。
1:像大家说的,在“empID = id;”前加上super(id); (super语句必须是构造器的第一个语句);
2:把publicPerson(String nm) {        name = nm;    }直接删了;或者删去String nm和name = nm;
变成publicPerson() {} 3:父类加上一个无参构造器publicPerson() {} 下面解释原因: 程序会不会报错,子类需不需要加super()语句,其实只要考虑子类在初始化时是不是初始化了包括子类和父类所有的方法和变量即可。
若父类中只有有参构造器,则子类中必然要出现super语句去初始化父类(即本题报错原因) 当你没有为父类写构造器时,java会默认帮你创建一个无参默认构造器,即方法2里面的两个方式是等价的,都是无参形式。
所以在子类继承以后无须初始化。
第三种方法:当出现了两个即以上的构造器,子类没有super()但是没有报错,是因为父类中恰好有无参构造器,当父类中有无参构造器
而子类又没有用super()函数调用父类,则Java会默认用无参构造器去初始化父类。所以也不会报错
 
总之,只要出现了无参构造器就不会报错;要是只有有参构造器则一定要用super()函
发表于 2016-04-06 00:49:42 回复(0)
本题考察的是类的初始化。
由于Employee类继承了Person类,所以在对Employee类进行初始化时,需要先初始化其父类,会调用其父类的构造函数,如果父类有默认构造函数,则子类的构造函数中可以不显示调用父类的构造函数,如果父类没有默认构造函数,则在子类的构造函数中必须显示调用父类的构造函数,否则会编译错误!
发表于 2016-04-03 15:24:41 回复(0)
要记住的是,如果子类继承父类,那就必须要先调用父类的构造函数,如果父类没有显式的构造函数,那么编译器会自动构造一个无参的构造函数,如果父类有含参的构造函数,那么子类必须显式地调用父类的构造函数,通过super(args)来调用,否则编译器会报错。
发表于 2017-03-26 13:38:11 回复(1)
发表于 2016-01-08 14:54:01 回复(4)
看了一下大佬们的解答,说得太专业太有深度了,看起来有点吃力。说一下我的见解吧。
Employee类继承了Person类,由于程序的执行过程是固定的,先父类的构造方法,再到子类的构造方法。在Employee类中的构造方法一定要先调用父类的构造方法,而父类Person类中,并没有无参构造方法,所以无法创建父类对象。解决方案有两个,一就是在Employee中调用父类的有参构造方法,比如Super("zhangsan");二就是在父类中添加无参构造方法即可。


发表于 2021-04-21 16:45:52 回复(0)
当我们编译时就会出现编译时错误了,子类继承自父类,其构造总是需要调用父类的(无参)构造,而父类没有无参构造所以会报错,需要显示地调用父类的带参构造,放开下面的 “ //   super(name);" 编译通过~
发表于 2017-11-18 10:55:11 回复(0)
子类构造方法总是先调用父类的构造方法,如果子类的构造方法没有显式调用父类构造方法,则默认调用无参数的构造方法。
如果父类没有无参数的构造方法,则子类必须显式调用父类的构造方法。

编辑于 2016-08-24 02:13:56 回复(1)
  1. 父类拥有有参构造方法,故系统不会再自动生成构造方法
  2. 而子类没有显式地调用父类构造方法,故默认是调用父类的无参构造方法
  3. 而此时父类又没有无参构造方法,故编译报错
编辑于 2021-12-14 19:42:31 回复(0)
子类总是先调用父类的构造函数,如果子类没有调用,则默认调用父类的无参构造函数。如果父类没有无参构造函数,子类必须用super("")显示调用父类的构造函数,否则编译器报错。
编辑于 2019-11-20 19:16:21 回复(0)
        子类继承父类,所以会先调用父类的默认无参构造器,而父类构造器中给出了有参数的构造方法,所以默认的无参构造方法被覆盖掉了,应该在父类中显示给出无参构造方法,或在子类构造方法的第一行用super(id),显示调用父类的有参构造方法。
class Person {
    String name = "No name";
    public Person(String nm) {
        name = nm;
    }
    public Person() {
             }
    
}
class Employee extends Person {
    String empID = "0000";
    public Employee(String id) {
//        super(id);
        empID = id;
    }
    
}
public class Test {
    public static void main(String args[]) {
        Employee e = new Employee("123");
        System.out.println(e.empID);
    }
}

发表于 2019-07-16 19:53:52 回复(0)
1.子类构造方法先调用父类的构造方法,如果子类构造方法没有显示调用父类那个构造方法,就调用父类无参构造方法,如果父类不含无参构造方法,报错;
发表于 2018-09-10 09:38:01 回复(0)
父类没有无参构造器,而子类会默认调用父类无参构造器,没有的情况下要调用super(**),题目中没有,所以编译报错
发表于 2016-08-12 10:51:58 回复(0)
如果父类不存在无参的构造函数,子类构造函数里必须显示调用父类构造函数
发表于 2016-02-22 20:54:39 回复(0)