为什么这个程序可以运行?
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
[解决办法]
继承关系,子类有调子类,子类没有就调父类。
[解决办法]
public class GrandFather { public GrandFather(){ System.out.println("GrandFather constructor block!"); } static{ System.out.println("GrandFather static block!"); }}public class Father extends GrandFather{ public Father(){ System.out.println("Father constructor block!"); } static{ System.out.println("Father static block!"); }}public class Son extends Father{ public Son(){ System.out.println("Son constructor block!"); } static{ System.out.println("Son static block!"); } public static void main(String[] args) { // TODO Auto-generated method stub Son s = new Son(); }}
[解决办法]
楼主还是多看点书吧。如果你不写构造函数,系统会默认加载一个无参的构造函数,而Student会调用如下构造函数:
public Student(){ super();}
[解决办法]
[解决办法]
不过不为类制定构造器,系统会为类提供一个默认的构造器及无参的构造器,这个可以通过class反编译看到。如果你提供了自己的构造器就不会在提供默认的。如果基类只有带参数的构造器,那么子类在构造器重必须显式的调用父类的构造器。
[解决办法]
你把父类Person加一个构造方法
就比如最简单的构造:
public Person(){
System.out.println("子类的构造的过程绝对是调用了基类的构造方法的!");
}
[解决办法]
public class A { private A() { }}public class B extends A { public B() { //这里什么也不写 默认调用父类 无参构造方法 什么也不写相当于写了 super() 如果父类无参构造 被私有了当然找不到报错 默认是公有的 }}
[解决办法]
当你不显示构造方法时,系统自动给你构造一个,只是看不见而已. public Person(){}
子类 Student 也有 默认构造函数, public Student(){} 自动先调用 public Person(){}