【问题标题】:Java, Inheritance, and Instance Methods. Why won't my method inherit?Java、继承和实例方法。为什么我的方法不会继承?
【发布时间】:2013-07-04 13:09:10
【问题描述】:

我是一名本科生,试图了解 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

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

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

【问题讨论】:

  • 简单的建议。也许您的老师建议(或强迫)您将 cmets 放在每个大括号的末尾,但这对程序员来说是噪音。注释用于可能不清楚的事情,例如解释算法。如果您的代码缩进良好(制表符、换行符等),那么这些 cmets 确实是不必要的。
  • 这是推荐的,但它也有助于我在必须调试时阅读代码。在这个例子中,这似乎是多余的,但我发现当我有几百行或更多代码时,我可以更好地区分代码块。尤其是在控制结构方面。当我进入职业世界时,我确信我必须改变我的习惯!感谢您的建议!

标签: java inheritance static-methods extends instance-methods


【解决方案1】:

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

例如

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

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

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

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

如果您为每个子类覆盖 outPrint() 方法,您可以根据实例化和/或引用原始对象实例的方式查看调用了哪个方法。

【讨论】:

  • 不错!我知道我喜欢在这里发布问题是有原因的!所以,澄清一下:我收到错误是因为我试图从静态 main() 方法调用 outPrint() 吗?现在回想起来,很有道理!谢谢!快乐四!
  • 没问题。关于。第四,我是英国人,所以我就等着圣乔治节吧:-)
  • 哈哈,讽刺!感谢您的帮助!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

        public class Three extends Two
    {
        public static void main(String[]args)
        {
    
                  Two t= new Two();         
                  t.outPrint();
    
         }
    }
    

    【讨论】:

      【解决方案4】:

      试试这个

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-29
        • 2012-10-18
        • 2016-09-01
        • 2012-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-21
        相关资源
        最近更新 更多