簡體   English   中英

java中從子類對象調用父類方法

[英]calling parent class method from child class object in java

我有一個具有方法的父類,在子類中我覆蓋了該父類的方法。 在第三個類中,我創建了一個 child 對象,並通過使用該對象來調用父類的方法。 是否可以調用該父類方法? 如果是,那么如何?

如果在其子對象中覆蓋父方法,則子對象將始終使用覆蓋的版本。 但是; 您可以使用關鍵字super在子方法的主體內調用父方法

public class PolyTest{
    public static void main(String args[]){
        new Child().foo();
    }

}
class Parent{
    public void foo(){
        System.out.println("I'm the parent.");
    }
}

class Child extends Parent{
    @Override
    public void foo(){
        //super.foo();
        System.out.println("I'm the child.");
    }
}

這將打印:

我是孩子。

取消注釋注釋行,它將打印:

我是家長。

我是孩子。

你應該尋找多態的概念。

在子類的重寫方法中使用關鍵字super來使用父類方法。 但是,您只能在重寫的方法中使用關鍵字。 下面的例子會有所幫助。

public class Parent {
    public int add(int m, int n){
        return m+n;
    }
}


public class Child extends Parent{
    public int add(int m,int n,int o){
        return super.add(super.add(m, n),0);
    }

}


public class SimpleInheritanceTest {
    public static void main(String[] a){
        Child child = new Child();
        child.add(10, 11);
    }
}

Child 類中的add方法調用super.add來重用加法邏輯。

首先,這是一個糟糕的設計,如果您需要類似的東西,重構是個好主意,例如通過重命名方法。 Java 允許使用“super”關鍵字調用覆蓋方法,但在層次結構中只有一個級別,我不確定,也許 Scala 和其他一些 JVM 語言支持任何級別。

假設層次結構是C->B->A其中 A 是基類。

我認為解決這個問題不僅僅是重命名方法。 這會起作用,但這是一個修復嗎?

一種方法是將 B 和 C 共有的所有功能重構為 D,並讓 B 和 C 從 D 繼承: (B,C)->D->A現在 B 中隱藏 A 對 C 的實現的方法是特定的到 B 並留在那里。 這允許 C 調用 A 中的方法而無需任何技巧。

注意通過super調用父方法只對父類有效,如果你的父類是interface,並且想調用默認方法那么需要在super之前添加interfaceName,比如IfscName.super.method();

interface Vehicle {
    //Non abstract method
    public default void printVehicleTypeName() { //default keyword can be used only in interface.
        System.out.println("Vehicle");
    }
}


class FordFigo extends FordImpl implements Vehicle, Ford {
    @Override
    public void printVehicleTypeName() { 
        System.out.println("Figo");
        Vehicle.super.printVehicleTypeName();
    }
}

需要接口名稱是因為可以在此類擴展的多個接口名稱中使用相同的默認方法。 因此需要顯式調用方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM