了解继承的基本 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
的编译时类型是 Baap
,b.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.h
是 4
因为变量不是 inhreited 所以它通过引用调用,即 Baap
class.
的 h
变量
b.getH()
给你 44
从 Beta
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。
希望对您有所帮助。
为什么 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
的编译时类型是 Baap
,b.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.h
是 4
因为变量不是 inhreited 所以它通过引用调用,即 Baap
class.
的 h
变量
b.getH()
给你 44
从 Beta
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。
希望对您有所帮助。