如果子类的构造方法中既没有显示调用基类构造方法,而基类中又没有无参数的构造方法,则编译出错。

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 String getName(){
    return name;
}
public int getAge(){
    return age;
}

}

class Student extends Person {
private String school;

public String getSchool() {
    return school;
}
public void setSchool(String school) {
    this.school =school;
} 

}

public class Test {
public static void main(String args[]){
Student student = new Student();
student.setName("John");
student.setAge(18);
student.setSchool("SCH");
System.out.println(student.getName());
System.out.println(student.getAge());
System.out.println(student.getSchool());
}
}
这段代码有问题吗?
根据”如果子类的构造方法中既没有显示调用基类构造方法,而基类中又没有无参数的构造方法,则编译出错。”这句话,此段代码中,子类Student没有显示调用父类构造方法,而父类Person中又没有无参数的构造方法,编译应该出错啊???

因为你的派生类没有写构造函数,这种情况是允许的。

Java是这样的,如果你根本没有定义无参数构造函数,那么编译器会产生一个空的构造函数。
换言之:
class A
{
}
等价
class A
{
public A() { } //编译器自动加上
}
但是
class A
{
public A(int i) { }
}
就没有那个默认的构造函数了。

如果你定义了有参数构造函数,那么编译器不会产生无参数构造函数。
如果你的基类没有无参数构造函数,派生类必须显式调用基类的构造函数。

没有写构造函数,不是有个默认的无参构造函数吗?

你的类中,没有构造函数,java编译器为你自动生成了一个无参数的构造函数。