1 this关键字

1、this的含义

this代表当前对象

2、this使用位置

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

3、this使用格式

(1)this.成员变量名

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

(2)this.成员方法

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

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

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

  • 必须在构造器的首行

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

super关键字

1、super的含义

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

2、super使用的前提

  • 通过super引用父类的xx,都是在子类中仍然可见的
  • 不能在静态代码块和静态方法中使用super

3、super的使用格式

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

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() 都必须是在构造方法的第一行,所以不能同时出现。

就近原则和追根溯源原则

1、找变量

  • 没有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);}
}

2、找方法

  • 没有super和this

    • 先从当前对象(调用方法的对象)的本类找,如果没有,再从直接父类找,再没有,继续往上追溯
  • this

    • 先从当前对象(调用方法的对象)的本类找,如果没有,再从父类继承的可见的方法列表中查找
  • super

    • 直接从当前对象(调用方法的对象)的父类继承的可见的方法列表中查找

示例代码

public class Test{public static void main(String[] args){Son s = new Son();s.test();Daughter d = new Daughter();d.test();}
}
class Father{protected int num = 10;public int getNum(){return num;}
}
class Son extends Father{private int num = 20;public void test(){System.out.println(getNum());//10  本类没有找父类System.out.println(this.getNum());//10  本类没有找父类System.out.println(super.getNum());//10  本类没有找父类}
}
class Daughter extends Father{private int num = 20;public int getNum(){return num;}public void test(){System.out.println(getNum());//20  先找本类System.out.println(this.getNum());//20  先找本类System.out.println(super.getNum());//10  直接找父类}
}

3、找构造器

  • this()或this(实参列表):只从本类中,不会再往上追溯
  • super()或super(实参列表):只从直接父类找,不会再往上追溯

this和super关键字,就近原则和追根溯源原则相关推荐

  1. this关键字 就近原则 构造方法

    this关键字 就近原则 成员变量和局部变量(局部变量是左边method中的 成员变量是GirlFriend中的) 就近原则 就是 看下图 右边调用 左边输出age=10 而不是上面的 private ...

  2. this关键字+super关键字

    一.this关键字 1.实例一: (1)需求:使用Java类描述一个动物: (2)实例: class Animal{     String name;    //成员变量     String col ...

  3. [转载] JAVA面向对象之代码块 继承 方法的重写 super关键字与重写toString()方法介绍

    参考链接: 可以重写Java中的私有方法吗 JAVA面向对象之代码块与继承 代码块分类 局部代码块 作用:限制变量生命周期 书写位置:在方法中 构造代码块 开发中很少使用 书写位置:类中  方法外 调 ...

  4. 1.4 面向对象编程中级 对象的继承与super关键字-跟着韩老师学JavaSE

    大佬给推荐的韩顺平老师的课程 2021年刚刚录的船新版本! [零基础 快速学Java]韩顺平 零基础30天学会Java 硬把从另一个讲师那里看了300多集的我拽过来 几十节课一下子爱上这个节奏了!安利 ...

  5. JavaSE(this与super关键字;关联、依赖关系)

    this与super 1. this与super访问普通成员 1.1 this和super访问注意事项 调用普通成员: this.成员变量 可以访问本类对象的成员变量 super.成员变量 可以访问父 ...

  6. DYA9面向对象中--super关键字

    super关键字 super代表父类的引用,用于访问父类的属性.方法.构造器 基本语法: 1,访问父类的属性,但不能访问父类的private属性 super.属性名: 2,访问父类的方法,不访问父类的 ...

  7. this关键字与super关键字详解

    一.this关键字 1.实例一: (1)需求:使用Java类描述一个动物: (2)实例: class Animal{String name; //成员变量String color;public Ani ...

  8. 访问修饰符、常见的包以及包的权限和包的导入(inport关键字)、继承(super关键字)、多态(向上和向下转型)

    IDEA中快捷生成getter/setter的快捷键为 alt+inser(enter) getter/setter命名规范:都是以gte/set单词开头+要操作的属性名称 一.访问修饰符 Java中 ...

  9. Java---面向对象编程三大特征【封装、继承、多态】及super关键字、方法重写/覆盖(不定期更新补充)---B站韩顺平老师视频总结

    文章目录 三大特征 面向对象编程-封装 封装介绍 封装的理解和好处 封装的实现步骤(三步) 封装的简单案例 封装与构造器 封装的练习 面向对象编程-继承 为什么需要继承 继承基本介绍和示意图 继承的基 ...

最新文章

  1. 398. Random Pick Index - LeetCode
  2. 详细讲解-sphinx配置文件
  3. vtk鼠标不交互_vtk 各种不同的鼠标交互方式
  4. Leetcode 152.乘机最大子序列
  5. 程 序 测 试 规 范
  6. mysql infobright 缺点_infobright、mongodb优劣以及适用范围
  7. mysql查看当前数据库的连接信息_查看 mysql 数据库当前连接数
  8. oracle仲裁机制,仲裁逻辑设计要点
  9. 笔记本电脑如何保养_电脑温度一高就“翻脸”,电脑小白该如何解决?学会少花冤枉钱...
  10. JAVA基础知识总结17(网络编程)
  11. 2020CID|阿里云韩伟东:云原生底层系统思考
  12. 【数学建模】基于matlab GUI理发店排队模拟系统【含Matlab源码 1116期】
  13. 修改为支持多个层拖动模式可以制作为[许愿墙]
  14. google gflags 库完全使用
  15. 计算机成绩统计优秀率,高校学生考试成绩的数据分析模式与可视化研究
  16. 电子邮箱地址怎么写?
  17. Golang interface 全面介绍
  18. 条码打印机、色带、碳带的知识分享 | 条码打印机色带碳带的选购经验 | 鸿顺捷知识分享
  19. element-ui的el-menu路由模式下选中无颜色
  20. CSV文件如何使用EXCEL打开

热门文章

  1. 工业控制系统背景与概述
  2. 手机网页弹窗关不掉_弹窗广告关不掉?这5种方法永久关闭电脑弹窗广告!
  3. 企业网站百度排名突然丢失原因分析及解决方法-www.bjrp.com
  4. Arduino 交通灯
  5. 通话降噪蓝牙耳机哪个好?打电话降噪蓝牙耳机推荐
  6. 用C语言实现阶乘的递归
  7. 苹果CEO库克:苹果不会效仿Facebook推出加密货币,货币权应该留在国家手中
  8. 百兆宽带如何锦上添花?路由器、终端都有小“窍门”
  9. Linux下docker加速器的配置
  10. 如何在百度中脱颖而出——前端与SEO