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

来源:互联网  责任编辑:小易  时间:2017/5/26 22:56:09
本网有用户碰到这样的问题:子类为什么不能调用父类构造方法?,具体问题如下:

本网根据需求用户需求,为用户寻得以下其他网友提供的解决方法,方法仅供参考,具体如下:

=================1楼=====================

肯定能啊。。。。

=================2楼=====================

可以super(参数)

=================3楼=====================

肯定可以啊,不过要在子类构造方法中调用。实际上子类构造方法都会调用父类的构造方法,只不过有的是隐式调用,有的是显式调用。

=================4楼=====================

new的时候先判断父类的构造方法,如果子类有重写,子类采用自己的构造方法

=================5楼=====================

子类可以调用父类,子类中只能实现与父类相同的部分。。。

=================6楼=====================

不是能不能的问题,是一定会调用。至于调用哪个构造方法,是根据子类构造方法的参数来决定的,通过super指定调用父类的哪个构造方法,如果没有指定,实例化对象的时候,会自动调用父类无参的构造方法。所以,在定义一个类时,如果没有特殊需求,尽量在类中定义要给无参的构造方法,避免继承时出现错误。

=================7楼=====================

如果父类中构造被重写,这个不叫不调用,叫做调用后——被重写,体现为子类的构造。
如果没有被重写,就会直接调用父类的构造方法,默认super的

=================8楼=====================

不但能调用,而且必须调用,而且必须是子类构造器中的第一行语言
如果子类构造器没有显式调用,则编译器帮你调用

不信的话,做个测试:
定义一个父类,这个类有带参数的构造器
为这个父类定义一个子类,在子类构造器中不显式调用父类构造器

你看能不能编译通过


实现上:子类构造器必须调用父类构造器,并且是子类构造器中的第一条语言
而这个规则在C#里有更好的语法保证,C#里调用父类构造器的写法是:
public SubClass() : base(argument list) {
......
}

=================9楼=====================

当然能了,最近总是看到这么多问基础问题的,你们自己试一下不就行了

=================10楼=====================

可以的啊  子类构造方法中第一行默认有一条super( )语句  默认调用的是父类中无参的构造方法  如果父类中是有参的构造方法  那super( )括号里就应该要有对应的参数

=================11楼=====================

肯定可以啊,而却必须得调用啊

=================12楼=====================

你将以下代码运行看一下,可以发现在子类中会隐式的调用父类的无参构造器

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();
}
}

=================13楼=====================

利用java的反射机制可以调用

=================14楼=====================

引用 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

=================15楼=====================

子类还能写自己的方法

=================16楼=====================

就问楼主一句话,Super关键字是干嘛用的

=================17楼=====================

引用 7 楼 dacongzhuangdiqiu 的回复:
如果父类中构造被重写,这个不叫不调用,叫做调用后——被重写,体现为子类的构造。
如果没有被重写,就会直接调用父类的构造方法,默认super的

构造不能重写。

=================18楼=====================

可以调用啊,你可以在子类构造方法中加super(xxxx),里面传参数,就可以调用父类的有参构造,不传就调用无参构造函数。没有super()就默认调用父类无参构造函数

=================19楼=====================

学习了!!!!

=================20楼=====================

基类的构造器一定会在子类的构造成过程中调用的,而且是按照继承层次逐渐向上连接,使得每个基类的构造器都能调用。
为什么呢?
这是因为子类不能访问private对象,如果不调用基类的构造方法的话,就没有创建基类,那么基类中的private对象就没有创建,这显然是是不行的。只有基类的构造器才能够完整创造对象

=================21楼=====================

子类的构造函数里使用super关键字,可以调用父类构造函数,不过貌似只能写在最前面,否则报错

=================22楼=====================

加载子类肯定要加载其父类,当然要加载父类的构造方法了。

=================23楼=====================


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语言很多都是符合伦理道德的)
 * */
}
}

=================24楼=====================

你用我的代码跑一下就知道了,希望对你有用,好好加油!

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语言很多都是符合伦理道德的)
 * */
}
}

=================25楼=====================

引用
由于子类的构造器不能访问超类的私有域,所以必须利用超类的构造器对这部分私有域进行初始化,我们可以通过super实现对超类构造器的调用。使用super调用构造器的语句必须是子类构造器的第一条语句。
                                                                                                                                                                              ----摘自<Java核心技术>

如果您还有更好的解决方法,请在最下面评论中留下您的解决方法


  • 本文相关:
  • 站长必读,如何真正写好一篇原创文章
  • 互联网之路细嗅蔷薇 资深站长分享掘金之道
  • 企业站的站长的工作重心究竟有哪些
  • 浅析:行业门户网站的一些盈利模式
  • 3000IP的企业网站每天订单不到30个的苦恼
  • 网站想内外兼修?先学习提高网站可用性的6大原则
  • 浅谈网页设计中的简约之美
  • 网页改版实战:日本设计师如何彻底优化旅游网站?
  • 网页改版实战!日本设计师如何彻底优化招聘网站?
  • 2015年值得关注的21个网页设计趋势
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2015 www.zgxue.com All Rights Reserved