了解继承的基本 java 代码

basic java code to understand inheritance

为什么 System.out.println(b.h + " " + b.getH()); 打印以下内容:

Beta 44 <br/>
4 44          (notice this is in the second line)

我期待它打印这样的东西:

4 Beta 44 44   (this one is in one line)

我认为它会以这种方式打印的原因是因为我们首先调用 b.h 即 4.Then 我们调用 b.getH() 它将打印 Beta 44 44

代码如下:

class Baap{

        int h = 4;
        public int getH(){
                System.out.println("Beta " + h);
                return h;
        }
}

class Beta extends Baap{
        int h = 44;
        public int getH(){
                System.out.println("Beta " + h);
                return h;
        }

        public static void main (String [] args) {
                Baap b = new Beta();
                System.out.println(b.h + " " + b.getH());
        }

}

首先,对 getH() 的调用打印 "Beta 44",因为 System.out.println(b.h + " " + b.getH()) 的参数在调用 println 之前计算。

然后 System.out.println(b.h + " " + b.getH()) 打印“4 44”。

b.h returns 4 因为实例变量没有覆盖,而且 b 的编译时类型是 Baapb.h returns super的实例变量class。

b.getH() returns 44 因为你 b 的运行时类型是 Beta,它覆盖了 getH().

输出是因为 System.out.println(b.h + " " + b.getH()); 中的表达式先求值然后打印。 所以顺序是

System.out.println(b.h + " " + b.getH());  // calls getH() method
System.out.println("Beta " + h);           //print Beta 44
System.out.println(b.h + " " + b.getH());  //prints 4 44

所以完整的o/p是

Beta 44
4 44

b.h4 因为变量不是 inhreited 所以它通过引用调用,即 Baap class.
h 变量 b.getH() 给你 44Beta class 方法返回的值(Beta 中的 h=44 class)。

System.out.println(b.h + " " + b.getH());

按以下顺序执行:

String temp1 = b.h
String temp2 = temp1 + " "
String temp3 = b.getH () // prints Beta 44
String temp4 = temp2 + temp3
System.out.println (temp4) // prints 4 44

输出是

Beta 44

4 44

要计算表达式 System.out.println(b.h + " " + b.getH()); 方法 b.getH() 需要先进行计算。由于该对象是 class Beta 的事实,您会在第一行看到 Beta 44 [由于您使用的是 println 方法,因此您将在末尾有一个换行符]和方法 returns 44.

那么就很简单System.out.println(b.h + " " + 44);

现在,因为您只是直接使用类型为 Baap 的引用来引用变量,您将得到 4 [记住变量不会被覆盖,它们只是被隐藏]。因此第二行 4 44

给出了绝对正确的答案

Beta 44 
4 44

对于此语句:System.out.println(b.h + " " + b.getH());

当程序计数器或编译器从右到左检查语句时,在 println() 方法中程序计数器首先识别并评估方法的参数,因为它先执行 b.getH() 所以 "Beat 44" 是答案的第一部分,之后它得到一个新行 println() 最后它打印 b.h 值 (4) 然后 return 值b.getH() 即 44。

因为使用了相同的覆盖方法。当使用覆盖方法时,class 将优先使用其自己的方法,而不是父级的 class 方法。

它首先计算 println() 语句中的表达式,因为 Beta44 首先被打印出来。然后它开始在 println 语句中从左到右打印值,然后打印 4,44。它打印 4 因为实例变量是 Baap 类型(编译时)。因此,它选择 Baap class 中定义的变量值。 如果父项和子项中都存在相同的方法,则仅从子项 class 调用覆盖的方法。但是,变量和静态字段是从实例变量类型调用的,在这种情况下是 Baap。

希望对您有所帮助。