如何在Java中继承类而不调用其构造函数

如何在Java中继承类而不调用其构造函数,java,oop,inheritance,constructor,Java,Oop,Inheritance,Constructor,我正在用Java编写一个程序,但继承方面有问题。我正在运行的代码具有以下结构: public class BaseClass { ObjectInputStream a; ObjectOutputStream b; public BaseClass(ObjectInputStream a, ObjectOutputStream b) { this.a = a; this.b = b; } //Some other code.... Thread subClass = new

我正在用Java编写一个程序,但继承方面有问题。我正在运行的代码具有以下结构:

public class BaseClass
{
ObjectInputStream a;
ObjectOutputStream b;

public BaseClass(ObjectInputStream a, ObjectOutputStream b)
{
    this.a = a;
    this.b = b;
}

//Some other code....

Thread subClass = new Thread(new SubClass());
subClass.start();

}
下面是子类:

public SubClass extends BaseClass implements Runnable
{
    //Code for SubClass...
}
然后,当我编译代码时,我收到的唯一错误是

./SubClass.java:6: error: constructor BaseClass in class BaseClass'
cannot be applied to given types;
public class SubClass extends BaseClass implements Runnable
       ^
  required: ObjectInputStream,ObjectOutputStream
  found: no arguments

我假设问题来自于这样一个事实,即我正在扩展一个具有构造函数的基类,因此在继承该类时会调用它,但我不能完全确定。我有没有办法用正确的参数调用构造函数?或者,更好的方法是根本不调用构造函数?非常感谢您的帮助,感谢您的回复。

基类没有默认构造函数,这意味着它必须接收一个ObjectInputStream和一个ObjectOutputStream。所以,子类必须有这样一个构造函数,或者一个调用super,传递参数的构造函数。我希望你:

回顾你的遗产 查看基类是否可以有默认构造函数 在子类中创建默认构造函数,将null传递给super->supernull,null 在传递所需的两个对象的子类中创建默认构造函数
没有办法不调用父构造函数。编译器会自动将调用super添加到您的子类中。

您的子类应该有一个接受的构造函数

ObjectInputStream a, ObjectOutputStream b
然后使用

super(a, b):
我相信会是这样的:

class Subclass extends BaseClass {
    SubClass(ObjectInputStream a, ObjectOutputStream b) {
        super(a, b);
    }
}
编辑-- 您不能“不调用”构造函数。即使基类没有默认构造函数参数,它也将从子类隐式调用。

您没有对super的调用-父类构造函数:

public SubClass extends BaseClass implements Runnable
{
    //must implement the following contractor:
    public SubClass(ObjectInputStream a, ObjectOutputStream b /*some other parameters*/){
        super(a,b);
    }

// the rest of the code.....
}

当您创建从另一个类继承的类时,其中一个含义是您将依赖于基类中的某些代码。这意味着您需要正确设置基类。由于您的基类只有一个接受参数的构造函数,因此您的类需要提供一个接受相同参数的构造函数,以便可以初始化其基类。因此,您需要添加一个额外的构造函数,该构造函数采用与基类相同的参数。

继承背后的基本思想是,超类的公共方法和变量将在子类中可用。这不仅仅是这句话,但现在这应该足够了。因此,在您的例子中,当您将基类扩展到子类时,子类中有两个变量ObjectInputStream和ObjectOutputStream

因此,在创建子类的对象时,必须为它们提供一些初始值。因此,您应该将以下构造函数添加到子类中

    public SubClass(ObjectInputStream a,ObjectOutputStream b){
         super(a,b); // The order in super should be same as the order of arguments in your BaseClass constructor! Make a not of this.
    }   

注意:super方法中参数的顺序很重要

即使它有这样一个构造函数,该构造函数也必须调用super并传递参数。是的,我知道,我在解释如果处理得当,你可以在子类no的构造函数中执行supernull,null。您需要从子类的所有构造函数调用supersomeObjectInputStream和someObjectOutputStream。我觉得你滥用了遗产。你们应该解释你们想要实现什么,什么是基类和子类。所以你们真正的问题是如何在java中调用基类构造函数?你有没有试着在谷歌上输入你的问题?或者学习一些Java基础教程?很抱歉这样说,但这是非常基本的Java,所以请尽量不要这样。请阅读docs for me网站,至少是关于这些基本的东西。是的,我在谷歌上搜索了好几次,最接近这些答案的是使用supera,b,它只会抛出更多错误。我已经学习了Java基础课程,也许让你惊讶的是,基本知识中没有涉及继承。是的,Oracle确实在他们的文档中广泛地介绍了它,但是他们关于继承的页面甚至没有提到超级关键字。虽然这是一个简单的问题,但不要以为我不知何故错过了《确保你先上网寻找答案》中的段落,而在你发布问题之前,答案会被扔给你。继承教程中有一节专门介绍super。通常,当谷歌搜索java教程时,第一个结果是关于如何在java.No中使用的教程。您需要使用有效参数调用超级构造函数。不管你是从一个使用相同参数的构造函数中得到的,这都是无关紧要的。构造函数不会初始化类。它初始化对象。最后,添加一个额外的构造函数不是您需要做的。所有构造函数都必须调用超级构造函数。