黑马程序员技术交流社区
标题:
创建g后,为什么调用的是构造方法Person()啊?
[打印本页]
作者:
刘林虎
时间:
2013-4-4 17:38
标题:
创建g后,为什么调用的是构造方法Person()啊?
本帖最后由 刘林虎 于 2013-4-4 23:44 编辑
输出结果:李四
张三
张三
创建对象p后,p调用的是构造方法Person00(String na),创建g后,为什么调用的是构造方法Person()啊?求各位帮帮忙啊,我很想知道原因啊
class Person{
protected String name;
public Person(String na){
name=na;
}
public Person(){
name="张三";
}
public void show(){
System.out.println(name);
}
}
public class GouZao extends Person{
public void show(){
super.show();
System.out.println(name);
}
public static void main(String args[]){
Person p=new Person("李四");
p.show();
GouZao g=new GouZao();
g.show();
}
}
复制代码
作者:
潘佳强
时间:
2013-4-4 18:04
这里不是调用的Person的构造方法。
而是super.show();时调用父类的show(),而此时GouZao类中没有定义name字段,所以引用的也为Person中的name字段
打印的结果就为:张三
作者:
luguoyuanf
时间:
2013-4-4 18:23
这里牵扯到子类实例化的过程了.
extends继承父类后就包含了父类所有的方法.
在new创建子类构造函数时会先对父类的空参构造函数进行创建,也就是将张三赋值给name,之后再调用show方法打印出张三.
建议楼主掌握下子类实例化过程就一目了然了.
1)如果有静态代码块,则先执行代码块,如果没有则执行静态
2)如果有构造代码块,则先执行构造代码块,如果没有再执行构造函数
3)new创建对象时会自动对空参的构造函数执行,上面张三的值就是在new子类构造函数时创建了父类的构造函数.
作者:
杨成
时间:
2013-4-4 18:25
在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式的语句super();
super():会访问父类中空参数的构造函数,并且子类中所有的构造函数默认第一行都是super();
为什么子类一定要访问父类中的构造函数?
因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。子类在对象初始化时,要先访问一下父类中的构造函数,如果要访问父类中的指定构造函数,可以通过手动定义super语句的方式来指定。
注意:super语句一定要定义在子类构造函数的第一行。
结论:子类的所有的构造函数默认都会访问父类中空参数的构造函数,因为子类每一个构造函数内的第一行都有一句隐式super();
当父类中没有空参数的构造函数时,子类必须通过手动super()语句的形式来指定要访问父类中的构造函数。当然子类的构造函数第一行也可以手动指定this语句类访问本类中的构造函数,子类中至少会有一个构造函数会访问父类中的构造函数。
作者:
HM何伟
时间:
2013-4-4 19:28
第一"张三"是调用了父类中的show()方法而打印出来的.
第二"张三"是因为子类继承了父类,因此子类中也有一份父类初始化后的name值.所以第二"name"是继承过来的
作者:
张钶
时间:
2013-4-4 20:11
本帖最后由 张钶 于 2013-4-4 20:12 编辑
class Person{
protected String name;
public Person(String na){
name=na;
}
public Person(){
name="张三";
}
public void show(){
System.out.println(name);// 4.打印 张三
}
public class GouZao extends Person{
public void show(){
super.show();// 3,去父类中找show方法
System.out.println(name);// 5.将父类的字段name继承到子类,打印张三
public static void main(String args[]){
Person p=new Person("李四");
p.show();// 1,打印李四
GouZao g=new GouZao();
g.show();// 2.到自己的类中找show方法
}
复制代码
作者:
黄玉昆
时间:
2013-4-4 23:24
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
作者:
⋛⋌⋚JEEP
时间:
2014-7-15 23:47
又巩固一下基础:)
作者:
a191170796
时间:
2014-7-16 11:24
学习ING........
作者:
nxp1986
时间:
2014-7-17 23:07
学习了,楼主
作者:
刘斌2014
时间:
2014-7-30 08:47
我来学习一下
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2