子类继承父类的构造函数(方法)吗?

原创 2007年09月23日 22:17:00

        最近我看见有人问过这个问题。在此我想表达一下自己的观点。

        根据面向对象中关于继承这个概念——子类继承父类所有的属性和方法。那么既然是所有的那么本人认为也应当也包括构造函数(方法)。 

        我先举一个C++的例子:

 

class Parent
...{
private:

    
int p;

public:

    Parent(
void) : p(0)
    
...{

    }


    Parent(
int i) : p(i)
    
...{

    }

}
;


class Child : public Parent
...{
private:

    
int c;

public:

    Child(
void) : Parent(), c(0)
    
...{
        
// 在这里,创建Child对象时先构造父类域
    }


    Child(
int i) : Parent(i + 1), c(i)
    
...{
        
// 同上
    }

}
;

 

        如何证明Child类继承了Parent类的两个构造函数呢?

        由于构造函数非常特别,对它的调用就像是调用一个C函数一样,而不是利用对象来调用的(若不先构造对象哪儿来的对象?)。因此鉴于这份特殊性我们可以这么考虑:

        将上述代码中class Child : public Parent——去掉“: public Parent”,我们可以编译试试,是否能成功。事实上正是因为Parent与Child有亲子关系,所以Child构造函数中可以调用Parent的构造函数先对其Parent域进行初始化。这个特点非常符合工程学——详见我的文章《我比起Java更喜欢C++的理由——语义》。

        下面将贴出相应的Java代码:

class Parent ...{

    
private int p;

    
public Parent() ...{

        p 
= 0;
    }


    
public Parent(int i) ...{
    
        p 
= i;
    }

}



class Child extends Parent ...{

    
private int c;

    
public Child() ...{

        
super();
        c 
= 0;
    }


    
public Child(int i) ...{

        
super(i + 1);
        c 
= i;
    }

}


 

        我们可以看到,在Java中可以利用super关键字来访问本类父类的构造方法。这样在一定程度上也消除了歧异性——比如你也可以在Child类中的某一个方法中这么写:Parent p = new Parent();而利用super()就表示了子类在初始化本类域前先初始化其父类域。这也可以证明在Java中子类继承父类构造方法,并且子类可以通过 super来访问父类的构造方法,只要父类的构造方法不是private。

关于子类对象的构造函数和父类构造函数的执行顺序

我们分别为父类和子类添加显式的构造函数,代码如下 01 class Person 02     { 03         private ...
  • u013095889
  • u013095889
  • 2016年10月13日 10:36
  • 2066

java中子类继承父类时是否继承构造函数呢?

java继承中对构造函数是不继承的。以下是例子: public class FatherClass { public FatherClass() {       System.out.println(...
  • ningbowxj3
  • ningbowxj3
  • 2006年11月28日 21:12
  • 20921

子类继承父类,构造函数的特点 super()

在对子类进行初始化时候,父类的构造函数一定会运行 因为子类的构造函数第一行里面有个隐式语句super();子类的所有构造函数默认第一行都有句super(); 子类调用父类构造函数super(参数),子...
  • da_shi_xiong
  • da_shi_xiong
  • 2016年04月11日 20:29
  • 833

关于子类对象的构造函数和父类构造函数的执行顺序

我们分别为父类和子类添加显式的构造函数,代码如下 01 class Person 02     { 03         private ...
  • u013095889
  • u013095889
  • 2016年10月13日 10:36
  • 2066

java中子类会继承父类的构造方法吗?

java中子类能继承父类的构造方法吗?带着这个疑问我们首先来看个例子: 子类不会继承父类的构造方法,但是子类在实例化对象时:如果子类的构造器没有显示的调用父类的方法,则将自动调用父类默认的构造...
  • wangyl_gain
  • wangyl_gain
  • 2015年10月23日 21:26
  • 3496

子类继承父类,父类中的构造器

子类继承父类时,父类中必需有无参构造器,子类才可以继承父类? 可是父类中只有有参构造器时,就不能实现子类继承父类了吗?...
  • u014800380
  • u014800380
  • 2016年11月03日 12:06
  • 649

python中子类调用父类构造方法

python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法。如果一个方法在子类的实例中被调用,或者一个属性在子类的实例中被访问,但是该方法或属性在子类中并不存在...
  • tianlihua306
  • tianlihua306
  • 2014年06月02日 02:03
  • 1960

c#继承中的构造方法那些事……

对于继承,我想你们都很了解,但对于继承中的构造方法中的一些细节,我想你们中的某些人还未必了解……在此就扯蛋一下吧…… 1)子类诞生记: 当子类对象在堆内存中被创建时,会在子类对象内部同时创...
  • lovejava001
  • lovejava001
  • 2013年12月16日 12:38
  • 797

Java继承,子类默认在构造函数中用super()调用父类构造函数

1.子类继承父类的方法属性,并重写父类的方法,子类修饰符不能比父类方法的修饰符的范围狭窄。 Protect 与 默认 区别: protected :成员 本类和子类可以访问。【其他类不可以使用(即使...
  • yingtian648
  • yingtian648
  • 2016年06月02日 08:54
  • 3668

C++ 子类继承带参的父类构造函数应该怎么写

参考:http://tieba.baidu.com/p/1167962877 一,父类没有写出构造函数, 子类的构造函数可以写成“任何”形式而不用顾及父类的构造函数。 例如:父类为CA,子类为C...
  • qq_26728227
  • qq_26728227
  • 2016年05月06日 16:54
  • 1899
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:子类继承父类的构造函数(方法)吗?
举报原因:
原因补充:

(最多只允许输入30个字)