Java继承。有趣的事情

标签 java inheritance

考虑使用这段代码:

public class Base {
    int a = 1;

    public int getA() {
        System.out.print("Super");
        return a;
    }

    public static void main(String[] argv) {
        Base base = new Sub();
        System.out.println(base.a + " " + base.getA());
        System.out.println(base.getA());
        System.out.println(base.a);
    }
}

class Sub extends Base {
    int a = 2;

    public int getA() {
        System.out.print("Sub");
        return a;
    }

}

输出是:

Sub1 2
Sub2
1

有人能给我解释一下输出吗?为什么 System.out.println(base.a + ""+ base.getA());System.out.println(base.getA());System.out.println (base.a); 给出不同的输出?

我认为 System.out.println(base.a + ""+ base.getA()); 的输出应该是 Sub2 1

你有什么想法吗?

最佳答案

这段代码

System.out.println(base.a + " " + base.getA());

打印

Sub1 2

因为 getA() (及其 System.out.println("Sup"))在创建字符串和 println 完成执行之前被调用。

步骤是这样的

  1. System.out.println(base.a + ""+ base.getA()); 被调用
  2. base.getA() 被调用,执行 System.out.print("Sub"); 并返回 2。此时,Sub 被打印到 out
  3. 一个字符串被创建为 base.a 的串联,它是值 12 的返回值,它是值2
  4. 打印结果字符串3,即字符串1 2
  5. 输出已包含 Sub,然后将 4 的结果附加到其中,因此 Sub1 2

关于Java继承。有趣的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18065767/

相关文章:

c++ - decltype 所需的不完整类型的派生到基转换

C# - 在子类中调用个别行为后在抽象类中添加公共(public)行为

python - 理解@property 装饰器和继承

java - 如何在PeriodicSizeRotatingFileHandler JBoss 7中使用带有日期的文件名?

java - Hibernate:将子类的实例转换为父类(super class)的实例

java - 有没有一种简单的方法可以在 Java 中计算和格式化时间/日期间隔?

java - 在java中加载的图像上绘制对象

Java 前缀和一元运算符在一起

Java Spring Rest Call使用父类(super class)获取子类

c# - 大量已知类型如何影响 DataContractSerializer 的性能