Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.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 使用子类对象访问超类函数_Java_Inheritance - Fatal编程技术网

Java 使用子类对象访问超类函数

Java 使用子类对象访问超类函数,java,inheritance,Java,Inheritance,我有一个扩展其超类的子类的对象。子类中有一个重写的方法,可以使用对象调用该方法。 是否可以使用子类对象调用超类的函数 package supercall; public class Main { public static void main(String[] args) { SomeClass obj = new SubClass(); obj.go(); //is there anything like, obj.super.go()?

我有一个扩展其超类的子类的对象。子类中有一个重写的方法,可以使用对象调用该方法。 是否可以使用子类对象调用超类的函数

package supercall;

public class Main {

    public static void main(String[] args) {
        SomeClass obj = new SubClass();
        obj.go();   //is there anything like, obj.super.go()?
    }

}

class SomeClass {
    SomeClass() {

    }
    public void go() {
        System.out.println("Someclass go");
    }
}

class SubClass extends SomeClass {
    SubClass() {

    }
    @Override
    public void go() {
        System.out.println("Subclass go");
    }
}
考虑上面的代码

这里印着

子类go

。相反,我必须打印

超类go

.

而不是:

System.out.println("Subclass go");


(或者,你知道,只是不实现那个方法…。

有什么方法可以实现这一点吗?不,没有

在运行时,JVM将根据实例类型(这对您来说是多态性)选择要调用的方法,而不是根据其声明的类型


您的实例是一个子类实例,因此将调用子类中的go()方法。

一种方法是使子类调用超级类实现。但我想那不是你想要的

class SubClass extends SomeClass {    
SubClass() {}    
    @Override    
    public void go() {    
        super.go
    }
}

不,这是不可能的,如果你认为你需要它,重新考虑你的设计。重写方法的全部目的是替换其功能。如果另一个类对该类的内部工作有那么多了解,那么您就完全扼杀了封装 子类go . 相反,我必须打印 超类go

好的,那么不要重写go方法@subclass,它将调用超类实现

如果您想运行super实现,并拥有其他一些额外的代码@subclass,可以调用super.go();然后运行一些其他语句


这没关系,因为您正在重用已经编写的代码,所以不应该从超类复制粘贴代码并将其放入子类中,因为这是代码复制。但如果你的目标是彻底改变行为,那就不要叫“超级”

Yeah。但有时我也会使用subclass的方法。难道不能用其他方式调用超类的方法吗?类似于obj.super.go()的东西???当然,这是一个错误的构造。我的意思是类似的???@bdhar:是的,你可以直接调用
super
。但是你需要在课堂上打电话。这不能从外部完成。@silky。。你能提供一个你在上面的帖子中提到的例子吗?“你需要在课堂上打那个电话。这不能在外部完成”@Steve。。使用super关键字调用超类函数确实是正确的方法。我想知道的是,是否有其他方法可以调用超类go()方法,使用“obj”作为引用??但是super关键字的意义是什么,它是一个,同样的,这在语法上是不可能的,我找不到它背后的任何逻辑。super关键字的要点是,它允许您访问覆盖它的类中被覆盖的功能。这对像装饰师这样的人来说绝对有意义。这和这个问题完全不同,这个问题是关于一个不同的类通过一个子类对象访问超类功能。这完全没有意义,它基本上是第三个类说“我不在乎子类实现者想要什么,我想用不同的方式来做!”
class SubClass extends SomeClass {    
SubClass() {}    
    @Override    
    public void go() {    
        super.go
    }
}