1在Java语言中正确! 2,3错误 父类 public class PClass { public PClass() { System.out.println("PClass instanced"); } } 子类: public class CClazz extends PClass { private String titleName; public CClazz() { System.out.println("CClazz instanced..."); }
public CClazz(String name) { this(); titleName = name; }
public void printTitle() { System.out.println(titleName); }
public static void main(String[] args) { CClazz cc = new CClazz(); cc.printTitle(); CClazz cc1 = new CClazz("test"); cc1.printTitle(); } } 测试结果: PClass instanced CClazz instanced... null PClass instanced CClazz instanced... test
子类不会获得父类的构造函数(即子类不能继承父类的构造器),但是子类构造器里可以调用父类构造器中的初始化代码,而且不管我们有没有使用super来调用(注意:这里是“调用”,不是"继承")父类的构造器,子类构造器都会调用构造器一次(隐式或显式调用) 显式调用父类构造器: class Parent{ private String name; private int age;
public Parent(String name, int age){ setName(name); setAge(age); } public void setName(String name){ this.name = name; } public String getName(){ return name; } public void setAge(int age){ this.age = age; } public int getAge(){ return age; } } class Child extends Parent{ private String school; public Child(String name, int age, String school){ //用super关键字显式调用父类构造器 super(name, age); this.school = school; } public void setSchool(String name){ this.school = school; } public String getSchool(){ return school; } } public class InheritDemo{ public static void main(String[] args){ Child ch = new Child("zhou", 21, "MIT"); System.out.println("name = " + ch.getName() + "\n" + "age = " + ch.getAge() + "\n" + "school = " + ch.getSchool()); } } 输出结果:name = zhou age = 21 school = MIT 下面是隐式调用父类的构造器: class SuperClass{ public SuperClass(){ //初始化内容 System.out.println("do something in superclass....."); } } class SubClass extends SuperClass{ public SubClass(){ System.out.println("do something in subclass...."); } } public class Inherit{ public static void main(String[] args){ SubClass sc = new SubClass(); } } 执行结果:do something in superclass... do something in subclass....从输出结果可以看出来,在子类构造器中并没有显式调用父类的构造器,但是父类构造器中的内容仍然被打印出来,说明系统会在执行子类构造器之前,隐式调用父类的构造器。而且父类的构造器总会在子类构造器之前执行. 所以相对来说,3是正确的,1、2是错误的。
2,3错误
父类
public class PClass { public PClass() {
System.out.println("PClass instanced");
}
}
子类:
public class CClazz extends PClass {
private String titleName;
public CClazz() {
System.out.println("CClazz instanced...");
}
public CClazz(String name) {
this();
titleName = name;
}
public void printTitle() {
System.out.println(titleName);
}
public static void main(String[] args)
{
CClazz cc = new CClazz();
cc.printTitle();
CClazz cc1 = new CClazz("test");
cc1.printTitle();
}
}
测试结果:
PClass instanced
CClazz instanced...
null
PClass instanced
CClazz instanced...
test
子类不能继承父类的构造方法。子类如果想继承父类的构造方法,必须在子类的构造方法中使用,并且必须使用关键字super来表示,并且super语句必须是构造方法中的第一句。
1是错误的,如果父类有带参数的构造函数,没有无参的构造,就不存在继承无参数的
2也是错误的,因为无参数的情况下,父类的构造函数被隐性地调用了,并不需要显示调super
“1.子类无条件地继承父类不含参数的构造函数。”构造函数不是被“继承”的,而是被层层调用的。
子类的构造函数必须调用父类的某个构造函数,这个调用一直延伸到 Object 类的无参构造函数。
“2.子类必须通过super关键字调用父类的构造函数。”子类必须调用父类的构造函数,但不一定非要写出 super(...);
用 super 来调用父类构造函数必须放在子类构造函数的第一句。
没有用 super 显式调用的时候,第一句有一个默认的隐藏的调用 super();
“3.子类无法继承父类的构造函数。”就“继承”的定义来说,这句话挑不出什么错误。
子类不会获得父类的构造函数(即子类不能继承父类的构造器),但是子类构造器里可以调用父类构造器中的初始化代码,而且不管我们有没有使用super来调用(注意:这里是“调用”,不是"继承")父类的构造器,子类构造器都会调用构造器一次(隐式或显式调用)
显式调用父类构造器:
class Parent{
private String name;
private int age;
public Parent(String name, int age){
setName(name);
setAge(age);
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
}
class Child extends Parent{
private String school;
public Child(String name, int age, String school){
//用super关键字显式调用父类构造器
super(name, age);
this.school = school;
}
public void setSchool(String name){
this.school = school;
}
public String getSchool(){
return school;
}
}
public class InheritDemo{
public static void main(String[] args){
Child ch = new Child("zhou", 21, "MIT");
System.out.println("name = " + ch.getName() + "\n" + "age = " + ch.getAge() + "\n" + "school = " + ch.getSchool());
}
}
输出结果:name = zhou
age = 21
school = MIT
下面是隐式调用父类的构造器:
class SuperClass{
public SuperClass(){
//初始化内容
System.out.println("do something in superclass.....");
}
}
class SubClass extends SuperClass{
public SubClass(){
System.out.println("do something in subclass....");
}
}
public class Inherit{
public static void main(String[] args){
SubClass sc = new SubClass();
}
}
执行结果:do something in superclass...
do something in subclass....从输出结果可以看出来,在子类构造器中并没有显式调用父类的构造器,但是父类构造器中的内容仍然被打印出来,说明系统会在执行子类构造器之前,隐式调用父类的构造器。而且父类的构造器总会在子类构造器之前执行.
所以相对来说,3是正确的,1、2是错误的。
1.子类无条件地继承父类不含参数的构造函数。
2.子类必须通过super关键字调用父类的构造函数。
3.子类无法继承父类的构造函数。