Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @override超级类的方法意味着什么?_Java - Fatal编程技术网

Java @override超级类的方法意味着什么?

Java @override超级类的方法意味着什么?,java,Java,假设我有一个名为mymethod() 这个方法覆盖了超类方法的方法 重写一个方法意味着什么 这是否意味着mymethod()忽略超类方法中的所有内容,还是意味着mymethod()也包括超类方法中的所有内容 重写方法时,我只能重写同名的方法,还是可以重写任何名称的方法 谢谢。如果继承类具有与父类同名的on override方法,则将调用该方法,而不是父类中的方法。这仅在名称相同的情况下有效,当然,如果方法的签名与您对方法的调用相匹配。重写意味着当您对对象调用方法时,将调用对象的方法而不是超类。@

假设我有一个名为
mymethod()

这个方法覆盖了超类方法的方法

重写一个方法意味着什么

这是否意味着
mymethod()
忽略超类方法中的所有内容,还是意味着
mymethod()
也包括超类方法中的所有内容

重写方法时,我只能重写同名的方法,还是可以重写任何名称的方法


谢谢。

如果继承类具有与父类同名的on override方法,则将调用该方法,而不是父类中的方法。这仅在名称相同的情况下有效,当然,如果方法的签名与您对方法的调用相匹配。

重写意味着当您对对象调用方法时,将调用对象的方法而不是超类。
@Override
注释用于确保覆盖超类的正确方法。如果对超类中不存在的方法进行注释,Java编译器将给您一个错误。通过这种方式,您可以确保覆盖了正确的方法。这在以下情况下特别有用:

public class MyClass {

    ...

    public boolean equals(MyClass myClass) {
       ...
    }
}
public class MyClass {

    ...

    @Override
    public void overriddenMethod() {
        super.overriddenMethod();

        /* whatever additional stuff you want to do */
    }
}
上面的代码中有一个逻辑错误。实际上,您还没有重写
对象
类的
equals
方法。如果添加
@覆盖
注释:

public class MyClass {

    ...

    @Override
    public boolean equals(MyClass myClass) {
       ...
    }
}
Java编译器现在会抱怨,因为父类中没有相应的方法。然后您就会知道正确的解决方案是:

public class MyClass {

    ...

    @Override
    public boolean equals(Object o) {
       ...
    }
}
要调用父类的方法,可以调用
super.overridedMethod()
,其中
overridedMethod
是已重写的方法的名称。因此,如果您想做一些父类已经做过的事情之外的事情,您可以这样做:

public class MyClass {

    ...

    public boolean equals(MyClass myClass) {
       ...
    }
}
public class MyClass {

    ...

    @Override
    public void overriddenMethod() {
        super.overriddenMethod();

        /* whatever additional stuff you want to do */
    }
}
例如:

public class Base {
    public void saySomething() {
        System.out.println("Hi, I'm a base class");
    }
}

public class Child extends Base {
    @Override
    public void saySomething() {
        System.out.println("Hi, I'm a child class");
    }
}
现在假设我们在某处有一个
main
函数

public static void main(String [] args) {
    Base obj = new Child();
    obj.saySomething();
}
当该函数运行时,它将调用
Child
版本的
saySomething
,因为您通过在
Child
中提供函数的新版本来覆盖父函数的版本

@Override
注释允许其他开发人员(以及您,当您忘记时)知道此方法覆盖基类/接口中的某些内容,并且如果您没有实际覆盖基类中的任何内容,它还允许编译器对您大喊大叫。例如,如果某个函数的参数数目错误,编译器将给您一个错误,说明您的
@Override
不正确

例如:

public class Child extends Base {
    @Override
    public void saySomething(int x) {
        System.out.println("I'm a child and x is: " + x);
    }
}
public class Child extends Base {
    @Override
    public void saySomething() {
        super.saySomething();
        System.out.println("I'm also a child");
    }
}
编译器会对您大喊大叫,因为此版本的
saySomething
包含一个参数,但父版本没有参数,因此您正在
@Override
-调用不在父版本中的内容


超级
子版本
不会调用
基本版本
,您必须自己使用
super.method()

例如:

public class Child extends Base {
    @Override
    public void saySomething(int x) {
        System.out.println("I'm a child and x is: " + x);
    }
}
public class Child extends Base {
    @Override
    public void saySomething() {
        super.saySomething();
        System.out.println("I'm also a child");
    }
}
如果您运行
main
并使用这个
Child
类,它将打印出
I是base
I也是Child

重写一个方法意味着什么

这意味着您将用自己的定义替换方法的超类定义

这是否意味着mymethod()会忽略超类方法中的所有内容? 或者这是否意味着mymethod()还包括超类方法中的所有内容

您可以选择是否在定义中包含超类定义。要包含它,您需要在
mymethod()
中调用
super.mymethod()

当重写方法时,我只能重写同名的方法,还是可以重写任何名称的方法

若要重写方法,必须在子类中提供具有相同签名(表示相同的名称、参数和返回类型)的方法


作为旁注,问题中的
@Override
注释实际上不会导致您的方法重写另一个方法。如果带注释的方法没有与超类(或1.6版的接口)的公共或受保护方法匹配的签名,则会导致编译时错误。

我曾经有一个学生来问我为什么他的代码不起作用。他花了好几天的时间想知道为什么他可以把一些东西放进一个收藏品里,但却找不到。他的代码是这样的:

public int hashcode()
而不是:

public int hashCode()
因此hashCode方法从未被调用


将@Overrides添加到一个方法可以清楚地表明您正在重写该方法,并确保您确实在重写一个方法。

当您重写一个超类的方法时,在对象上调用该方法将调用它的方法,而不是超类的方法

您可以使用
super.methodName()
调用该超类的方法(尽管已将其重写)。出现这种情况的一个常见原因是,被重写的方法将重新实现超类方法,并添加特定于扩展类的附加代码(
public void methodName(){super.methodName();/*more code*/}


@Override
注释允许您在编译时发出警告,如果该方法实际上没有重写任何内容。这是没有必要的,但是这些警告对您来说是一个打击,您可能在扩展类中得到了错误的签名,忘记了在超类中实现该方法,或者其他一些愚蠢的错误。

可能重复编辑的for标记-这与Android没有任何关系:P@krock我认为这个问题更多的是关于覆盖,而不是
@Override
注释。这可能还是个骗局。我想你是说
super.saySomething()。调用
super()将调用超级cla