Java关键字this只能用于方法方法体内。

当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是this。

因此,this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this,

这在“Java关键字static、final使用总结”一文中给出了明确解释。并且this只和特定的对象关联,而不和类关联,同一个类的不同对象有不同的this。下面给出一个使用this的综合实例,以便说明问题:

package org.leizhimin;
public class Test6 {private int number;private String username;private String password;private int x = 100;public Test6(int n) {number = n;  // 这个还可以写为: this.number=n;}public Test6(int i, String username, String password) {// 成员变量和参数同名,成员变量被屏蔽,用"this.成员变量"的方式访问成员变量.this.username = username;this.password = password;}// 默认不带参数的构造方法public Test6() {this(0, "未知", "空"); // 通过this调用另一个构造方法}public Test6(String name) {this(1, name, "空"); // 通过this调用另一个构造方法}public static void main(String args[]) {Test6 t1 = new Test6();Test6 t2 = new Test6("游客");t1.outinfo(t1);t2.outinfo(t2);}private void outinfo(Test6 t) {System.out.println("-----------");System.out.println(t.number);System.out.println(t.username);System.out.println(t.password);f(); // 这个可以写为: this.f();}private void f() {// 局部变量与成员变量同名,成员变量被屏蔽,用"this.成员变量"的方式访问成员变量.int x;x = this.x++;System.out.println(x);System.out.println(this.x);}//返回当前实例的引用private Test6 getSelf() {return this; }
}

运行结果如下:


0

未知

100

101


0

游客

100

101

看着上面的例子,说明在什么情况下需要用到this:

第一、通过this调用另一个构造方法,用发是this(参数列表),这个仅仅在类的构造方法中,别的地方不能这么用。

第二、函数参数或者函数中的局部变量和成员变量同名的情况下,成员变量被屏蔽,此时要访问成员变量则需要用“this.成员变量名”的方式来引用成员变量。当然,在没有同名的情况下,可以直接用成员变量的名字,而不用this,用了也不为错,呵呵。

第三、在函数中,需要引用该函所属类的当前对象时候,直接用this。

其实这些用法总结都是从对“this是指向对象本身的一个指针”这句话的更深入的理解而来的,死记不然容易忘记而且容易搞错,要理解!


super关键和this作用类似,

是被屏蔽的成员变量或者成员方法或变为可见

或者说用来引用被屏蔽的成员变量和成员成员方法。

不过super是用在子类中,

目的是访问直接父类中被屏蔽的成员

注意是直接父类(就是类之上最近的超类)。

下面是一个综合运用super的例子

有两个类:一个Father类,一个Father类的子类Son,

通过这两个类完全演示了super的用法,

以下是代码:

package org.leizhimin;
public class Father {public String v="Father";public String x="输出了Father类的public成员变量x!!!";public Father() {System.out.println("Father构造方法被调用!");}public Father(String v){this.v="Father类的带参数构造方法!运行了.";}public void outinfo(){System.out.println("Father的outinfo方法被调用");} public static void main(String[] args) {// TODO 自动生成方法存根}
}package org.leizhimin;
public class Son extends Father{public String v="Son";public Son() {super();      //调用超类的构造方法,只能放到第一行System.out.println("Son无参数构造方法被调用!");//super();      //错误的,必须放到构造方法体的最前面.} public Son(String str){super(str);System.out.println("Son带参数构造方法被调用!");}//覆盖了超类成员方法outinfo()public void outinfo(){ System.out.println("Son的outinfo()方法被调用");} public void test(){String v="哈哈哈哈!";   //局部变量v覆盖了成员变量v和超类变量vSystem.out.println("------1-----");System.out.println(v);   //输出局部变量vSystem.out.println(this.v);  //输出(子类)成员变量vSystem.out.println(super.v); //输出超类成员变量v System.out.println("------2-----");System.out.println(x);   //输出超类成员变量v,子类继承而来System.out.println(super.x); //输出超类成员变量vSystem.out.println("------3-----");outinfo();   //调用子类的outinfo()方法this.outinfo();  //调用子类的outinfo()方法super.outinfo(); //调用父类的outinfo()方法} public static void main(String[] args) {new Son().test();}
}

子类Son运行结果:

Father构造方法被调用!

Son无参数构造方法被调用!

——1—–

哈哈哈哈!

Son

Father

——2—–

输出了Father类的public成员变量x!!!

输出了Father类的public成员变量x!!!

——3—–

Son的outinfo()方法被调用

Son的outinfo()方法被调用

Father的outinfo方法被调用

说明

此例子仅仅为了说明super的用法,实际在设计类的时候一般都尽可能私有(private)化。

通过上面的例子,下面总结一下super的用法:

第一、在子类构造方法中要调用父类的构造方法,用“super(参数列表)”的方式调用,参数不是必须的。同时还要注意的一点是:“super(参数列表)”这条语句只能用在子类构造方法体中的第一行

第二、当子类方法中的局部变量或者子类的成员变量与父类成员变量同名时,也就是子类局部变量覆盖父类成员变量时,用“super.成员变量名”来引用父类成员变量。当然,如果父类的成员变量没有被覆盖,也可以用“super.成员变量名”来引用父类成员变量,不过这是不必要的。

第三、当子类的成员方法覆盖了父类的成员方法时,也就是子类和父类有完全相同的方法定义(但方法体可以不同),此时,用“super.方法名(参数列表)”的方式访问父类的方法。

super this相关推荐

  1. super(Student,self).__init__()初始化的是什么东西?

    继承不是为了继承里面原来的属性和值么,不初始化的话,会有什么问题? 2015-04-04源自:python进阶 5-17642 浏览2 回答 最佳回答 2015-05-05 1 super(Stude ...

  2. Google Pixel 超分辨率--Super Resolution Zoom

    Google Pixel 超分辨率–Super Resolution Zoom Google 的Super Res Zoom技术,主要用于在zoom时增强画面细节以及提升在夜景下的效果. 文章的主要贡 ...

  3. 【译】为什么要写super(props)

    译注: 原文地址 https://overreacted.io/why-do-we-write-super-props/ 正文 我听说Hooks是新的热点.好笑的是,我想通过描述一些关于class组件 ...

  4. java super快速生成_为什么当我使用编辑器代码生成器时,eclipse会在构造函数中自动添加一个java super()方法?...

    正如@Kon在他的评论中提到的, Java中的一个空构造函数包含对超类构造函数的隐式调用. 此外,没有明确调用super()的非空构造函数将在顶部具有隐式调用. 离开super()调用是唯一的时候,如 ...

  5. java super是引用变量吗_Java中super的几种用法并与this的区别

    1.     子类的构造函数如果要引用super的话,必须把super放在函数的首位. class Base { Base() { System.out.println("Base" ...

  6. def __init__(self)是什么意思_子类必须调用 super().__init__() 吗?

    我新开了专栏 <恍然大明白>,如果关注 Python 底层实现,请移步 恍然大明白​www.zhihu.com 今天遇到一个有意思的问题,小组一位小哥在开发中,遇到了传说中的 " ...

  7. This和Super关键字的对比

    this和Super关键字 this和Super关键字的对比 Super关键字的用法如下: 1. super关键字代表了父类空间的引用: 2. super关键字的作用: 3. super关键字调用父类 ...

  8. java中super用来定义父类,Java中super的几种用法及与this的区别

    综观目前的 Web 应用,多数应用都具备任务调度的功能.本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,并对其优缺 ...

  9. android中方法调用super(..)的相关知识

    java中的多态有重写 方法被子类重写后 父类的原方法就会被隐藏 当你又需要调用父类所定义的原方法  这个时候就可以用super来调用 super调用指向了父类,在一些调用里可以很巧妙的利用,比如监听 ...

  10. Java中的两个关键字——super、this

    Java中的两个关键字--super.this 神话丿小王子的博客主页 一.super super 是java中方的一个关键字,用它可以引用父类中的成员: super可用于访问父类中定义的属性 sup ...

最新文章

  1. 2003 DHCP升级到2008 DHCP
  2. 使用python手写FFT算法
  3. 在虚拟主机中无法实现缩放等交互
  4. LeetCode 340. Longest Substring with At Most K Distinct Characters
  5. VUE—从入门到飞起(一)
  6. 【百度飞浆】YOLO系列目标检测算法详解
  7. Matlab学习------------带有右键菜单的GUI学习实例
  8. 北大“四大疯人院”之说
  9. element ui分页怎么做_vue+element-ui的分页完整版
  10. 无奈!《花木兰》《速度与激情9》等多部影片宣布撤档
  11. oracle instant imp,使用instantclient连接oracle数据库
  12. visio 取消跨线
  13. DarkGDK的杯具体验
  14. conda 小tips
  15. 带隔离功能的 高速CAN总线收发器 SIT1050ISODUB8 国产
  16. 在php的开发环境中如何调取WebService?
  17. 【DOORS】如何基于DOORS实施需求管理
  18. 熊节,你该如何是好?
  19. 可折叠的table表格
  20. delphi 控件大全

热门文章

  1. 性能测试5-性能测试环境搭建
  2. 2019计算机考研各科目时间安排,2019考研时间安排
  3. MarkdownPad2安装教程
  4. 腾讯企鹅辅导 H5 性能极致优化
  5. 数据库驱动和JDBC、DBCP-C3P0连接池
  6. EPSON RC+ 7.0 使用记录一
  7. Word插入高亮格式化代码
  8. 《近匠》专访Ayla Networks云平台工程部主管——企业级物联网云平台的设计与部署...
  9. HTML中禁止自动完成和禁用输入法
  10. android 小视频添加水印,安卓手机怎么给视频加水印 视频加水印的手机软件|微信小视频怎么加水印...