关于子类和父类中的this的用法

Posted wuruofeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于子类和父类中的this的用法相关的知识,希望对你有一定的参考价值。

 1 public class Demo {
 2     public static void main(String[] args) {
 3         Fu f = new Zi();
 4         f.show();
 5     }
 6 }
 7  
 8 class Fu {
 9     int num = 1;
10  
11     void show() {
12         System.out.println(this.num);
13     }
14 }
15  
16 class Zi extends Fu {
17     int num = 2;
18 }

这里面的this很奇怪,为什么输出结果是1,this不是指向当前对象么,当前对象不是子类的实例么?例如父类有get和set方法,里面应该有this关键字,当子类继承父类时,调用get和set方法时,this关键字如何区分调用的是子类的filed还是父类的filed(假设有同名的filed)?


这个问题由@NewMoons网友做出了讲解:

在继承多态中:
1、对于方法的覆盖,new的谁就调谁,这就是多态。
2、对于成员变量的覆盖,this在哪个类就指向哪个类的成员变量,没有多态。

并给出了一段精彩的代码:

 1 public class Demo {
 2     public static void main(String[] args) {
 3         Fu f = new Zi();
 4         
 5         System.out.println(f.num);//这里定义的是父类,而成员变量没有多态,所以即使你new的子类,依然指向父类的成员变量。
 6         System.out.println(f.fun1());//不解释了,就是多态。
 7         f.show();
 8     }
 9 }
10  
11 class Fu {
12     public String num = "父类成员变量";
13  
14     public void show() {
15         System.out.println(this.num);//因为成员变量没有多态,所以this指向当前类对象的成员变量。
16         System.out.println(this.fun1());//因为方法有多态,所以this指向new对象的方法。
17     }
18     
19     public String fun1() {
20         System.out.println(this.num);//因为成员变量没有多态,所以this指向当前类对象的成员变量。
21         return "父类调用";
22     }
23 }
24  
25 class Zi extends Fu {
26     public String num = "子类成员变量";
27     
28     public String fun1() {
29         System.out.println(this.num);//因为成员变量没有多态,所以this指向当前类对象的成员变量。
30         return "子类调用";
31     }
32 }

 

以上是关于关于子类和父类中的this的用法的主要内容,如果未能解决你的问题,请参考以下文章

java学习之继承之子父类中变量的特点

java关于子类和父类构造方法的关系,犯迷糊!!

C#的构造函数在基类和父类中执行顺序

Java继承

子类可以直接调用父类的函数吗

如何在两个类中双重引用子类和父类