子类为什么不能调用父类构造方法?

kret 2017-01-07 01:36:10
网上版本很多 有的说能调用,有的说不能调用,请求专业回答谢谢!
...全文
1873 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
liu15073458538 2017-02-10
  • 打赏
  • 举报
回复
引用
由于子类的构造器不能访问超类的私有域,所以必须利用超类的构造器对这部分私有域进行初始化,我们可以通过super实现对超类构造器的调用。使用super调用构造器的语句必须是子类构造器的第一条语句。 ----摘自<Java核心技术>
ryuugu_rena 2017-02-09
  • 打赏
  • 举报
回复
加载子类肯定要加载其父类,当然要加载父类的构造方法了。
JasonWang6 2017-02-09
  • 打赏
  • 举报
回复
你用我的代码跑一下就知道了,希望对你有用,好好加油! public class Test { //测试类 public static void main(String[] args) { Son son=new Son(); //子类的构造方法会默认继承父类的构造方法 } } class Father { //父类 public Father() { System.out.println("我就是父类方法!"); } } class Son extends Father { //子类继承父类 public Son() { //super();其实系统会在子类构造方法默认调用父类的构造方法 System.out.println("我是子类方法!"); } public void diaoYongFuMehtod(){ super(); //报错,这里不能调用父类构造方法,父类构造方法只能被子类构造方法调用,不能被子类的普通方法调用 /** * 解释原因: * 假设这个父类构造方法是可以在子类普通方法中被调用的,也就是new Son().diaoYongFuMehtod();这里的意思就是先加载Son类创建好 * Son类对象然后调用diaoYongFuMehtod方法,然后diaoYongFuMehtod方法里的super()是加载Father类,总体类加载顺序就是 * Son类-->Father类.而其实虚拟机真正的加载方式是先加载Father类,再加载子类的.(用现实生活举例:没有父亲这个人出现哪会有儿子呢, * 其实java语言很多都是符合伦理道德的) * */ } }
JasonWang6 2017-02-09
  • 打赏
  • 举报
回复
public class Test { //测试类 public static void main(String[] args) { Son son=new Son(); //子类的构造方法会默认继承父类的构造方法 } } class Father { //父类 public Father() { System.out.println("我就是父类方法!"); } } class Son extends Father { //子类继承父类 public Son() { //super();其实系统会在子类构造方法默认调用父类的构造方法 System.out.println("我是子类方法!"); } public void diaoYongFuMehtod(){ super(); //报错,这里不能调用父类构造方法,父类构造方法只能被子类构造方法调用,不能被子类的普通方法调用 /** * 解释原因: * 假设这个父类构造方法是可以在子类普通方法中被调用的,也就是new Son().diaoYongFuMehtod();这里的意思就是先加载Son类创建好 * Son类对象然后调用diaoYongFuMehtod方法,然后diaoYongFuMehtod方法里的super()是加载Father类,总体类加载顺序就是 * Son类-->Father类.而其实虚拟机真正的加载方式是先加载Father类,再加载子类的.(用现实生活举例:没有父亲这个人出现哪会有儿子呢, * 其实java语言很多都是符合伦理道德的) * */ } }
sks8058 2017-01-18
  • 打赏
  • 举报
回复
子类的构造函数里使用super关键字,可以调用父类构造函数,不过貌似只能写在最前面,否则报错
生如夏花bld 2017-01-17
  • 打赏
  • 举报
回复
基类的构造器一定会在子类的构造成过程中调用的,而且是按照继承层次逐渐向上连接,使得每个基类的构造器都能调用。 为什么呢? 这是因为子类不能访问private对象,如果不调用基类的构造方法的话,就没有创建基类,那么基类中的private对象就没有创建,这显然是是不行的。只有基类的构造器才能够完整创造对象
haxianhe 2017-01-17
  • 打赏
  • 举报
回复
学习了!!!!
逗比123号 2017-01-13
  • 打赏
  • 举报
回复
可以调用啊,你可以在子类构造方法中加super(xxxx),里面传参数,就可以调用父类的有参构造,不传就调用无参构造函数。没有super()就默认调用父类无参构造函数
rotated 2017-01-13
  • 打赏
  • 举报
回复
引用 7 楼 dacongzhuangdiqiu 的回复:
如果父类中构造被重写,这个不叫不调用,叫做调用后——被重写,体现为子类的构造。 如果没有被重写,就会直接调用父类的构造方法,默认super的
构造不能重写。
MoshangYanYu 2017-01-13
  • 打赏
  • 举报
回复
就问楼主一句话,Super关键字是干嘛用的
西北灰狼 2017-01-13
  • 打赏
  • 举报
回复
子类还能写自己的方法
insping 2017-01-13
  • 打赏
  • 举报
回复
引用 12 楼 Our_existence 的回复:
你将以下代码运行看一下,可以发现在子类中会隐式的调用父类的无参构造器 class A{ public A(){ System.out.println("A构造") } public A(String string){ System.out.println("A显式构造"+string) } } class B extends A{ public B(){ //super();//这里会有一个隐式的调用 //super("xianshi");//这里可以有一个显式调用 System.out.println("B构造") } } class Ma{ public static void main(String[] args){ B b =new B(); } }
补充12
Our_existence 2017-01-10
  • 打赏
  • 举报
回复
你将以下代码运行看一下,可以发现在子类中会隐式的调用父类的无参构造器 class A{ public A(){ System.out.println("A构造") } } class B extends A{ public B(){ //super();//这里会有一个隐式的调用 System.out.println("B构造") } } class Ma{ public static void main(String[] args){ B b =new B(); } }
soton_dolphin 2017-01-10
  • 打赏
  • 举报
回复
肯定可以啊,而却必须得调用啊
Karl.Luo 2017-01-10
  • 打赏
  • 举报
回复
可以的啊 子类构造方法中第一行默认有一条super( )语句 默认调用的是父类中无参的构造方法 如果父类中是有参的构造方法 那super( )括号里就应该要有对应的参数
pake_2016 2017-01-10
  • 打赏
  • 举报
回复
利用java的反射机制可以调用
bigbaldy 2017-01-09
  • 打赏
  • 举报
回复
当然能了,最近总是看到这么多问基础问题的,你们自己试一下不就行了
小灰狼 2017-01-09
  • 打赏
  • 举报
回复
不但能调用,而且必须调用,而且必须是子类构造器中的第一行语言 如果子类构造器没有显式调用,则编译器帮你调用 不信的话,做个测试: 定义一个父类,这个类有带参数的构造器 为这个父类定义一个子类,在子类构造器中不显式调用父类构造器 你看能不能编译通过 实现上:子类构造器必须调用父类构造器,并且是子类构造器中的第一条语言 而这个规则在C#里有更好的语法保证,C#里调用父类构造器的写法是: public SubClass() : base(argument list) { ...... }
龙翔翎 2017-01-08
  • 打赏
  • 举报
回复
如果父类中构造被重写,这个不叫不调用,叫做调用后——被重写,体现为子类的构造。 如果没有被重写,就会直接调用父类的构造方法,默认super的
l123w_ 2017-01-07
  • 打赏
  • 举报
回复
不是能不能的问题,是一定会调用。至于调用哪个构造方法,是根据子类构造方法的参数来决定的,通过super指定调用父类的哪个构造方法,如果没有指定,实例化对象的时候,会自动调用父类无参的构造方法。所以,在定义一个类时,如果没有特殊需求,尽量在类中定义要给无参的构造方法,避免继承时出现错误。
加载更多回复(5)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧