【Java】this 与 super 关键字

目录

this 关键字基本使用

this关键字在继承中的使用

super关键字使用

super 和 this 的比较


this 关键字基本使用

  1. this 关键字可以用来访问本类的属性、方法、构造器
  2. this 用于区分当前类的属性和局部变量,this代表当前对象
  3. 访问成员方法的语法:this.方法名(参数列表);
  4. 访问构造器语法: this( 参数列表 ); 注意 只能在构造器中访问另外一个构造器 , 必须放在第一 条语句
  5. this 不能在类定义的外部使用,只能在类定义的方法中使用。
/**
 * this 基本使用
 */
public class This01 {
    public static void main(String[] args) {
        A a = new A();
        a.a1();
        a.a3();
    }
}

class A {

    String name = "龙部";

    //1.this 用于区分当前类的属性和局部变量,this代表当前对象
    public void a1() {
        String name = "狗屁";
        //name 就近原则 访问的是name = "狗屁"
        System.out.println("name=" + name);//输出 name=狗屁
        //this.name 精准定位 访问属性
        System.out.println("name=" + this.name);//输出 name=龙部
    }

    //2.访问成员方法的语法:this.方法名(参数列表);
    public void a2() {
        System.out.println("a1方法");
    }

    public void a3() {
        System.out.println("a2方法");
        a2();//第一种方法
        this.a2();//第二种方法
    }

    //3.访问构造器语法:this(参数列表);
    //注意只能在构造器中使用(即只能在构造器中访问另外一个构造器, 必须放在第一 条语句)
    public A() {
        this("少爷");//访问A(String name)的构造器
        System.out.println("A的构造器");

    }

    public A(String name) {
        System.out.println("A(String name)的构造器");
    }
    
}

this关键字在继承中的使用

/**
 * this关键字在继承中的使用
 */
public class This02 {
    public static void main(String[] args) {
        BB bb = new BB();
        bb.b2();
    }
}

class AA {

    String name = "少爷";
    int age = 20;
    String address = "12栋";
    private String hobby = "跑步";


    public void a1() {
        System.out.println("AA的 a1() 方法");
    }

    private void a2() {
        System.out.println("AA的 a2() 方法");
    }

}

class BB extends AA {

    String name = "狗屁";
    int age = 21;

    public void b1() {
        System.out.println("BB的 b1() 方法");
    }

    public void b2() {

        //访问属性的规则:
        //s1 和 this.s1 查找的规则是
        //(1) 先找本类,如果有,则调用
        //(2) 如果没有,则找父类(如果有,并可以调用,则调用)
        //(3) 如果父类没有,则继续找父类的父类,整个规则,就是一样的,直到 Object 类
        // 提示:如果查找属性的过程中,找到了,但是不能访问(private) , 则报错, cannot access
        // 如果查找属性的过程中,没有找到,则提示属性不存在

        System.out.println(name);//输出 狗屁 本类中有name属性
        System.out.println(this.name);//输出 狗屁  本类中有name属性

        // 本类中没有address属性 去父类中查找
        System.out.println(this.address);//输出 12栋

        // 属性 private 访问权限 编译报错
        //System.out.println(this.hobby);


        //调用方法的规则:
        //因为子类 BB 没有 temp 方法,因此我可以使用下面三种方式
        //找 temp 方法时(temp() 和 this.temp()),顺序是:
        // (1)先找本类,如果有,则调用
        // (2)如果没有,则找父类(如果有,并可以调用,则调用)
        // (3)如果父类没有,则继续找父类的父类,整个规则,就是一样的,直到 Object 类 顶级父类
        // 提示:如果查找方法的过程中,找到了,但是不能访问, 则报错, cannot access
        // 如果查找方法的过程中,没有找到,则提示方法不存在
        b1();//输出 BB的 b1() 方法
        this.b1();//输出 BB的 b1() 方法

        //本类中没有a1() 方法 去父类中查找
        a1();//输出 AA的 a1() 方法
        this.a1();//输出 AA的 a1() 方法

        //方法 private 访问权限 编译报错
        //this.a2();
    }

}

super关键字使用

  1. super 代表父类的引用,用于访问父类的属性、方法、构造器
  2. 访问父类的属性,但不能访问父类的private属性 super.属性名;
  3. 访问父类的方法,不能访问父类的private方法super.方法名(参数列表);
  4. 访问父类的构造器 super(参数列表);只能放在构造器的第一句,只能出现一句!
  5. 调用父类的构造器的好处(分工明确,父类属性由父类初始化,子类的属性由子类初始化)
  6. 当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super。如果没有重名使用super、this、直接访问是一样的效果!
/**
 * super 关键字使用
 *
 */
public class Super02 {
    public static void main(String[] args) {

        BB bb = new BB();
        bb.b1();
        bb.b2();
        bb.b3();
    }

}

class Base { //父类是 Object
    public int s5 = 999;
    public int age = 111;

    public void cal() {
        System.out.println("Base 类的 cal() 方法...");
    }

}

class AA extends Base {
    public int s1 = 100;//公开
    protected int s2 = 200;//保护
    int s3 = 300;//默认
    private int s4 = 400;//私有

    public AA() {//无参构造器
    }

    public AA(String name) {
    }

    public AA(String name, int age) {
    }

    public void test100() {//公开
        System.out.println("aa");
    }

    protected void test200() {//保护
    }

    void test300() {//默认
    }

    private void test400() {//私有
    }

    public void cal() {
        System.out.println("AA 类的 cal() 方法...");
    }

}

class BB extends AA {
    private int s1 = 888;

    //1. 访问父类的属性 , 但不能访问父类的 private 属性
    // 直接查找父类,即使本类中存在相同属性也会跳过直接查找父类
    public void b1() {
        //s1 属性本类中含有 但直接查找父类
        System.out.println(super.s1 + " " + super.s2 + " " + super.s3);
        //super.s4 访问不了 私有
    }


    //2. 访问父类的方法,不能访问父类的 private 方法 super.方法名(参数列表);
    // 直接查找父类,即使本类中存在相同方法也会跳过直接查找父类
    public void test100() {//公开
        System.out.println("bb");
    }

    public void b2() {
        super.test100();//输出 aa
        super.test200();
        super.test300();
        //super.test400();//不能访问父类 private 方法
    }


    //3. 访问父类的构造器 super(参数列表);
    //只能放在构造器的第一句,只能出现一句!
    public BB() {
        super("少爷");
        //super("龙部",22) 报错 虽然是调用不同构造器但是也只能出现一句
    }


    //4. 编写测试方法
    //super 的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用 super 去访问爷爷类的成员;
    // 如果多个基类(上级类)中都有同名的成员,使用 super 访问遵循就近原则。A->B->C
    public void b3() {
        System.out.println("super.s5=" + super.s5);
        super.cal();//输出 AA 类的 cal() 方法...
    }

    public void cal() {
        System.out.println("B 类的 cal() 方法...");
    }

}

super this 的比较

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/485650.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kruskal最小生成树【详细解释+动图图解】【sort中的cmp函数】 【例题:洛谷P3366 【模板】最小生成树】

文章目录 Kruskal算法简介Kruskal算法前置知识sort 中的cmp函数 算法思考样例详细示范与解释kruskal模版code↓ 例题:洛谷P3366 【模板】最小生成树code↓完结撒花QWQ Kruskal算法简介 K r u s k a l Kruskal Kruskal 是基于贪心算法的 M S T MST MST 算法&#xff…

Vue 实现带拖动功能的时间轴

1.效果图 2. 当使用timeline-slider-vue组件时,你可以设置以下属性: date:用于设置时间轴滑块的初始日期,格式通常为 YYYY-MM-DD。 mask:一个布尔值,用于控制是否显示背景遮罩。 markDate:一…

Verilog刷题笔记45

题目:Given the finite state machine circuit as shown, assume that the D flip-flops are initially reset to zero before the machine begins. Build this circuit. 解题: module top_module (input clk,input x,output z ); wire [2:0]size;dtou…

台灯学生用多少瓦的灯泡比较好?学生适用的五款护眼台灯推荐!

对于广大学生而言,选择一款合适的台灯灯泡瓦数至关重要。合适的瓦数不仅能够确保充足而均匀的照明,避免眼睛疲劳,还能在一定程度上节省能源。那么,台灯学生用多少瓦的灯泡比较好呢?今天就给大家科普一下,顺…

matlab实现遗传算法与蚁群算法

一、要求 1.利用matlab实现遗传算法和蚁群算法,解决相关问题 2.体会两种算法的具体作用 二、原理 (1)遗传算法: 不断循环,直到寻找出一个解 1. 检查每个染色体,看它解决问题的性能怎样,并…

C# for/foreach 循环

一个 for 循环是一个允许您编写一个执行特定次数的循环的重复控制结构。 语法 C# 中 for 循环的语法: for ( init; condition; increment ) {statement(s); } 下面是 for 循环的控制流: init 会首先被执行,且只会执行一次。这一步允许您声…

【协议-HTTPS】

https https是在http协议的基础上,添加了SSL/TLS握手以及数据加密传输,也属于应用层协议。 httpshttp加密认证完整性保护 https交互图: HTTPS的整体过程分为证书验证和数据传输阶段: ① 证书验证阶段 浏览器发起 HTTPS 请求 服务…

Verilog刷题笔记44

题目&#xff1a;Consider the n-bit shift register circuit shown below: 解题&#xff1a; module top_module (input clk,input w, R, E, L,output Q );always(posedge clk)beginif(L1)Q<R;elseQ<(E1)?w:Q;endendmodule结果正确&#xff1a; 注意点&#xff1a; …

Web实现名言生成器:JavaScript DOM基础与实例教程

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

iscsi网络协议(连接硬件设备)

iscsi概念 iscsi是一种互联网协议&#xff0c;用于将存储设备&#xff08;如硬盘驱动器或磁带驱动器&#xff09;通过网络连接到计算机。它是一种存储区域网络&#xff08;SAN&#xff09;技术&#xff0c;允许服务器通过网络连接到存储设备&#xff0c;就像它们是本地设备一样…

Godot 学习笔记(4):一切以场景为中心

文章目录 前言场景搭建新建子场景最简单的按钮事件 手动控制场景手动加载场景添加多个场景对象更快速的获取脚本对象 删除多个场景对象脚本命名的问题 总结 前言 Godot的场景是C#与Godot最后的中间连接。我们解决了场景的加载&#xff0c;我们基本可以保证C#和godot之间的彻底…

springcloud第4季 负载均衡的介绍3

一 loadbalance 1.1 负载均衡的介绍 使用注解loadbalance&#xff0c;是一个客户端的负载均衡器&#xff1b;通过之前已经从注册中心拉取缓存到本地的服务列表中&#xff0c;获取服务进行轮询负载请求服务列表中的数据。 轮询原理 1.2 loadbalance工作流程 loadBalance工作…

Uni-App电商模板,纯前端模板,可直接使用 实现全平台适配与高效功能

一、引言 随着移动互联网的快速发展&#xff0c;多平台应用开发已成为业界关注的焦点。Uni-App&#xff0c;作为一种前端框架&#xff0c;可以实现一套代码多端运行&#xff0c;大大提高了开发效率。本文将介绍如何使用Uni-App搭建一个电商模板&#xff0c;实现全平台适配与高…

WSL下Ubuntu+RTX4090安装CUDA+cuDnn+Pytorch

安装驱动 首先需要明确的是&#xff0c;在WSL下安装Ubuntu&#xff0c;如果要使用主机的GPU卡&#xff0c;只需要在主机Windows上安装驱动&#xff0c;Linux中不需要安装驱动&#xff0c;可以在Linux中使用nvidia-smi命令查看驱动版本。 安装CUDA 避坑注意事项&#xff1a;如…

机器学习(27)

文章目录 文献阅读1. 题目2. abstract3. 网络架构3.1 Theoretical Results 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 数据集4.3.2 参数设置 4.4 结论 三、实现GAN1. 任务要求2. 实验结果3.实验代码3.1数据准备3.2 模型构建3.3 展示函数3.4 训练过程 小结本周内…

循环队列、循环队列的基本操作

我要成为嵌入式高手之3月22日数据结构第五天&#xff01;&#xff01; ———————————————————————————— 顺序队列 存在问题&#xff1a;假溢出——解决办法&#xff1a;循环队列 空队列、满队列如何判断&#xff1f; 满队列&#xff1a;rear 1 …

一图详解 UVM phase机制

UVM验证环境构建时&#xff0c;引入 phase机制 &#xff0c;通过该机制可以很清晰的 将UVM仿真阶段层次化 。这里层次化&#xff0c;不仅仅是 各个phase的执行顺序 &#xff0c;还有 同一phase中的层次化组件之间phase也有先后关系 。 phase函数/任务执行顺序功能典型应用buil…

Java22已发布,支持SpringBoot3.3.0正式版

Java22已发布&#xff0c;支持SpringBoot3.3.0正式版 文章目录 Java22已发布&#xff0c;支持SpringBoot3.3.0正式版1. JDK22现已推出&#xff01;2. Java22的新功能1. 语言改进1. 语言预览 2. 库文件3. 性能4. 工具 3. 资源 Java 22现已发布 下一个Java版本提高了Java应用程序…

python绘图matplotlib——使用记录1

本博文来自于网络收集&#xff0c;如有侵权请联系删除 使用matplotlib绘图 1 常用函数汇总1.1 plot1.2 legend1.3 scatter1.4 xlim1.5 xlabel1.6 grid1.7 axhline1.7 axvspan1.8 annotate1.9 text1.10 title 2 常见图形绘制2.1 bar——柱状图2.2 barh——条形图2.3 hist——直…

计算机三级——网络技术(综合题第五题)

第一题 填写路由器RG的路由表项①至④。 目的网络&#xff0f;掩码长度输出端口输出端口172.19.63.192&#xff0f;30S0(直接连接)172.19.63.188&#xff0f;30S1(直接连接) 路由器RG的S0的IP地址是172.19.63.193&#xff0c;路由器RE的S0的IP地址是172.19.63.194。 【解析】…