java的super和this关键字用法总结
super用途:在子类中访问超类“被隐藏的成员变量(无论是否静态)和静态方法”以及“被重写的实例方法”。这里的超类必须是“直接超类”,即子类之上最近的超类。
super的用法:
①在子类构造方法中调用超类的构造方法,用“super(ParamList)”的方式调用,ParamList根据超类构造方法而定,可以为空。另外super(ParamList)必须是子类构造方法的第一句。
②当超类的成员变量因与子类的成员变量同名而被隐藏时(成员变量隐藏与是否静态无关),可用"super.memberVariableName"来访问超类的成员变量。
注意:有些人说当超类的成员变量与子类某方法的局部变量或参数同名时,也属于被隐藏。那么一旦离开该方法隐藏还成立吗,显然这种说法是错误的。隐藏概念只限于成员变量范围,方法体内的局部变量与成员变量同名属于下面的this要讨论的内容。
假设有超类parent,其中有成员变量A,子类child,其中有方法method(type A)存在:
1)如果子类没有隐藏超类成员变量A,在method(type A)中,无论使用this.A还是super.A都是一样的,都会访问超类成 员变量A;(this.A就是继承下来的,换句话说,对于自然继承下来(没有隐藏/重写)的成员变量甚至是方法,super.memberName=this.membername)
2)如果子类有成员变量A隐藏了超类成员变量A,在method(type A)中,super.A=parent.A,this.A=child.A,两者有区别。
③当超类的静态方法/实例方法被子类隐藏/重写时,可使用"super.methodName(ParamList)"来访问超类方法。对于静态方法而言,这没什么奇怪,对于实例方法而言,这种用法使得超类被重写的方法在子类中可见。
最后需要注意,super关键字不能在静态方法中使用!
this的用途:引用对象本身。
当一个对象创建后,Java虚拟机就会给这个对象分配一个引用自身的指针,这个指针的名字就是this。因此,this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this。并且this只和特定的对象关联,而不和类关联,同一个类的不同对象有不同的this。
this用法:
①在构造方法中,用this(ParamList)调用自己的另一个构造方法,this(ParamList)必须放在第一句位置!此用法只限于在构造方法中使用。
②某方法的参数或局部变量与某个成员变量同名时,在该方法中要访问该成员变量需要用“this.memberVariableName”的形式。
③某方法中需要引用其所属类的当前对象时,直接用this来引用当前对象。
示例代码:
- import java.lang.reflect.Field;
- import java.lang.reflect.Modifier;
- class A {
- int x;
- static double y;
- char z;
- A(char z) {
- this.z = z; // this访问成员变量,以区分同名参数
- }
- A(double newy, char newz) {
- double y = newy; // this访问成员变量,以区分同名局部变量
- char z = newz;
- this.y = y; // 因y是静态成员变量,最好使用className.staticMemberVarName即A.y访问
- this.z = z;
- }
- A(int a, double b, char c) {
- this(b, c);// 使用this(paramList)调用另一个构造方法必须放在第一句位置
- this.x = a;// 此处无法再使用this(x);理由同上
- }
- void OutPut() {
- if (this.equals(this))// this作为对象引用使用,当然此条件永远=true
- System.out.println("我是类" + GetClassName() + "的方法"
- + GetInvokeMethodName());
- }
- String GetClassName() {
- return this.getClass().getName();
- }
- String GetInvokeMethodName() {
- String TempName = new Exception().getStackTrace()[1].getMethodName();
- return TempName;
- }
- static void showStaticFieldValue(Object obj) throws Exception { //
- Field fields[] = obj.getClass().getDeclaredFields();
- String fieldName, fieldModifier, fieldType;
- Object val;
- for (int i = 0; i < fields.length; i++) {
- Field field = fields[i];
- if (field.toString().indexOf("static") != -1) {
- // System.out.println(field.toString());
- fieldName = field.getName();
- fieldType = field.getType().getName();
- fieldModifier = Modifier.toString(field.getModifiers());
- field.setAccessible(true);
- val = field.get(obj);
- System.out.println(fieldModifier + " " + fieldType + " "
- + fieldName + " = " + val);
- }
- }
- }
- void getStaticFieldValue() {
- try {
- showStaticFieldValue(this);
- } catch (Exception e) {
- }
- }
- }
- class B extends A {
- static double x;// 隐藏超类A的成员变量x
- int y = (int) this.x + 1;// 隐藏超类A的成员变量y,有人说this必须在方法体中使用,无情的击破其谣言。
- // 继承了超类A的成员变量z,仍为char z;
- B(char c) {
- super(c);/*
- * super(c)调用超类构造函数的目的在于初始化自然继承的超类成员,若子类完全隐藏了超类的成员变量, 则可以不用super
- * super(ParamList)访问超类构造函数 疑问: 1.类B隐藏且改变了类A的成员变量,
- * super(b)是否仅仅改变了B中包含的A对象的值, 而B中的static double x的值仍然为默认值?(待验证)
- * 2.java的构造方法属于实例方法还是静态方法?
- */
- x = super.y + 1.0;// super访问超类被隐藏的成员变量double y,也可以写成A.y
- y = super.x;// super访问超类被隐藏的成员变量int x
- }
- String GetClassName() {// 重写超类A的GetClassName()
- return "类类类BBB";
- }
- String GetInvokeMethodName() {// 重写超类A的GetInvokeMethodName()
- return "方法名称方法名称方法名称";
- }
- void OutPut() { // 重写超类的OutPut实例方法.
- System.out.println("super调用超类被重写的两个方法输出:类名="
- + super.GetClassName() + ",方法名=" + super.GetInvokeMethodName());// super调用超类的实例方法
- System.out.println("用类B的重写方法输出:类名=:" + GetClassName() + ","
- + ",方法名="+GetInvokeMethodName());// 调用自己的方法
- }
- static void showStaticFieldValue(Object obj) throws Exception { // 隐藏超类的静态方法
- System.out.println("static Field doulbe x=" + x);
- }
- void getStaticFieldValue() {
- try {
- System.out.println("super调用超类A的方法输出静态成员变量");
- super.showStaticFieldValue(this); // super调用超类被隐藏的静态方法
- System.out.println("类B自己的方法输出静态成员变量");
- showStaticFieldValue(this);// 类B自己的方法
- } catch (Exception e) {
- }
- }
- }
- class Example3_15 {
- public static void main(String[] args) {
- A myA = new A(8, 6.0, 'k');
- B myB = new B('哦');
- myA.getStaticFieldValue();
- myA.OutPut();
- System.out.println("====================");
- myB.getStaticFieldValue();
- myB.OutPut();
- }
- }
java的super和this关键字用法总结的更多相关文章
- Java中 final static super this instanceof 关键字用法
一.final关键字 final可以修饰变量.方法及类: 1.当定义一个final变量时,jvm会将其分配到常量池中,其所修饰的对象只能赋值一次,对基本类型来说是其值不可变,引用类型(包括作为函数形参 ...
- super,this关键字用法 Java
super 用法 1.调用父类变量2.调用父类方法3.子类构造方法第一句 this 用法 super关键字用来访问父类内容, this 关键字用来访问本类中的内容, 有三种用法 1.在本类的成员方法中 ...
- java中super的两种用法
通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量.但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自 ...
- Java中super的几种用法并与this的区别
1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位. class Base { Base() { System.out.println("Base"); ...
- java中super的几种用法,与this的区别
1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位. class Base { Base() { System.out.println("Base"); ...
- 关于java的continue、break关键字用法
一 明确两个概念 循环:是指按照规定次数重复执行某一操作的全过程:其关键语句有for. foreach.while.do while 迭代:是指循环过程中单次操作,1次循环由n次迭代构成 二 用法归纳 ...
- Java中Super和final关键字以及异常类
1.final类不能有子类,也就谈不上继承的说法,如果用final修饰成员变量或者局部变量,那成了常量需要制定常量的值. 2.对象的上转型对象,上转型对象不能操作子类新增的成员变量,不能调用子类新增的 ...
- Python面试题之Python和Java中Super方法的区别
python 的 super 是一个函数,需要两个参数,第一个参数是类,第二个参数是实例,返回值是一个类对象. 其意义是:站在参数2这个实例的角度看去, 参数1这个类的‘父亲’是谁,把‘父亲’返回. ...
- Java中的两个关键字——super、this
Java中的两个关键字——super.this 神话丿小王子的博客主页 一.super super 是java中方的一个关键字,用它可以引用父类中的成员: super可用于访问父类中定义的属性 sup ...
随机推荐
- Linux 系统信息查询
众所周知,Linux大部分操作是通过命令实现的,并不像windows那么直观.linux查看硬件信息也是需要通过linux查看硬件信息命令查询的,下面小编来分享一下linux查看硬件信息的方法和命令写 ...
- WebGL编程指南案例解析之3D视图视区问题
var VSHADER_SOURCE = 'attribute vec4 a_Position;\n' + 'attribute vec4 a_Color;\n' + 'uniform mat4 u_ ...
- linux平台模拟生成CAN设备
前言 使用socketCan的过程中有时候没有can接口设备,但是需要测试一下can接口程序是否有问题, 此时需要系统模拟生成can设备,本文介绍linux平台模拟生成CAN设备的方法. 实现步骤 1 ...
- Windows-CreateProcess-fdwCreate
DEBUG_PROCESS: DEBUG_ONLY_THIS_PROCESS: CREATE_SUSPENDED: DETACHED_PROCESS: CREATE_NEW_CONSOLE: CREA ...
- stm32 看门狗配置
1.独立看门狗: 1) 取消寄存器写保护(向 IWDG_KR 写入 0X5555) IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能或者失能 2) ...
- CodeForces - 547D: Mike and Fish (转化为欧拉回路)(优化dfs稠密图)(定向问题)
As everyone knows, bears love fish. But Mike is a strange bear; He hates fish! The even more strange ...
- mysql query 条件中为空时忽略
☆. q.ques_group传入为null或''的时候不查询此条件: value AND (q.ques_group = :quesGroup or :quesGroup is null or :q ...
- C语言运算符优先级和ASCII表
1. C语言运算符优先级及结合性 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 -- () 圆括号 (表达式)/函数名(形参表) -- . 成 ...
- web 分享代码片段
<div class="bshare-custom icon-medium-plus"><a title="分享到QQ空间" class=&q ...
- 【VB.NET】——若水归海
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/successA/article/details/34496209 看完台湾微软特约资深讲师的VB.N ...