Java学习 (六) 面向对象--this、继承、方法重写、super

一、this 关键字

1、this  演示

vi Person.java

public class Person {String name;int age;//显示声明构造器public Person(String s , int i){name = s;age = i;}public void setAge(int age){age = age;}}

vi PersonTest.java

public class PersonTest {public static void main(String[] args) {Person p1  = new Person("jack",20);p1.setAge(11);System.out.println(p1.name + p1.age);}
}

我们上面写了一段代码,看起来没什么问题,但是是有坑的。  我们先执行一下test文件

jack20

可以看到和我们的预期的jack11是不相符的, p1.setAge(11) 没有生效,相关的逻辑如下

    public void setAge(int age){age = age;}

我们给形参定义的名称age,和成员属性是一样的,直接这么用谁也不知道那个是那个,在这里就可以通过this.age 来声明这个age是当前类下面的age,不是当前方法下的age

vi Person.java

public class Person {String name;int age;//显示声明构造器public Person(String s , int i){name = s;age = i;}public void setAge(int age){this.age = age;}}

2、多个构造器

有一种情况,我们可能根据传入的参数数量或者类型不同,会进行不同类型的形参接受来区分不同的后续逻辑

 vi Person.java

public class Person {String name;int age;//显示声明构造器public Person(){System.out.println("111");}public Person(String s ){System.out.println("111");name = s;}public Person(String s , int i){System.out.println("111");name = s;age = i;}public void setAge(int age){this.age = age;}}

vi PersonTest.java

public class PersonTest {public static void main(String[] args) {Person p1  = new Person();Person p2  = new Person("jack");Person p3  = new Person("jack",20);}
}

返回

111
111
111

我们上面定义了3个构造器,可以通过传参不同自动识别到不同逻辑的构造器中,像这种在构造器中重复的代码,也是可以通过this继承的

vi Person.java

public class Person {String name;int age;//显示声明构造器public Person(){System.out.println("111");}public Person(String s){this();   //添加 直接用this 会去找Person() 形参为空的构造器name = s;System.out.println("构造器2  (String s )");}public Person(String s , int i){this(s);   //添加 Person(s)  会找形参变量名称为s 的变量name = s;age = i;}public void setAge(int age){this.age = age;}}

我们在构造器2和构造器3中分别添加了一个this() 和this(s)的操作,他的含义是,第二个构造器会继承形参为空的同名构造器,继承的时候会在初始化时自动执行对应下面的属性, 第三个构造器会去继承同名构造器的形参为s的操作 ,同理,如果我们单独去调用构造器3,那么他会执行第二个构造器,第二个构造器又会继承形参为空的构造器,执行效果如下

vi PersonTest.java

public class PersonTest {public static void main(String[] args) {Person p3  = new Person("jack",20);}
}

3、this小结

二、继承

1、继承案例

vi Person.java

class Person {public String name;public int age;public String zex;}
class Student {public String name;public int age;public String zex;public String school;
}

 我上面写了两个类,但他们存在大量重复的属性,当遇到这种冗余代码,我们可以通过继承来简化代码,继承的关键字是extends,写在子类定义的后面,如下

vi Person.ava

class Person {public String name;public int age;public String zex;}
class Student extends Person {public String school;
}

 Student 类会继承Person的所有属性和方法,并且增加一个自身的school的属性

2、继承使用的逻辑

在java中,如果没有声明继承的类,那么会默认继承java.lang.object

三、方法的重写

我们上面说了继承,被继承的类称为父类,继承的类称为子类,当子类不想使用父类中继承的某个方法时,子类可以重写定义继承的方法

vi person.java

class Person {public String name;public int age;public String zex;//新增方法public Account sed(){System.out.println("123");return null;}
}
class Student extends Person {public String school;
}

vi PersonTest.java

public class PersonTest {public static void main(String[] args) {//调用子类Student调用继承的方法Student s3  = new Student();s3.sed();}
}

我们在上面继承的案例上添加了一个方法sed ,但是我们想要在通过子类进行调用的时候时候使用子类自己的方法, 实际操作就是在子类下定义一个相同名称的方法

vi Person.java

class Person {public String name;public int age;public String zex;//新增方法public Account sed(){System.out.println("123");return null;}
}
class Student extends Person {public String school;//新增子类独立方法public Account sed(){System.out.println("456");return null;}
}

重写和重载的区别

四、super 关键字

我们虽然在子类中定义了重写方法,但是我们依旧可以对父类中被重写的方法进行调用

 1、子类调用父类方法

说白了,现在就是想要在子类里面直接去调用父类的方法

vi Person.java

class Person {public String name;public int age;public String zex;//新增方法public Account sed(){System.out.println("123");return null;}
}
class Student extends Person {public String school;public Account sed(){System.out.println("456");return null;}public Account test1(){//子类调用父类方法super.sed();return null;}}

vi PersonTest.java

public class PersonTest {public static void main(String[] args) {Student s3  = new Student();s3.test1();}
}

上面我们是继承了父类的子类需要加super,如果不继承的话,子类能直接调用父类方法,sed(); 或者this.sed();   这里加不加this.都是调用父类的方法,因为子类没有重写

如果子类和父类中都有定义相同名称的变量,那么就近原则,子类变量优先,子类没有该变量,才会去找父类的值

2、super调用方法

3、调用父类的构造器

我们在子类的构造器中,使用super()的时候会去调用父类的空参构造器,如果要调用带参数的构造器,那么需要在super(参数),super()调用构造器,必须在第一行

4、super调用构造器的过程

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二十一章 函数(Python)

文章目录 前言一、定义函数二、函数参数三、参数类型四、函数返回值五、函数类型1、无参数,无返回值2、无参数,有返回值3、有参数,无返回值4、有参数,有返回值 六、函数的嵌套七、全局变量和局部变量1、局部变量2、全局变量 前言 …

了解 .NET 中的会话管理

在 Web 开发领域,跨多个请求维护状态是一个关键方面。HTTP 的无状态特性要求开发人员实现持久保存用户数据的机制。这就是会话发挥作用的地方。在本文中,我们将探讨什么是会话、它们在 .NET 中的工作方式,并提供实际示例来说明它们的用法。 …

set_source_files_properties QT_QML_SINGLETON_TYPE

目录 前言 QT_QML_SINGLETON_TYPE 属性 基本用法 示例 1. 创建一个基本的 CMake 项目 2. 编辑 CMakeLists.txt 3. 创建 main.cpp 4. 创建 MySingleton.qml 5. 创建 qml.qrc 6. 创建 main.qml 构建和运行项目 结论 前言 在使用 Qt 和 CMake 构建项目时,…

weapp.socket.io.js

!function(t,e){if(“object"typeof exports&&"object"typeof module)module.exportse();else if("function"typeof define&&define.amd)define([],e);else{var re();for(var n in r)(“object"typeof exports?exports:t)[n]r[…

探索未知:sklearn处理未知类别数据的策略

探索未知:sklearn处理未知类别数据的策略 在机器学习项目中,我们经常遇到带有未知类别的数据,这些数据可能因为各种因素而缺失或无法归类。有效地处理这些未知类别对于构建鲁棒的模型至关重要。本文将深入探讨sklearn如何处理带有未知类别的…

解决Java中的NoRouteToHostException异常的方法

解决Java中的NoRouteToHostException异常的方法 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在Java开发中,网络编程是非常重要的一部分&#x…

某腾X滑块验证码

⚠️前言⚠️ 本文仅用于学术交流。 学习探讨逆向知识,欢迎私信共享学习心得。 如有侵权,联系博主删除。 请勿商用,否则后果自负。 网址 aHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9wcm9kdWN0L2NhcHRjaGE= 1. 先整体分析一下 1_1. 验证码信息下发接口 cap_union_prehandle ua:…

JS基础与Chrome介绍

导言 在Web开发中后端负责程序架构和数据管理,前端负责页面展示和用户交互;在这种前后端分离的开发方式中,以接口为标准来进行联调整合,为了保证接口在调用时数据的安全性,也为了防止请求参数被篡改,大多数…

白骑士的Python教学基础篇 1.5 数据结构

系列目录​​​​​​​ 上一篇:白骑士的Python教学基础篇 1.4 函数与模块 数据结构是编程语言中用于存储和组织数据的基本构件。在Python中,常见的数据结构包括列表(List)、元组(Tuple)、字典&#xff08…

深入理解 “androidx.databinding.DataBindingUtil“ 细节和使用

介绍 数据绑定(Data Binding)是 Android 中的一个强大功能,它允许你使用声明性格式而不是编程方式将布局中的 UI 组件绑定到应用中的数据源。androidx.databinding.DataBindingUtil 类是一个工具类,它提供了用于处理数据绑定的方…

容器技术-docker5

一、docker-compose 常用命令和指令 1. 概要 默认的模板文件是 docker-compose.yml,其中定义的每个服务可以通过 image 指令指定镜像或 build 指令(需要 Dockerfile)来自动构建。 注意如果使用 build 指令,在 Dockerfile 中设置…

【面试干货】Static关键字的用法详解

【面试干货】Static关键字的用法详解 1、Static修饰内部类2、Static修饰方法3、Static修饰变量4、Static修饰代码块5、总结 💖The Begin💖点点关注,收藏不迷路💖 在Java编程语言中,static是一个关键字,它可…

MT19937 64bit 机器上的实现及原理解析

1, mt19937 实现源码 mt19937-64bit_ex.cpp /*References:T. Nishimura, Tables of 64-bit Mersenne TwistersACM Transactions on Modeling and Computer Simulation 10. (2000) 348--357.M. Matsumoto and T. Nishimura,Mersenne Twister: a 623-dimensionally e…

electron vite react 创建一个项目

要使用 Electron、Vite 和 React 创建一个项目,你可以按照以下步骤操作: 1. 安装 Node.js 和 npm 首先,确保你的计算机上安装了 Node.js 和 npm(Node Package Manager)。你可以从 Node.js 官网 下载并安装。 2. 初始化一个新的项目 在你的工作目录下,创建一个新的文件…

水果商城外卖微信小程序模板

手机微信水果外卖,水果电商,水果商城网页小程序模板。包含:主页、列表页、详情页、购物车、个人中心。 水果商城外卖小程序模板

[C++][设计模式][迭代器模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受 1.动机 在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素; 同时这种”透明遍历“也…

实现Java中的线程安全集合类

实现Java中的线程安全集合类 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 一、介绍 在多线程编程中,保证数据的线程安全性是至关重要的。Java提…

可燃气体报警器检测机构:严格遵守的安全标准

随着工业、商业和家庭领域对安全要求的不断提高,可燃气体报警器作为预防火灾和爆炸事故的重要设备,其性能稳定性和可靠性越来越受到关注。 可燃气体报警器检测机构应运而生,为确保这些设备的有效运行发挥着不可替代的作用。 接下来&#xf…

超强风冷制动电阻器-大功率对流冷却电阻器

风冷制动电阻 EAK 的风冷制动电阻器的制造功率范围为 5 kW 至 1200 kW。这些电阻器用于从螺旋桨、起重机、绞盘、顶部驱动器等倾倒多余的电力。 风冷电阻器是独立的单元,不需要进一步安装。该装置由内置风扇冷却。它也可以在没有风扇的情况下制作(非强…

qt-webassembly 实现服务器上的文件下载到本地(浏览器)

1. c 实现 qt 代码 #include <QtCore> #include <QtNetwork> #include <QGuiApplication> #include <emscripten.h> #include <emscripten/html5.h> #include <emscripten/val.h> #include <emscripten/bind.h>using namespace emsc…