黑马程序员技术交流社区

标题: 子类究竟能不能继承构造方法?能不能重写(覆盖)?为什么 [打印本页]

作者: 刘渝灵    时间: 2013-4-19 09:03
标题: 子类究竟能不能继承构造方法?能不能重写(覆盖)?为什么
本帖最后由 刘渝灵 于 2013-4-22 10:41 编辑

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



作者: 李天申    时间: 2013-4-19 09:42
子类不能继承父类的构造方法,更不能覆盖父类的构造方法。因此,子类如果想使用父类的构造方法,必须在子类的构造方法中使用,而且必须使用关键字super来表示,而且super必须是子类构造方法中的头一条语句。
作者: 645420297    时间: 2013-4-19 09:43
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()的方式调用父类的构造。
作者: yufeng47    时间: 2013-4-19 09:50
子类不会继承父类的构造方法,也不能被复写,但是子类在实例化对象时:如果子类的构造器没有显示的调用超类的方法,则将自动调用父类默认构造器。如果父类没有不带参数的构造器,且子类的构造器中又没显示的调用超类其他构造器,则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. }
复制代码
这样一写你就知道能不能继承了。编译都不能通过
作者: Miss小强    时间: 2013-4-19 10:30
首先你得清楚一个概念,所谓继承是:对于类与类而言的,而覆盖是对方法而言的
我们知道子类覆盖父类的方法需要两者的方法完全一致(权限修饰符除外),而且子类方法的权限要高于父类方法的权限;
因此我们知道,子类和父类的类名不通,构造方法就不存在着所谓的覆盖复写,我们只能在子类中调用父类的构造方法来初始化,也必须调用父类的构造函数进行初始化;
希望能够帮到你。。。。
作者: Just_Only    时间: 2013-4-19 10:35
子类既不能继承父类的构造方法也不能复写父类的构造方法,首先是因为构造方法要求的是没有任何的返回类型并且连void也没有,第二,构造方法要求是和类名同名,所以不能继承,既然不能继承那就更不用谈复写的了。
作者: 刘渝灵    时间: 2013-4-19 11:10
可能我发表问题时没有描述清楚,我要表达的是:在子类中为什么只能用super关键字调用父类的构造方法。比如
class Fu{
    Fu(){}
}
class Zi extends Fu{
    Zi(){
           //Fu();  构造方法与一般方法究竟有何区别,导致它不能象普通方法一样被继承?
           super();//不写的话会隐式调用,而且它只能在第一句,地球人都知道的。
         }
}
当然,构造方法如果都没有被继承,自然谈不上覆写,道理不言自明。
作者: 〃Mr.Zぐ    时间: 2013-4-19 12:42
父类的构造方法不用继承,我们可以用super来调用,如父类的构造方法为:public A(){};那么子类调用为super();如果为public A(int a);那么子类调用为super(1);

父类一般要有一个无参数的构造方法是因为我们的子类如果没有显性的调用父类的构造函数的话就会默认加入super();即调用父类的无参数构造函数,当父类没有无参数构造函数就会报错哦,这就是要加入一个无参数构造函数的原因。
作者: 刘兆华    时间: 2013-4-19 13:03
子类不能说继承 。  子类默认构造函数中就有个隐示的super()    子类的构造函数可以重载 。父类的构造函数是不能在子类覆盖的。
作者: rel4x    时间: 2014-9-29 20:14
学校了,。。。。。。。。。。

作者: 淡淡的雨    时间: 2014-10-8 11:01
不错,学习了
作者: 夕风秋凉    时间: 2015-10-27 01:50
虽然是很久的帖子了,我今天看到这,我的理解就是,构造方法肯定不能继承,因为构造方法面向的对象不一样,其次,子类实例化时,需调用父类的构造方法,默认是super();若父类没有空参数构造函数,自己在子类构造方法中去调用,看到这里,我就会突然想,为什么一定要调用父类构造方法呢,因为子类继承父类的数据,而数据可能会在构造函数函数中初始化,所以得调用一次。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2