簡體   English   中英

如何執行在類中聲明的函數公共方法,而該類又在私有方法中?

[英]How do I execute the function public method declared inside a class which is in turn inside a private method?

所以,我想執行以下代碼塊的 sum():

import java.lang.reflect.Method;

public class LocalOuterClass {  // start of outer
    private int x = 10;
    private Object run() {  //start of inner
        class LocalInnerClass {
            private int y = 20;
            public void sum() {
                System.out.println(x+y);
            }
        }   //end of inner
        LocalInnerClass lc = new LocalInnerClass();
        //lc.sum();
        return lc;
    }
    public static void main(String[] args) {
        LocalOuterClass Loc = new LocalOuterClass();
        Object obj = Loc.run();
        System.out.println(obj.getClass());
        Method[] methods = obj.getClass().getMethods();
        for (Method method : methods) {
            String MethodName = method.getName(); 
            System.out.println("Name of the method: "+ MethodName);
        }
    }
}   //end of outer

當我執行 lc.sum() 時,正確執行 sum()。 但是當我將內部類的對象返回給 main() 並嘗試執行 sum() 時,它會給出編譯器錯誤。 在對象上執行 getClass().getMethods() 確實將 sum() 作為方法之一打印。 我應該怎么做才能在 main() 中執行 sum()?

您必須將返回類型更改為LocalInnerClass並將LocalInnerClass移出方法:

public class LocalOuterClass {

    private int x = 10;

    private class LocalInnerClass {

        private int y = 20;

        public void sum() {
            System.out.println(x + y);
        }
    }

    private LocalInnerClass run() {
        LocalInnerClass lc = new LocalInnerClass();
        //lc.sum();
        return lc;
    }

    public static void main(String[] args) {
        LocalOuterClass Loc = new LocalOuterClass();
        LocalInnerClass obj = Loc.run();

        obj.sum();  // it works!
        // ...
    }
}

問題是,您的main方法不知道整個LocalInnerClass 如果整個類型未知,它沒有幫助,它有一個公共方法。 你需要重構你的代碼才能改變它。

實際上,您的方法run當前返回一個Object類型的值,您需要返回一個LocalInnerClass類型的值,但是由於類型可見性,這是​​不可能的。

您基本上有兩種選擇。 一種是將整個LocalInnerClass移動到main可見的位置(如 oleg.cherednik 建議的那樣):

class LocalOuterClass {
    private int x = 10;
    private LocalInnerClass run() {  // now we can retun `LocalInnerClass`
        return new LocalInnerClass();
    }
    public static void main(String[] args) {
        new LocalOuterClass().run().sum(); // works!
    }
    
    private class LocalInnerClass {
        private int y = 20;
        public void sum() {
            System.out.println(x+y);
        }
    }
}

另一種選擇是實現/擴展具有sum的不同類型,例如:

class LocalOuterClass { 
    private int x = 10;
    private Summable run() {  //start of inner
        class LocalInnerClass implements Summable {
            private int y = 20;
            public void sum() {
                System.out.println(x+y);
            }
        } 
        return new LocalInnerClass();
    }
    public static void main(String[] args) {
        new LocalOuterClass().run().sum(); // works as well
    }
    
    private interface Summable {
        void sum();
    }
}

使用此接口選項,類型LocalInnerClass仍然對您的run方法之外的任何人不可見,但是Summable是,並且由於您的LocalInnerClass實現了Summable您可以返回該類型的值。

暫無
暫無

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

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