黑马程序员技术交流社区
标题:
继承的问题
[打印本页]
作者:
Asan
时间:
2013-4-17 19:51
标题:
继承的问题
package cn.learn.test;
public class Test {
public static void main(String[] args) {
Student s = new Student();
}
}
class Person{
Person(){
System.out.println("调用父类的构造方法!");
}
}
class Student extends Person{
Student(){
System.out.println("调用子类的构造方法!");
}
}
复制代码
为什么我的main方法里之创建了学生类,但打印结果为甚打印了
调用父类的构造方法!
调用子类的构造方法!
作者:
杨冉
时间:
2013-4-17 20:39
因为子类实例化的时候一定会调用父类的无参构造方法的。其实在子类的代码里,隐藏了一个super();也就是父类的无参构造方法:
public class Test {
public static void main(String[] args) {
Student s = new Student();
}
}
class Person {
Person() {
System.out.println("调用父类的构造方法!");
}
}
class Student extends Person {
Student() {
super(); //这个是隐藏的,调用父类的构造方法
System.out.println("调用子类的构造方法!");
}
}
复制代码
作者:
艾萱
时间:
2013-4-17 20:49
在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行都有一条隐式的super(),super()会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super();。
作者:
PANZERLEADER
时间:
2013-4-17 21:01
public class Test {
public static void main(String[] args) {
Student s = new Student();
}
}
class Person {
Person() {
System.out.println("调用父类的构造方法!");
}
}
class Student extends Person {
Student() {
//子类会强制调用父类无参的构造方法,并且这个语句是隐藏的,即
//super();
System.out.println("调用子类的构造方法!");
}
}
复制代码
并且,如果父类中没有无参的构造方法,比如下面这种情况:
public class Test {
public static void main(String[] args) {
Student s = new Student();
}
}
class Person {
//这里因为只定义一个有参数的构造方法,把默认的无参构造方法清除了,导致编译报错。
Person(String name) {
System.out.println("调用父类的构造方法!");
}
}
class Student extends Person {
Student() {
//子类会强制调用父类无参的构造方法,并且这个语句是隐藏的,即
//super();
System.out.println("调用子类的构造方法!");
}
}
复制代码
这样的情况下,因为父类没有无参的构造方法,程序是无法编译的。
但是,如果把隐藏的构造方法改成有参数的,则程序可以编译通过,即:
public class Test {
public static void main(String[] args) {
Student s = new Student();
}
}
class Person {
Person(String name) {
System.out.println("调用父类的构造方法!");
}
}
class Student extends Person {
Student() {
//子类会强制调用父类无参的构造方法,并且这个语句是隐藏的,即
//super();
//这里,将子类的构造方法中隐藏的super()显式写成super(字符串),也就是父类的构造方法,程序可以通过编译
super("string");
System.out.println("调用子类的构造方法!");
}
}
复制代码
总结下:
1、子类构造方法默认调用父类的无参构造方法,隐含调用语句super()。
2、父类构造方法如果没有无参的构造方法,子类可以显式的调用父类有参数的构造方法,即super(父类构造方法的参数类型),也可以通过编译。
作者:
梁志兵
时间:
2013-4-17 21:05
package cn.learn.test;
public class Test {
public static void main(String[] args) {
Student s = new Student();
}
}
class Person{
Person(){
System.out.println("调用父类的构造方法!");
}
}
class Student extends Person{
Student(){
super(); //这里会有个默认的父类的构造函数,不写 super(); 也会有
System.out.println("调用子类的构造方法!");
}
}
作者:
刘兆华
时间:
2013-4-17 23:44
这就是类与类之间使用extends关键字产生的继承关系的特性。在子类的构造函数中如果你不写super(),运行时,虚拟机会在子类构造函数自动添加上去一个super()来调用父类构造函数。
作者:
16463535
时间:
2013-4-18 18:49
希望你看一下毕老师的视频,关于继承这部分的。
因为 子类的构造方法中,你没有写明 要调用父类哪一个构造方法的时候,会有一条 隐式的 super() ,代表调用父类的空参数构造方法。
当然了,你也可以写明调用父类的哪一个构造方法,用参数来区分。你传递什么样的参数,就会调用与之对应的构造方法。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2