【问题标题】:What is the meaning of this code? Related with polymorfism [closed]这段代码的含义是什么?与多态性有关[关闭]
【发布时间】:2015-04-26 13:26:43
【问题描述】:
public class Base {
   public String className() {
      return "Base";
   }
}

public class Derived extends Base {
   @Override
   public String className() {
      return “Derived”;
   }
   public void testCalls() {
      Base base = (Base)this;
      out.println("Through this: " + this.className());
      out.println("Through base: " + base.className());
      out.println("Through super: " + super.className());
   }
}

thissuper 哪来的?还有为什么是 out.println 而不是 System.out.println

【问题讨论】:

  • 多读几页你引用这个例子的书。我相信他们会解释每一点。
  • 请正确缩进您的代码。

标签: java polymorphism base derived-class println


【解决方案1】:
  • this 是保留关键字,表示正在执行的对象 方法/构造函数。
  • super 也是保留字,表示当前类的“父类”。
  • 它是out.println,因为有人可能在System 上使用了static import(这通常是一种不好的做法,因此您最好避免使用它)。

【讨论】:

    【解决方案2】:

    您必须阅读一些有关面向对象编程和 Java 的基础知识。

    • this 指的是当前实例
    • super 指的是当前实例的超类

    out 没有更多上下文(例如 import static java.lang.System.out;)将无法编译。

    由于多态性和虚方法调用,前 2 个将打印“Derived”:将引用转换为 this 不会改变 Derived 类型的实例的性质。第三个打印“Base”,因为super.className() 明确引用了Base 类中定义的方法。

    【讨论】:

    • out without more context won't compile. 会,静态导入。 ideone.com/5vhYPl
    • 嗯,这正是我的意思;),您需要更多的信息,例如静态导入
    【解决方案3】:

    所以,当你“扩展”一个类时,你基本上是说“我希望这个新类与那个类完全一样,但也添加了这个类中的所有内容”(这被过度简化了,将进一步解释和了解有关多态性的更多信息)。

    所以,扩展类必须调用“super()”作为它的构造函数中的第一件事,这只是让它正在扩展的类知道在新类完成之前调用它的构造函数(甚至超过开始) 它是自己的构造。

    所以基本上,当你扩展一个类时,你需要调用 super() 作为新类构造函数的第一行。

    至于“this”,它指的是它所在类的当前实例化。这是 Java 的一个非常基础的概念(实际上是很多语言)。因此,如果您不了解它,请务必深入研究。

    “this”的一个简单例子:

    public class OurClass {
        private int aClassVar;
    
        public OurClass(int aClassVar) {
            this.aClassVar = aClassVar;
        }
    }
    

    因此,在上面的代码块中,当我们使用“new OurClass(3)”进行实例化时,我们必须使用“this.aClassVar”,以便 Java 知道我们指的是类 aClassVar 而不是方法参数中的 aClassVar (因为他们有相同的名字)。发生这种情况是因为 this 引用了当前的类实例化。

    super() 的一个例子:

    public class OurClass {
        private int aClassVar;
    
        public OurClass(int aClassVar) {
            this.aClassVar = aClassVar;
        }
    
        public String aRandomMethod() {
            return "Papa class!";
        }
    }
    
    
    public class OurNewClass extends OurClass{
    
        public OurNewClass() {
            super(4);
            System.out.println(this.aRandomMethod());
        }
    }
    

    所以,使用上面的代码,你可以看到我们使用了“this”关键字,而且还扩展了我们的旧类,在旧类的基础上创建了一个新类。当我们调用 super(4) 时,它会调用 OurClass 的构造函数,并为其提供它所期望的参数(一个整数,在本例中为:4)。然后它将该整数存储在构造函数告诉它的位置并完成基类的构建,然后 OurNewClass 构造函数的其余部分可以完成并打印出它是 aRandomMethod() 字符串。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多