parent,son深刻理解this,super关键字

核心点:

super关键字,表示调用的是父类对象。

this关键字,表示调用的是当前运行类对象。

那么如果在父类中,使用了关键字,this,此时的this指的是什么呢?

看下面的例子,再加深理解核心店的第二句话就ok了。

parent类:

package com.ghsy.thissuper;

public class Parent {

	public void init(){
		System.out.println(this.getClass()); //获得当前运行类
		System.out.println(this.getClass().getSuperclass()); //获得当前运行类的父类
		System.out.println("1 parent init");
		this.demo();
	}
	public void demo(){
		System.out.println("2 parent demo");
	}
	public static void main(String[] args) {

		Parent parent = new Parent();
		parent.init();
	}
}

son类:

package com.ghsy.thissuper;

public class Son extends Parent{

	public void init(){ //JVM获得隐式传递 this获得
		super.init(); // Parent.init(son);
		System.out.println("3 son init");
		this.demo();
	}
	public void demo(){
		System.out.println("4 son demo");
	}
	public static void main(String[] args) {
		Son son = new Son();
		son.init();	//Son.init(son)
	}
}

分别在以上两个类的六个方法中打上六个断点,然后用eclipse进行debug,同时追踪this关键字值的变化。会有如下发现。

当调用super.init()时候,程序走到parent方法的init方法位置。显然这里的super关键的作用,调用父类对象的方法的时候使用。

接着往下走断点,发现打印的this.getclass的结果是son,同时在debug模式下,元素跟踪框中this关键字,也是son实例。

从此可以看出,即使在子类中调用了父类的方法,在父类中执行方法时,使用this关键字,此时的this不是指此时的父类。

而仍然当前的运行类son类的实例。既然this,仍然代表son。那么断点继续往下走,调用父类中的init方法中的this.demo方法

会出现什么结果呢?其实还是son.demo(),如果子类son类,没有此方法,则会调用父类的此方法。

所以最终还是一句话,this关键字,指的是当前运行类的实例。所有再设计父子类继承关系的时候,要有所注意的。

上述程序,从son类运行的结果1434;从parent类运行结果1,2.

parent,son深刻理解this,super关键字,布布扣,bubuko.com

时间: 2024-10-13 02:13:02

parent,son深刻理解this,super关键字的相关文章

C++ 类的多态一(virtual关键字--构造函数深刻理解)

//virtual关键字--构造函数深刻理解 #include<iostream> using namespace std; /* C语言编译器,c++编译器全部是静态链编,就是一段一段代码的编译,不会考虑上下文 例如编译到void ProtectA(Point pin) 编译器就会认为pin就是Point类型, 而不会去联系上下文,去分析pin有没有可能是子类对象 virtual关键字会自动检测这个父类对象有没有是子类对象 */ /* virtual关键字的作用 假设父类中存在用virtua

深刻理解JavaScript基于原型的面向对象

主题一.原型 一.基于原型的语言的特点 1 只有对象,没有类;对象继承对象,而不是类继承类. 2  "原型对象"是基于原型语言的核心概念.原型对象是新对象的模板,它将自身的属性共享给新对象.一个对象不但可以享有自己创建时和运行时定义的属性,而且可以享有原型对象的属性. 3 除了语言原生的顶级对象,每一个对象都有自己的原型对象,所有对象构成一个树状的层级系统.root节点的顶层对象是一个语言原生的对象,其他所有对象都直接或间接继承它的属性. 显然,基于原型的语言比基于类的语言简单得多,我

深刻理解Python中的元类

译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程.于是e-satis同学给出了神一般的回复,该回复获得了985点的赞同点数,更有人评论说这段回复应该加入到Python的官方文档中去.而e-satis同学本人在Stack Overflow中的声望积分也高达6

深刻理解Python中的元类(metaclass)以及元类实现单例模式

深刻理解Python中的元类(metaclass)以及元类实现单例模式 在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元类创建单例模式的那一节有些疑惑.因此花了几天时间研究下元类这个概念.通过学习元类,我对python的面向对象有了更加深入的了解.这里将一篇写的非常好的文章基本照搬过来吧,这是一篇在Stack overflow上很热的帖子,我看http://blog.jobbole.com/21351/这篇博客对其进行了翻译. 一.理解

Java中super关键字的作用与用法

Java中的super是什么?java中的super关键字是一个引用变量,用于引用父类对象.关键字“super”以继承的概念出现在类中.主要用于以下情况: 1.使用super与变量:当派生类和基类具有相同的数据成员时,会发生此情况.在这种情况下,JVM可能会模糊不清.我们可以使用以下代码片段更清楚地理解它: /* Base class vehicle */ class Vehicle { int maxSpeed = 120; } /* sub class Car extending vehic

super关键字的使用

* super关键字的使用: * 1.super:理解为:父类的 * 2.super可以用来调用属性.方法.构造器 * * 3.super调用属性.方法 * 3.1 了继承以后,我们可以在子类的方法或构造器中,通过"super.属性"或者"super.方法"的方式,显式的调用 * 父类中声明的属性或方法.但是很多情况下,我们都可以省略"super." * * 3.2 如果子类和父类中出现了同名的属性,那么我们如果在子类中调用父类中同名的属性的话,

JAVA面向对象-----super关键字

JAVA面向对象-–super关键字 1:定义Father(父类)类 1:成员变量int x=1; 2:构造方法无参的和有参的,有输出语句 2:定义Son类extends Father类 1:成员变量int y=1; 2:构造方法无参和有参的.有输出语句this.y=y+x; 3:创建Son类对象 Son son=new Son(3); System.out.println(son.y); //4 class Father { int x = 1; Father() { System.out.p

成员变量的隐藏,方法的覆盖,super关键字

成员变量的隐藏:当父类和子类有相同的成员变量时,即定义了与父类相同的成员变量时,就会发生子类对父类变量的隐藏.对于子类的对象来说,父类中的同名成员变量被隐藏起来,子类就会优先使用自己的成员变量,父类成员隐藏. public class yincang {public static void main(String []args){ SonA son=new SonA(); son.showson(); FatherA father=new FatherA(); father.showfather

深刻理解C#中资源释放

今天我的一个朋友看到我写的那篇<C#中用AJAX验证用户登录>时,给我指出了点小毛 病.就是在用户登录时,如果用户登录失败,在下面这段代码中,都会new出来一个User对象,如果连续登录失败多次,就会生成多个User对象,而它们 在登录失败后已经无用了,依然占据着内存,就算是C#有垃圾回收机制,但不确定什么时候对这些对象进行回收.然后去网上找了一篇C#资源释放的文章,讲的很透彻,和大家分享一下. using System;using System.Collections.Generic;usi