class Human {
public Human() {
speak();
}
public void speak() {
System.out.println("I am a human being.\n");
}
public static void main(String [] args) {
Human h = new Human();
}
}public class Teacher extends Human{
public Teacher() {
speak();
}
public void speak() {
System.out.println("I am a teacher.\n");
}
public static void main(String [] args) {
Teacher t = new Teacher();
}
}运行Teacher的main函数,发现输出
I am a teacher.
I am a teacher.为什么所继承的Human类的speak不会被执行呢?请详细解释一下好吗?谢谢!
public Human() {
speak();
}
public void speak() {
System.out.println("I am a human being.\n");
}
public static void main(String [] args) {
Human h = new Human();
}
}public class Teacher extends Human{
public Teacher() {
speak();
}
public void speak() {
System.out.println("I am a teacher.\n");
}
public static void main(String [] args) {
Teacher t = new Teacher();
}
}运行Teacher的main函数,发现输出
I am a teacher.
I am a teacher.为什么所继承的Human类的speak不会被执行呢?请详细解释一下好吗?谢谢!
再有了方法的覆盖 就满足了多态的定义 java采用的是动态绑定 也就是在运用时才确定它所要调用的行为
class Human {
public Human() {
speak(); //3.调用父类构造器
}
public void speak() {
System.out.println("I am a human being.\n");
}
public static void main(String [] args) {
Human h = new Human();
}
} public class Teacher extends Human{
public Teacher() {
speak(); //2.再调用构造器。
}
public void speak() {
System.out.println("I am a teacher.\n"); //4.子类覆盖了父类的方法所以调用这里的speak()。
}
public static void main(String [] args) {
Teacher t = new Teacher(); //1.先运行这里。
}
}
class Human {
public Human() {
speak(); //3.调用父类构造器
}
public void speak() {
System.out.println("I am a human being.\n");
}
public static void main(String [] args) {
Human h = new Human();
}
} public class Teacher extends Human{
public Teacher() {
speak(); //2.再调用构造器。
}
public void speak(String str) {
System.out.println("I am a "+str+"\n."); //注意这里!
}
public static void main(String [] args) {
Teacher t = new Teacher(); //1.先运行这里。
}
}
这样写就可以调用父类的了
在构造函数也出现了多态的形为,因为你在构造函数里面调用了覆盖父类的方法
在子类的构造方法中,如果你没有显性的调用父类的构造方法,
那么JAVA里面会帮你自动调用父类的默认的(即无参的)构造方法。
这是你写的:
public Teacher() {
speak();
}
其实就相当于:
public Teacher() {
super(); //这里的super==this,这点需要注意!
speak();
}
这样当然就出现你所说的结果。
在Teacher的构造函数里加句super.speak(); 就先执行Human的speak()了