1

我是一名试图理解 Java 中的继承的本科生。docs.oracle 网站说一个类的所有成员都是继承的,除了构造函数。这是有道理的。问题是我做了一个实验,但没有奏效。这里是:

public class One{
    public void outPrint(){
        System.out.println("Hello World!");
    }//end outPrint
}//end One.java

public class Two extends One{
    //empty
}//end Two.java

public class Three extends Two{
    public static void main(String[]args){
        outPrint();
    }//end main
}//end Three.java

当我运行三时,我得到:无法从静态上下文引用非静态方法 outPrint()。这当然是因为编译器将 outPrint() 视为实例成员。如果我将关键字“static”添加到 outPrint() 方法标头,那么整个事情就可以正常工作。

这就是我的困惑所在。似乎不仅仅是不可继承的构造函数,还有它的所有实例成员。谁能更好地向我解释一下?是否有不涉及使用“静态”的解决方法?我尝试了一些“超级”实验,但无济于事。提前致谢!

4

4 回答 4

5

您需要实例化一个要调用的对象。

例如

Three t = new Three();
t.outPrint();

您定义的main()方法是静态的,并且没有对象 ( / / )的实例。它仅存在于特定的命名空间中。OneTwoThree

请注意,您可以因此证明Three is-a One

One t = new Three();
t.outPrint();

如果您覆盖outPrint()每个子类的方法,您可以看到调用哪个方法,具体取决于您如何实例化和/或引用原始对象实例。

于 2013-07-04T13:12:18.523 回答
1

您试图在没有实例的情况下调用非静态方法。实例方法只能使用类的实例来调用。创建一个实例,将帮助您调用该方法,如下所示:

Three threeInstance = new Three();
threeInstance.outPrint();
于 2013-07-04T13:15:07.880 回答
1

为此,您需要创建class Threeorclass Two或的对象class One

    public class Three extends Two
{
    public static void main(String[]args)
    {

              Two t= new Two();         
              t.outPrint();

     }
}
于 2013-07-04T13:15:20.303 回答
1

尝试这个

public class Three extends Two{

    public static void main(String[]args){
        Three three = new Three();
        three.outPrint(); //outPrint() can only be called by an instance
    }//end main

}//end Three.java

即使在同一个类中,您也不能从静态方法访问非静态方法。您必须使用实例访问它们。

但是,在 Three.java 类中也可以进行以下操作:

public class Three extends Two{

    public static void main(String[]args){
        Three three = new Three();
        three.printSomething("Hi");
        // this will output:
        // Hi
        // Hello World
    }//end main
    public void printSomething(text) {
        System.out.println(text);
        outPrint(); //implicit "this" which refers to this instance....it can be rewritten as this.outPrint();
    }
}//end Three.java
于 2013-07-04T13:15:21.913 回答