A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 刘渝灵 于 2013-4-22 10:41 编辑

1.子类能不能继承父类的构造方法?
2.如果能,能重写吗?如果不能,为什么?
{:soso_e147:}


评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

11 个回复

倒序浏览
子类不能继承父类的构造方法,更不能覆盖父类的构造方法。因此,子类如果想使用父类的构造方法,必须在子类的构造方法中使用,而且必须使用关键字super来表示,而且super必须是子类构造方法中的头一条语句。
回复 使用道具 举报 1 0
class A{
public A(){} // 1:无参数构造方法。
public A(String s){} // 2.
}
class B extends A{
public B(String s){    super(s); // 3.
}
}
说明:如果没有1处的无参数构造方法,那么3处一定要主动调用父类带参数的构造方法。如果有1处的构造方法,那么3处代码可以不要,因为Java会自动默认调用父类的无参数构造方法。记住一点:在构造子类时,一定会调用到父类的构造方法。所以父类要么有一个默认的无参数构造,这样Java会自动调用这个无参数的构造。如果父类没有无参数的构造,那么就要你自己在子类的构造中,通过super()的方式调用父类的构造。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
子类不会继承父类的构造方法,也不能被复写,但是子类在实例化对象时:如果子类的构造器没有显示的调用超类的方法,则将自动调用父类默认构造器。如果父类没有不带参数的构造器,且子类的构造器中又没显示的调用超类其他构造器,则Java编译器将报告错误。所以子类使用父类的构造方法是通过super关键字实现的。
  1. public class A {
  2.         A(){
  3.                 System.out.println("abc");
  4.         }
  5. }
复制代码
  1. public class B extends A {
  2.         B(){
  3.                 System.out.println("ddd");
  4.         }
  5.         A(){
  6.                 System.out.println("abc");
  7.         }
  8. }
复制代码
这样一写你就知道能不能继承了。编译都不能通过

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
首先你得清楚一个概念,所谓继承是:对于类与类而言的,而覆盖是对方法而言的
我们知道子类覆盖父类的方法需要两者的方法完全一致(权限修饰符除外),而且子类方法的权限要高于父类方法的权限;
因此我们知道,子类和父类的类名不通,构造方法就不存在着所谓的覆盖复写,我们只能在子类中调用父类的构造方法来初始化,也必须调用父类的构造函数进行初始化;
希望能够帮到你。。。。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
子类既不能继承父类的构造方法也不能复写父类的构造方法,首先是因为构造方法要求的是没有任何的返回类型并且连void也没有,第二,构造方法要求是和类名同名,所以不能继承,既然不能继承那就更不用谈复写的了。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
可能我发表问题时没有描述清楚,我要表达的是:在子类中为什么只能用super关键字调用父类的构造方法。比如
class Fu{
    Fu(){}
}
class Zi extends Fu{
    Zi(){
           //Fu();  构造方法与一般方法究竟有何区别,导致它不能象普通方法一样被继承?
           super();//不写的话会隐式调用,而且它只能在第一句,地球人都知道的。
         }
}
当然,构造方法如果都没有被继承,自然谈不上覆写,道理不言自明。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
父类的构造方法不用继承,我们可以用super来调用,如父类的构造方法为:public A(){};那么子类调用为super();如果为public A(int a);那么子类调用为super(1);

父类一般要有一个无参数的构造方法是因为我们的子类如果没有显性的调用父类的构造函数的话就会默认加入super();即调用父类的无参数构造函数,当父类没有无参数构造函数就会报错哦,这就是要加入一个无参数构造函数的原因。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
子类不能说继承 。  子类默认构造函数中就有个隐示的super()    子类的构造函数可以重载 。父类的构造函数是不能在子类覆盖的。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
rel4x 中级黑马 2014-9-29 20:14:26
10#
学校了,。。。。。。。。。。
回复 使用道具 举报
不错,学习了
回复 使用道具 举报
夕风秋凉 来自手机 中级黑马 2015-10-27 01:50:00
12#
虽然是很久的帖子了,我今天看到这,我的理解就是,构造方法肯定不能继承,因为构造方法面向的对象不一样,其次,子类实例化时,需调用父类的构造方法,默认是super();若父类没有空参数构造函数,自己在子类构造方法中去调用,看到这里,我就会突然想,为什么一定要调用父类构造方法呢,因为子类继承父类的数据,而数据可能会在构造函数函数中初始化,所以得调用一次。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马