Why constructors can not be inherited in java?

2020-01-24 20:04发布

I am a beginner in java programming language, recently I have studied that constructors can not be inherited in java, Can anyone please explain why?

I have already read this link of C++

11条回答
劫难
2楼-- · 2020-01-24 20:38

Only fields, methods, and nested classes are the membe of any class not Constructors. A subclass inherits all the members like (fields, methods, and nested classes) from its superclass. Constructors are not members, so they are not inherited by subclasses, but the constructor of the superclass can be invoked from the subclass.

查看更多
▲ chillily
3楼-- · 2020-01-24 20:40

In simple words, a constructor cannot be inherited, since in subclasses it has a different name (the name of the subclass).

class A {
   A();
}

class B extends A{
   B();
}

You can do only:

B b = new B();  // and not new A()

Methods, instead, are inherited with "the same name" and can be used.

As for the reason: It would not have much sense to inherit a constructor, since constructor of class A means creating an object of type A, and constructor of class B means creating an object of class B.

You can still use constructors from A inside B's implementation though:

class B extends A{
   B() { super(); }
}
查看更多
我欲成王,谁敢阻挡
4楼-- · 2020-01-24 20:45
  • A constructor may only be called with new. It cannot be called as a method.
  • The constructor name is identical to the class name.

So inheritance is practically not possible as such. However in a construct one might call other constructors.

  • In the same class using this(...);
  • Of the extended class using super(...);

Example

class A {
    A() { }          // Constructor
    A(int a) { }     // Constructor
    A(boolean c) { } // Constructor
}
class B extends A {
    B() {
        this(3, 7);
    }
    B(int a) {
        super();
    }
    B(String b) {
        super(7);
    }
    B(int a, int c) { // Calls super() implicitly
    }
}
A a = new B(8):

There unfortunately is no possibility to use A's constructor for a boolean:

B b = new B(true): // ERROR

The language designes could have implemented such a thing as:

Generate for every public constructor in the base class, a constructor with the same signature if such a constructor is not defined already. Call super with the same parameters. Call this() if there is a default constructor.

That seems a bit bloating the code. And is not simply a pointer in a virtual method table, by which method inheritance/overriding works.

查看更多
Juvenile、少年°
5楼-- · 2020-01-24 20:45

Constructors are not members of classes and only members are inherited. You cannot inherit a constructor. That is, you cannot create a instance of a subclass using a constructor of one of it's superclasses.

查看更多
Lonely孤独者°
6楼-- · 2020-01-24 20:48

Syntactic limitations can often be circumvented should there be any reason for a feature in a conceptual way. With this, I believe, the real reason for not supporting inheritance of constructor is not due to syntactic limitations but rather due to semantics.

Conceptually inheritance provides a mechanism to acquire (or inherit) a behavior and most likely without writing any piece of code since its purpose is to provide code-reuse. For a child class, it makes no case to inherit the behavior of initialization of its parent class. After all, an inherited behavior finds its best use when an external caller can use it without knowing who (in the parent chain) actually has implemented it. As you can see, a caller hardly has any business knowing how a parent class is initialized via its child class, there is no discernible reason for supporting inheritance for a (parent class’s) constructor.

查看更多
Fickle 薄情
7楼-- · 2020-01-24 20:50

Reason mentioned in docs of Inheritance

A subclass inherits all the members (fields, methods, and nested classes) from its superclass. Constructors are not members, so they are not inherited by subclasses, but the constructor of the superclass can be invoked from the subclass.

You can refer docs of Providing Constructors for Your Classes

查看更多
登录 后发表回答