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

原创 2016年08月30日 23:48:46

在看毕向东java视频的时候,多态这一章讲到了一段代码:

public class Demo {
	public static void main(String[] args) {
		Fu f = new Zi();
		f.show();
	}
}

class Fu {
	int num = 1;

	void show() {
		System.out.println(this.num);
	}
}

class Zi extends Fu {
	int num = 2;
}


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


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

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

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

public class Demo {
	public static void main(String[] args) {
		Fu f = new Zi();
		
		System.out.println(f.num);//这里定义的是父类,而成员变量没有多态,所以即使你new的子类,依然指向父类的成员变量。
		System.out.println(f.fun1());//不解释了,就是多态。
		f.show();
	}
}

class Fu {
	public String num = "父类成员变量";

	public void show() {
		System.out.println(this.num);//因为成员变量没有多态,所以this指向当前类对象的成员变量。
		System.out.println(this.fun1());//因为方法有多态,所以this指向new对象的方法。
	}
	
	public String fun1() {
		System.out.println(this.num);//因为成员变量没有多态,所以this指向当前类对象的成员变量。
		return "父类调用";
	}
}

class Zi extends Fu {
	public String num = "子类成员变量";
	
	public String fun1() {
		System.out.println(this.num);//因为成员变量没有多态,所以this指向当前类对象的成员变量。
		return "子类调用";
	}
}


另外一篇非常好的文章

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java this 关键字用法

介绍Java中this关键字的用法,包括在构造方法中this关键字的用法,非在构造方法中this关键字的用法,继承关系下this关键字含义的变化,以及super和this关键字的异同。
  • ccpat
  • ccpat
  • 2015-03-21 13:42
  • 3338

父类方法中使用this,那么这个this指的是谁?

一直在用一些东西,却总是感觉有一些疑惑,今天发现了自己一个及其致命的意识错误。关于父类中this关键字到底是谁的问题。请看代码 父类Parent public class Parent { pu...

谈谈基类与子类的this指针(C++)

谈谈基类与子类的this指针(C++) 引入   定义一个类的对象,首先系统已经给这个对象分配了空间,然后会调用构造函数(说明:假设存在构造函数)。一个类有多个对象,当程序中调用对象的...

谈谈基类与子类的this指针(C++)

引入   定义一个类的对象,首先系统已经给这个对象分配了空间,然后会调用构造函数(说明:假设存在构造函数)。一个类有多个对象,当程序中调用对象的某个函数时,有可能要访问到这个对象的成员变量。而对...

js 关于在子类构造函数中加入call(this)的用意!

先上例子: function Animal(a,b) { this.a = a; this.b = b; } function Dog(c) { //Animal.call(this);...

一个关于成员变量的多态问题

首先看下面的代码:class Fu{ int i = 10; } class Zi extends Fu{ int i = 20; } class Test{ public s...

java提高篇(三)-----理解java的三大特性之多态

面向对象编程有三大特性:封装、继承、多态。        封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访...

子类调用父类方法中的this

一直都说this指的是当前对象,super指的是父类对象。但是对这个this理解还是不透彻,今天看effective java 第14条,有个例子一直不理解: package com.zgd; p...

父类引用指向子类对象

内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)