this和super关键字

this关键字

this的含义

this代表当前对象

this使用位置

  • this在实例初始化相关的代码块和构造器中:表示正在创建的那个实例对象,即正在new谁,this就代表谁
  • this在非静态实例方法中:表示调用该方法的对象,即谁在调用,this就代表谁。
  • this不能出现在静态代码块和静态方法中

this使用格式

(1)this.成员变量名

  • 当方法的局部变量与当前对象的成员变量重名时,就可以在成员变量前面加this.,如果没有重名问题,就可以省略this.
  • this.成员变量会先从本类声明的成员变量列表中查找,如果未找到,会去从父类继承的在子类中仍然可见的成员变量列表中查找

(2)this.成员方法

  • 调用当前对象的成员方法时,都可以加"this.",也可以省略,实际开发中都省略
  • 当前对象的成员方法,先从本类声明的成员方法列表中查找,如果未找到,会去从父类继承的在子类中仍然可见的成员方法列表中查找

(3)this()或this(实参列表)

  • 只能调用本类的其他构造器

  • 必须在构造器的首行

  • 如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了"this(【实参列表】)",否则会发生递归调用死循环

super关键字

super的含义

super代表当前对象中从父类的引用的资源

super使用的前提

  • 通过super引用父类的xx,都是在子类中仍然可见的(不是私有化的
  • 不能在静态代码块和静态方法中使用super(与this相同

super的使用格式

(1)super.成员变量

在子类中访问父类的成员变量,特别是当子类的成员变量与父类的成员变量重名时。

public class Person {private String name;private int age;//其他代码省略
}
public class Student extends Person{private int score;//其他成员方法省略
}
public class Test{public static void main(String[] args){Student stu = new Student();}
}
public class Test{public static void main(String[] args){Son s = new Son();s.test(30);}
}
class Father{int a = 10;
}
class Son extends Father{int a = 20;public void test(int a){System.out.println(super.a);//10System.out.println(this.a);//20System.out.println(a);//30}
}

(2)super.成员方法

在子类中调用父类的成员方法,特别是当子类重写了父类的成员方法时

public class Test{public static void main(String[] args){Son s = new Son();s.test();}
}
class Father{public void method(){System.out.println("aa");}
}
class Son extends Father{public void method(){System.out.println("bb");}public void test(){method();//bbthis.method();//bbsuper.method();//aa}
}

(3)super()或super(实参列表)

在子类的构造器首行,用于表示调用父类的哪个实例初始化方法

super() 和 this() 都必须是在构造方法的第一行,所以不能同时出现。

就近原则和追根溯源原则

找变量

  • 没有super和this

    • 在构造器、代码块、方法中如果出现使用某个变量,先查看是否是当前块声明的局部变量,
    • 如果不是局部变量,先从当前执行代码的本类去找成员变量
    • 如果从当前执行代码的本类中没有找到,会往上找父类的(非private,跨包还不能是缺省的)
  • this :代表当前对象

    • 通过this找成员变量时,先从当前执行代码的本类中找,没有的会往上找父类的(非private,跨包还不能是缺省的)。
  • super :代表父类的

    • 通过super找成员变量,直接从当前执行代码所在类的父类找
    • super()或super(实参列表)只能从直接父类找
    • 通过super只能访问父类在子类中可见的(非private,跨包还不能是缺省的)

注意:super和this都不能出现在静态方法和静态代码块中,因为super和this都是存在与对象中的

class Father{int a = 10;int b = 11;
}
class Son extends Father{int a = 20;public void test(){//子类与父类的属性同名,子类对象中就有两个aSystem.out.println("父类的a:" + super.a);//10    直接从父类局部变量找System.out.println("子类的a:" + this.a);//20   先从本类成员变量找System.out.println("子类的a:" + a);//20  先找局部变量找,没有再从本类成员变量找//子类与父类的属性不同名,是同一个bSystem.out.println("b = " + b);//11  先找局部变量找,没有再从本类成员变量找,没有再从父类找System.out.println("b = " + this.b);//11   先从本类成员变量找,没有再从父类找System.out.println("b = " + super.b);//11  直接从父类局部变量找}public void method(int a){//子类与父类的属性同名,子类对象中就有两个成员变量a,此时方法中还有一个局部变量aSystem.out.println("父类的a:" + super.a);//10  直接从父类局部变量找System.out.println("子类的a:" + this.a);//20  先从本类成员变量找System.out.println("局部变量的a:" + a);//30  先找局部变量}public void fun(int b){System.out.println("b = " + b);//13  先找局部变量System.out.println("b = " + this.b);//11  先从本类成员变量找System.out.println("b = " + super.b);//11  直接从父类局部变量找}
}
public class TestInherite2 {public static void main(String[] args) {Son son = new Son();System.out.println(son.a);//20System.out.println(son.b);//11son.test();son.method(30);son.fun(13);}
}

this和super用法相关推荐

  1. JAVA中this和super用法

    参考网上资料和自行理解总结java中this和super中各自用法及其差异 <一>. this的用法 构造方法是创建java对象的重要途径,通过new关键字调用构造器时,构造器返回该类的对 ...

  2. java super实例_java Super 用法详解及实例代码

    java Super 用法详解及实例代码 发布于 2021-1-8| 复制链接 摘记: java  Super 用法详解 1)有人写了个很好的初始化属性的构造函数,而你仅仅想要在其中添加另一些自己新建 ...

  3. Python语言学习之字母S开头函数使用集锦:set/sys/super用法之详细攻略

    Python语言学习之字母S开头函数使用集锦:set/sys/super用法之详细攻略 set用法 set顾名思义是集合,里面不能包含重复的元素,接收一个list作为参数 list1=[1,2,3,4 ...

  4. python中的super用法详解_【Python】【类】super用法详解

    一.问题的发现与提出 在Python类的方法(method)中,要调用父类的某个方法,在Python 2.2以前,通常的写法如代码段1: 代码段1: class A: def __init__(sel ...

  5. python super用法

    super()用法 功能 super功能:super函数是子类用于调用父类(超类)的一个方法. 用法 1.在子类 __init__() 方法中正确的初始化父类,保证相同的基类只初始化一次. 2.覆盖特 ...

  6. python中的super用法详解_Python中super函数用法实例分析

    本文实例讲述了python中super函数用法.分享给大家供大家参考,具体如下: 这是个高大上的函数,在python装13手册里面介绍过多使用可显得自己是高手 23333. 但其实他还是很重要的. 简 ...

  7. python中的super用法详解_python super用法及原理详解

    这篇文章主要介绍了python super用法及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 概念 super作为python的内建函数. ...

  8. java学习笔记(五)----super用法,final用法,抽象类,接口

    子类不会继承父类的构造方法,在子类的构造方法中可使用super(参数列表)调用父类的构造方法. class Person { String name;   int age;   public Pers ...

  9. python的继承用法_Python 中的继承之Super用法

    以下Copy自官方文档说明,可点击查看官网源文 翻译内容属于德德自译,有不当之处请指正,勿喷... 翻译括弧中是德德自己理解,通过代码验证的,勿喷... super(type[, object-or- ...

  10. Python面向对象中super用法与MRO机制

    1. 引言 最近在研究django rest_framework的源码,老是遇到super,搞得一团蒙,多番查看各路大神博客,总算明白了一点,今天做一点总结. 2. 为什么要用super 1)让代码维 ...

最新文章

  1. PM配置详解之二:工厂维护和客户服务中心的主数据
  2. C/C++头文件规整
  3. vue中渲染对象中属性时显示未定义_揭开 vue 背后的秘密(1)
  4. JAVAAPI之STRING类和STRINGBUFER类
  5. ShardedJedisPool 中可用连接数的小bug
  6. Pocket Gem OA: Path Finder
  7. 如何给小朋友解释单摆运动_单摆的教案
  8. 数据结构与算法题整理
  9. C#正则怎么判断字符串中是否有汉字
  10. jenkins 编译java_Jenkins 通过 maven 构建编译 JAVA 项目环境
  11. 安装IBM Data Studio Client
  12. DVB 数字电视基础知识
  13. 网红王思聪数字屏保下载
  14. Spring与Spring Framework的入门介绍以及学习文章整理
  15. PHP1c型GNAS,【临床研究与实践】儿童假性甲状旁腺功能减退症20例临床特征与GNAS基因缺陷分析...
  16. C++学习历程及感受
  17. bilibili弹幕爬虫, 2019-1-10
  18. 七、使用OpenCV徒手实现:RGB转HSI,并提取红色
  19. Stata:固定效应模式必须加入时间固定效应吗?
  20. HTML/JS/浏览器与串口通信(一)

热门文章

  1. 快速读论文----CKA----Similarity of Neural Network Representations Revisited
  2. Tableau技巧(五)帕累托分布(二八原则)
  3. 史上最全的15个苹果手机输入法使用技巧,不看后悔三年
  4. 手机浏览网页或打开App时莫名弹出支付宝领红包界面的原因及应对措施
  5. 鸿蒙harmonyOS 方舟框架ARK使用ets的页面间转场动画的使用
  6. 如何把h5场景链接入微信公众号?
  7. 趣拿场景营销拥有哪些黑科技
  8. phpwind mysql 密码_PhpWind教程:MySQL数据库密码修改方法
  9. 用php如何写后台数据,PHP后端接口怎么写
  10. 学python后的感想_学习python的感想