日期:2014-05-20  浏览次数:20697 次

为什么这个程序可以运行?
class Person {
  private String name;
  private int age;
  public void setName(String name) {
this.name = name;
  }
  public void setAge(int age) {
  this.age = age;
  }
  public int getAge() {
return age;
  }
  public String getName() {

return name;
  }
}

class Student extends Person {
  private String school;
  public String getSchool() {
return school;
  }
  public void setSchool(String school) {
this.school = school;

  }
}
public class TestPerson {
  public static void main(String[] args) {
Student student = new Student();
  student.setName("john");
student.setAge(18);
student.setSchool("SCN");
System.out.println(student.getName());
System.out.println(student.getAge());
System.out.println(student.getSchool());










  }


}


不是说子类的构造的过程中必须调用基类的构造方法,可是这个程序子类没有构造方法,基类同时也没有构造方法。




















------解决方案--------------------
你是怎么知道基类无构造函数呢??
------解决方案--------------------
"子类的构造的过程中必须调用基类的构造方法"这句话是胡扯,子类构造一定会先执行父类的static代码块,但是从来不是调用什么父类构造方法
所有Java对象在不写extends的情况默认都继承Object对象,而Object对象有public Object(){}的空构造方法,因此上面的类都有默认空的构造方法,“程序子类没有构造方法,基类同时也没有构造方法”这个认识也是错误的
任何Java类都有构造方法
------解决方案--------------------
没有明确指定构造器,系统默认构造器,类似public person(){}如果没有默认你怎么新建对象呢
你在person类加一个public person(String arg){this.name=arg};你就可以看到你想要出现的了,子类会报错
------解决方案--------------------
Java语言中,如果没有显式书写类的构造函数,那么类会自动添加一个默认构造函数。所以,楼主的父类和子类虽然没有明确给出构造函数,但是有默认的构造函数。
《Java编程思想》一书中,作者专门对此作了说明。该书是本好书,我正在啃,也推荐楼主看下。
希望能帮到楼主。:-D
------解决方案--------------------
继承关系,子类有调子类,子类没有就调父类。
------解决方案--------------------
探讨
"子类的构造的过程中必须调用基类的构造方法"这句话是胡扯。。。。。

------解决方案--------------------
子类如果没有写构造方法,会调用父类无参数的构造方法
------解决方案--------------------
没有明确指定构造器,系统默认构造器 如果明确给出就没有默认之说了
------解决方案--------------------
默认继承了无参构造啊!
要不你在Person里写个有写构参,你再Student类里面也写个有参构构,试试!
看能看出问题来不!
------解决方案--------------------
你这种理解是需要条件的,当子类没有覆盖的构造方法的时候会调用继承自父类的构造方法

你子类写个构造方法,父类写个同名构造方法,子类调用难道也自动调用父类构造方法?

你把这个条件给漏掉了,还不是胡扯?

探讨
引用:
"子类的构造的过程中必须调用基类的构造方法"这句话是胡扯。。。。。

这话不是胡扯。。
楼主给的两个类其实是省略了
public Person(){ };
public Student(){super();}
感觉是编译时自动加上的

------解决方案--------------------
探讨
class SuperClass {
private int n;

/*
SuperClass() {
System.out.println("SuperClass()");
}
*/


SuperClass(int n) {
System.out.println("SuperClass(" + n + ")");
thi……

------解决方案--------------------