前言:理论和代码必须结合起来才能真正的掌握

一、this

概念:this代表着当前对象的引用,this代表的是执行者,this本质是一个执行当前对象的指针,如何判断this代表的是哪个对象?

this.xxx(); // 当前那个对象调用的xxx方法,this就代表哪个对象

常见的用法

  1. 最常见的情况是是对象的属性因为与构造器参数同名而被构造器参数屏蔽时,如果需要调用对象被屏蔽的属性,需要用用this进行标识,例如this.name指的是我这里的调用的是当前对象的属性name而不是构造器的局部变量参数name
//局部变量name和age屏蔽了name和age属性,用this进行标识
public Person(String name, int age,String nation) {this.name = name;this.age = age;}
  1. this只能在方法内使用,表示正在调用方法的那个对象,但是如果在方法内调用同一个类的另一个方法,就不必使用this,直接调用即可,this关键字是能省则省
public class Person{public void test(){System.out.println("测试");}public void test2(){//以下这两行是等价,推荐第二种写法this.test();test()}
}
  1. this和static的关系:
    static方法是类方法,依附于类而不依赖与任何对象,static属性是指该属性是类中所有对象所共享的,static方法是类方法,先于任何实例(对象)存在,static在类加载时就已经存在了,但对象是在创建时才生成;方法中使用this关键字它的值是当前对象的引用,只能用它调用属于当前对象的属性和方法和。但是,this可以调用static类型的属性,举个例子:一个父亲是不可能向他还未出生的孩子借钱的,但孩子出生后完全可以找他父亲去借钱,总之:static方法或static代码块内不能出现this,但是this可以调用到静态属性和静态方法
public class Person {public static String nation = "Chinese";public static String getNation(){return nation;}@Testpublic void test(){System.out.println(this.nation); //ChineseSystem.out.println(this.getNation());//Chinese}
}

这个案例中main方法内不能调用到test(),正好论证了静态方法内部不能出现非静态方法和属性这个观点

  1. 对于一个类中的this,不一定单指这个的对象,也可能是这个类的子类的对象(抽象类里面的this只能是实际调用中它的派生类的实例化对象,因为抽象类本身不能实例化);总之:如果new 父类对象的话,父类方法的this指向的是父类,如果new 子类,那么父类方法的this指向的是子类
class Student extends Person{private String name;private int age;public Student(String name, int age) {super(name, age);}
}public class Person{private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person/Student{" +"name='" + name + '\'' +", age=" + age +'}';}public void print(){System.out.println(this.toString());}public static void main(String[] args) {Student student = new Student("student", 11);Person person = new Person("person",12);//此时print中的this代表的是Student的实例对象student.print();//Person/Student{name='student', age=11}//此时print中的this代表的是Person的实例对象person.print();//Person/Student{name='person', age=12}}
}
  1. this关键字也可以用于在构造函数中调用其他构造函数。但是,只能定义在构造函数的第一行,因为初始化动作要先执行,如果是用this调用本列无参构造器可省略,如果用this调用的是有参构造器就不能省略,而且this只能调用一次构造器
public class Person{private String name;private int age;public Person() { }public Person(String name) {this(); //作用是调用本类的无参构造,可以省略this.name = name;}public Person(int age) {this();//作用是调用本类的无参构造,可以省略this.age = age;}public Person(String name, int age) {this(name);this.age = age;}
}

二、super

概念:super可以理解为“父类的”,super可以在子类中调用父类的属性,方法,构造器,super关键字和this一样能省就省,super在java的子类中指代父类引用,是一个关键字

注意点:

1、this和super很像,this指向的是当前对象的调用,super指向的是当前调用对象的父类
2、类加载完毕,创建对象,父类的构造方法会被调用

  • 父类如果重写了无参构造器或者父类中没有有参构造器,那么子类的构造方法第一行就是super(),可以省略
class Student extends Person{//这是默认的构造器内容,写出来是为了帮大家理解public Student(){super();}
}public class Person{private String name;private int age;
}
  • 如果父类中定义了有参构造器但没有显示写出无参构造器,那么必须通过super调用父类的有参构造函数,如果父类中定义了多个有参构造区,那么用super调用其中一个有参构造器即可
class Student extends Person{public Student(String name, int age) {//任选一个父类有参构造//super(name, age);super(name);}
}public class Person{private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public Person(String name) {this.name = name;}
}

3、子类相应构造创建了一个子类对象,该子类对象还包含了一个父类对象。该父类对象在子类对象内部(正如子类的构造器无论如何都要通过super调用父类构造器一样,子类的对象被成功构造,那么它的内部就会包含父类的对象),证明如下

  • 子类重写父类的方法后可以通过super调用到父类的方法
class Student extends Person {private String name = "wzh2";@Overridepublic String getName() {return "子类" + name;}public String getParentName(){//调用父类的方法return super.getName();}public static void main(String[] args) {Student student = new Student();System.out.println(student.getName());System.out.println(student.getParentName());}
}public class Person{//protected意味着子类和同一包中可以访问protected String name = "wzh"; protected int age = 20;public String getName() {return "父类" +name;}
}

输出结果

  • 子类获取到父类的变量
class Student extends Person{public void parentDisplay(){System.out.println(super.age + super.name);}public static void main(String[] args) {new Student().parentDisplay(); //输出结果:20wzh}
}public class Person{//protected意味着子类和同一包中可以访问protected String name = "wzh";protected int age = 20;
}
  • 调用父类的构造器
    不再举例

4、this super只能在有对象的前提下使用,不能在静态上下文使用
5、如果一个类没有基础任何父类,super还有用吗?肯定有用,可以调用Object中的方法

public class Person{private String name;private int age;public void display(){//通过this或super调用到了Object的toString();System.out.println(super.toString());}public static void main(String[] args) {new Person().display(); //输出为Person@452b3a41}}

this和super相关推荐

  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. 修复思维导图mindmanager移动文件位置后打开崩溃
  2. wcf系列学习5天速成——第五天 服务托管
  3. 当前框架下微服务开发注意事项 @Arthur
  4. 一个拆分使用的存储过程例子
  5. AT91SAM9260EK-38k产生原理
  6. android sdk与adt版本,eclipse中sdk与adt版本不兼容该怎么解决? 三种方法帮你搞定
  7. 【软件体系结构】架构风格与基于网络应用软件的架构设计:Roy Tomas Fielding】
  8. 金三银四,那浏览器兼容你知多少?
  9. Linux下gcc/g++、make和cmake的区别
  10. 一个单文件服务器(摘自《java网络编程》)
  11. OSX 鼠标和键盘事件
  12. C#获取电脑硬盘序列号
  13. AI画家挑战毕加索,一小时画9张画,关键是居然真有人买
  14. java流水号自增长_Java自增流水号生成
  15. 大数据技术与实践实验报告总结_大数据平台搭建实验心得体会
  16. 华为的PBC个人绩效评价模板
  17. 软件授权文件.lic文件
  18. java 实现仿word2007字数统计功能
  19. shell命令查阅端口信息_Linux服务器管理Shell经典命令
  20. ibm笔记本修复计算机开机按,IBM X280开机报错,按了Esc后正常解决方法

热门文章

  1. SSH隧道技术及端口映射与转发
  2. 英国电信公司O2寻求上市
  3. 嵌入式 Linux 开发工具篇问题整理//C语言测试(杨辉三角、递归调用实现阶乘、计算器、统计字符串出现次数)//2018.07.12.//
  4. 千兆网卡和普通网卡有什么区别?如何判断?
  5. mysql 下一年_mysql时间增加一年
  6. 计算机组成原理算术逻辑实验,《计算机组成原理》算术逻辑运算实验报告.doc...
  7. 刘邦韩信java_刘邦曾言三不杀韩信, 看懂后才知道是在玩他!
  8. 防止电子邮件网络钓鱼攻击的10种方法
  9. 查理·芒格的人类误判心理学
  10. 基于 Golang 的 K8s 二次开发细节汇总