我有一个有很多__init__参数的基类:
def BaseClass(object):
def __init__(self, a, b, c, d, e, f, ...):
self._a=a+b
self._b=b if b else a
...
Run Code Online (Sandbox Code Playgroud)
所有继承类都应该运行__init__基类的方法.
我可以__init__()在每个将调用超类的继承类中编写一个方法__init__,但这将是一个严重的代码重复:
def A(BaseClass):
def __init__(self, a, b, c, d, e, f, ...):
super(A, self).__init__(a, b, c, d, e, f, ...)
def B(BaseClass):
def __init__(self, a, b, c, d, e, f, ...):
super(A, self).__init__(a, b, c, d, e, f, ...)
def C(BaseClass):
def __init__(self, a, b, c, d, e, f, ...):
super(A, self).__init__(a, …Run Code Online (Sandbox Code Playgroud) 我想知道为什么javadoc不支持inheritedDoc是有正当理由的constructors.假设我有
class A
{
/**
* Constructor of A
*/
A(){}
/**
* Does something
*/
public void method(){}
}
class B extends A
{
/**
* {@inheritDoc}
*/
B(){ super();}
/**
* {@inheritDoc}
*/
public void method(){}
}
Run Code Online (Sandbox Code Playgroud)
对于该方法method,我可以继承javadoc,但为什么同样不能应用constructors?除非我使用inheritDoc标记,否则javadoc不会继承,这意味着我很清楚我想重用文档.什么应该阻止我这样做constructors?
我在Java中有以下示例类:
public class A { }
public class Super {
protected Super() { }
public Super(A a) { }
}
public class Sub extends Super { }
public class Consumer {
public Consumer() {
Sub sub = new Sub(new A()); //compiler error
}
}
Run Code Online (Sandbox Code Playgroud)
编译器错误表明参数不能应用于Sub中的默认构造函数,这是完全可以理解的.
我很好奇的是这个决定背后的理由.Java生成默认的空构造函数Sub; 为什么不能在这种情况下在幕后调用呢?这主要是理智的手持,还是有技术原因?
编辑
我知道的是这是一个语言的限制.我很好奇为什么它是一种语言限制.
编辑2
看起来,通常情况下,我太过接近我实际工作的代码,看看大局.我在下面的答案中发布了一个反例,说明了为什么这是BadThing®.
Java似乎与类构造函数和方法处理继承的方式不一致.
案例1 - 方法:
public class HelloWorld
{
public static void main(String[] args)
{
Bee b = new Bee();
b.foo();
}
}
class Insect {
public void foo() {
this.bar();
System.out.println("Insect foo");
}
public void bar() {
System.out.println("Insect bar");
}
}
class Bee extends Insect {
@Override
public void foo() {
super.foo();
System.out.println("Bee foo");
}
@Override
public void bar() {
System.out.println("Bee bar");
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码输出如下:
蜜蜂吧
昆虫foo
蜜蜂
请注意,在Insect的foo()方法中调用"this.bar()"实际上会返回并调用Bee的bar()方法(而不是调用Insect的bar()方法).
案例2 - 构造函数:
public class HelloWorld
{
public static void main(String[] …Run Code Online (Sandbox Code Playgroud) 我有一个Meeting类,我想创建一个扩展Meeting的BusinessMeeting类.
这是我的Meeting类:
public class Meeting {
private String name;
private String location;
private int start, stop;
public Meeting(String name, String location, int start, int stop) {
this.name = name;
this.location = location;
this.start = start;
this.stop = stop;
}
Run Code Online (Sandbox Code Playgroud)
这是我的BusinessMeeting类:
public class BusinessMeeting extends Meeting {
public BusinessMeeting() {
super();
}
}
Run Code Online (Sandbox Code Playgroud)
在我的BusinessMeeting类中,我收到错误:
构造函数类会议中的会议不能应用于给定类型; required:String,String,int,int found:无参数
我不确定为什么我收到该错误消息.BusinessMeeting类不应该继承Meeting类中的所有变量吗?
我一直在使用Eclipse Juno学习继承中的构造函数.
当我在childClass中按两次ctrl + O时,它显示继承的成员.但我碰巧在继承的成员中甚至看到超类的构造函数
但据说构造函数不是继承的......
有人可以解释一下这种行为吗?
每当在任何派生类中调用任何构造函数时,任务只能通过最终隐式或显式地调用基类构造函数来完成(如果我在这里错了,请纠正我).
因为我们打算创建派生类的实例,但是因为最后调用了基类构造函数.
那么,尽管调用了基类的构造函数,如何构造派生类的实例?
如果我有这个抽象类:
package com.abc;
public abstract class Player {
private String name;
public Player(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Run Code Online (Sandbox Code Playgroud)
当我从抽象类中扩展一个新类时,新类默认使用继承的构造函数,还是必须创建一个调用"super"的构造函数?