Java 构造函数重写是否可能?
我知道的是,编译器在字节码中编写了一个默认的无参数构造函数。但如果我们自己编写,则会自动调用该构造函数。这是一个构造函数重写的现象吗?您可以有许多构造函数,只要它们接受不同的参数。但将默认构造函数放入的编译器不称为“构造函数重写”。您的示例不是重写。从技术上讲,重写发生在子类中,但在本例中,构造函数方法在原始类中被替换。无法重写构造函数。构造函数可以看作是静态的,子类不能重写它的超级构造函数Java 构造函数重写是否可能?,java,constructor,overriding,Java,Constructor,Overriding,我知道的是,编译器在字节码中编写了一个默认的无参数构造函数。但如果我们自己编写,则会自动调用该构造函数。这是一个构造函数重写的现象吗?您可以有许多构造函数,只要它们接受不同的参数。但将默认构造函数放入的编译器不称为“构造函数重写”。您的示例不是重写。从技术上讲,重写发生在子类中,但在本例中,构造函数方法在原始类中被替换。无法重写构造函数。构造函数可以看作是静态的,子类不能重写它的超级构造函数 当然,您可以在超类构造函数中调用受保护的方法,然后在子类中覆盖它以更改超类构造函数。然而,许多人建议不要
当然,您可以在超类构造函数中调用受保护的方法,然后在子类中覆盖它以更改超类构造函数。然而,许多人建议不要使用这个技巧,以保护超类构造函数的行为。例如,FindBugs将警告您构造函数调用非final方法。构造函数不是普通方法,不能“重写”。说构造函数可以被重写意味着超类构造函数是可见的,可以被调用来创建子类的实例。这不是真的。。。默认情况下,子类没有任何构造函数(除非它扩展的类有一个无参数构造函数)。它必须显式声明任何其他构造函数,这些构造函数属于它而不是它的超类,即使它们采用与超类构造函数相同的参数
您提到的关于默认无参数构造函数的内容只是构造函数工作方式的一个方面,与重写无关。您所描述的不是重写。如果未指定默认构造函数,则 编译器将创建一个默认构造函数。如果它是一个子类,它将调用 默认的父构造函数(),它还将所有实例变量初始化为 由类型的默认值确定的默认值(0表示数字类型,false表示布尔值,或null) 用于对象) 当子类具有相同的名称、参数数量/类型和 返回类型与超类的实例方法相同。在本例中,子类 将重写超类的方法 但如果我们自己写的话 构造函数是自动调用的 那是不对的。如果调用no-args构造函数,则会调用它,而不管是否是您自己编写的。如果不在派生类中编写显式超级(…)调用,也会自动调用它 所有这些都不构成构造函数重写。Java中没有这样的东西。
存在构造函数重载,即提供不同的参数集。这是不可能的。构造函数重写在Java中永远不可能 因为,
构造函数看起来像一个方法,但是 名称应为类名,而不是 返回值 覆盖意味着我们已经声明了什么 在超级课堂上,这正是我们所拥有的 若要在子类中声明,则称为 最重要的超类名和子类名 类名是不同的 如果你想写超级类 子类中的构造函数,然后是子类 类会将其视为方法,而不是 构造函数,因为名称应该 与子类名称不匹配。而且 将给出一个编译错误 方法没有返回值。所以 我们应该宣布为无效,然后 它将编译
请查看以下代码:
Class One
{
....
One() { // Super Class constructor
....
}
One(int a) { // Super Class Constructor Overloading
....
}
}
Class Two extends One
{
One() { // this is a method not constructor
..... // because name should not match with Class name
}
Two() { // sub class constructor
....
}
Two(int b) { // sub class constructor overloading
....
}
}
还应该注意的是,不能用超类名称的构造函数重写子类中的构造函数。OOPS规则告诉构造函数应该使用名称作为其类名。如果我们试图重写超类构造函数,它将被视为一个没有返回类型的未知方法。构造函数看起来像一个方法,但名称应该是类名,而没有返回值 重写意味着我们在超类中声明的内容,我们必须在子类中声明的内容称为重写。超级类名和子类名是不同的
若您试图在子类中编写超类构造函数,那个么子类会将其视为方法而不是构造函数,因为名称不应与子类名称匹配。它将给出一个编译错误,即方法没有返回值。因此,我们应该声明为void,然后只编译它。java中的方法重写用于提高以前编写的最新代码的性能 一些类似的代码显示,这里我们正在创建基类的引用,并创建派生类的物理实例。 在构造函数中,重载是可能的
InputStream fis=new FileInputStream("a.txt");
int size=fis.available();
size将返回.txt中可能的总字节数
因此因为构造函数不能在Java中继承,方法重写需要继承。因此,它不适用。由于以下原因,构造函数重写是不可能的
构造函数名称必须与类名相同。在继承实践中,您需要创建两个具有不同名称的类,因此两个构造函数必须具有不同的名称。因此,构造函数重写是不可能的,这种想法甚至没有意义。不,重写构造函数是不可能的。如果我们尝试这样做,那么编译器错误就会出现。这在Java中是不可能的。让我们看看这个例子。它将要求您为该方法编写一个返回类型。意味着它将把被重写的构造函数视为方法,而不是构造函数。
package com.sample.test;
class Animal{
public static void showMessage()
{
System.out.println("we are in Animal class");
}
}
class Dog extends Animal{
public void DogShow()
{
System.out.println("we are in Dog show class");
}
public static void showMessage()
{
System.out.println("we are in overriddn method of dog class");
}
}
public class AnimalTest {
public static void main(String [] args)
{
Animal animal = new Animal();
animal.showMessage();
Dog dog = new Dog();
dog.DogShow();
Animal animal2 = new Dog();
animal2.showMessage();
}
}
我发现这是这个问题的一个很好的例子:
class Publication {
private String title;
public Publication(String title) {
this.title = title;
}
public String getDetails() {
return "title=\"" + title + "\"";
}
}
class Newspaper extends Publication {
private String source;
public Newspaper(String title, String source) {
super(title);
this.source = source;
}
@Override
public String getDetails() {
return super.getDetails() + ", source=\"" + source + "\"";
}
}
class Article extends Publication {
private String author;
public Article(String title, String author) {
super(title);
this.author = author;
}
@Override
public String getDetails() {
return super.getDetails() + ", author=\"" + author + "\"";
}
}
class Announcement extends Publication {
private int daysToExpire;
public Announcement(String title, int daysToExpire) {
super(title);
this.daysToExpire = daysToExpire;
}
@Override
public String getDetails() {
return super.getDetails() + ", daysToExpire=" + daysToExpire;
}
}
虽然其他人指出不可能在语法上覆盖构造函数,但我也要指出,这样做在概念上是不好的。假设超类是一个dog对象,子类是一个Husky对象。狗对象具有“4条腿”、“尖鼻子”等属性,如果“超过”