java的super_Java中this和super的用法总结

这几天看到类在继承时会用到this和super,这里就做了一点总结,与各位共同交流,有错误请各位指正~

this

this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。

this的用法在java中大体可以分为3种:

1.普通的直接引用

这种就不用讲了,this相当于是指向当前对象本身。

2.形参与成员名字重名,用this来区分:

class Person {

private int age = 10;

public Person(){

System.out.println("初始化年龄:"+age);

}

public int GetAge(int age){

this.age = age;

return this.age;

}

}

public class test1 {

public static void main(String[] args) {

Person Harry = new Person();

System.out.println("Harry's age is "+Harry.GetAge(12));

}

}

运行结果:

初始化年龄:10

Harry's age is 12

可以看到,这里age是GetAge成员方法的形参,this.age是Person类的成员变量。

3.引用构造函数

这个和super放在一起讲,见下面。

super

super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。

super也有三种用法:

1.普通的直接引用

与this类似,super相当于是指向当前对象的父类,这样就可以用super.xxx来引用父类的成员。

2.子类中的成员变量或方法与父类中的成员变量或方法同名

class Country {

String name;

void value() {

name = "China";

}

}

class City extends Country {

String name;

void value() {

name = "Shanghai";

super.value();//调用父类的方法

System.out.println(name);

System.out.println(super.name);

}

public static void main(String[] args) {

City c=new City();

c.value();

}

}

运行结果:

Shanghai

China

可以看到,这里既调用了父类的方法,也调用了父类的变量。若不调用父类方法value(),只调用父类变量name的话,则父类name值为默认值null。

3.引用构造函数

super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。

this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。

class Person {

public static void prt(String s) {

System.out.println(s);

}

Person() {

prt("父类·无参数构造方法: "+"A Person.");

}//构造方法(1)

Person(String name) {

prt("父类·含一个参数的构造方法: "+"A person's name is " + name);

}//构造方法(2)

}

public class Chinese extends Person {

Chinese() {

super(); // 调用父类构造方法(1)

prt("子类·调用父类”无参数构造方法“: "+"A chinese coder.");

}

Chinese(String name) {

super(name);// 调用父类具有相同形参的构造方法(2)

prt("子类·调用父类”含一个参数的构造方法“: "+"his name is " + name);

}

Chinese(String name, int age) {

this(name);// 调用具有相同形参的构造方法(3)

prt("子类:调用子类具有相同形参的构造方法:his age is " + age);

}

public static void main(String[] args) {

Chinese cn = new Chinese();

cn = new Chinese("codersai");

cn = new Chinese("codersai", 18);

}

}

运行结果:

父类·无参数构造方法: A Person.

子类·调用父类”无参数构造方法“: A chinese coder.

父类·含一个参数的构造方法: A person's name is codersai

子类·调用父类”含一个参数的构造方法“: his name is codersai

父类·含一个参数的构造方法: A person's name is codersai

子类·调用父类”含一个参数的构造方法“: his name is codersai

子类:调用子类具有相同形参的构造方法:his age is 18

从本例可以看到,可以用super和this分别调用父类的构造方法和本类中其他形式的构造方法。

例子中Chinese类第三种构造方法调用的是本类中第二种构造方法,而第二种构造方法是调用父类的,因此也要先调用父类的构造方法,再调用本类中第二种,最后是重写第三种构造方法。

super和this的异同:

super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)

this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)

super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名    super.成员函数据名(实参)

this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)

调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。

super()和this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。

super()和this()均需放在构造方法内第一行。

尽管可以用this调用一个构造器,但却不能调用两个。

this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。

this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。

从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。

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

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

相关文章

服务器具有挂起的重新启动_ESP8266与网络服务器实时通讯

背景知识视频教程Bootstrap 4布局:响应式单页设计​viadean.comNode.js,Express,MongoDB等:2020年完整的训练营 - 国外课栈​viadean.com高级Express - 国外课栈​viadean.com目前,所有已呈现的通信都是基于请求响应方…

java除号_Java的运算符

1.算数运算符 加(正号)  - 减(符号)  * 乘  / 除% 取模(取余)   自增  -- 自减号的几种作用:加法运算  表示为一个正数  还可以用来作字符串的拼接整数相除只能得到整数。如果想得到小数,必须把参与计算的数据变化为浮点类型的数据。自增和…

strace命令_在软件部署中使用 strace 进行调试

我最喜欢的用来解决“为什么这个软件无法在这台机器上运行?”这类问题的工具就是 strace。-- Simon Arneaud(作者)我的大部分工作都涉及到部署软件系统,这意味着我需要花费很多时间来解决以下问题:这个软件可以在原开发…

java 写文件filewriter_使用FileWriter写文件

package textMyself;//使用FileWriter写文件import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class text2 {public static void main(String[] args) {// TODO 自动生成的方法存根try {/** 先产…

procreate 笔刷_Procreate新手漫画入门:笔刷,图层,上色

上个月新入手了一个新的ipad,又打开了一种关于漫画的新的可能性~同时验证了那句话:对生活保持好奇,你将收获更多。于是就有一些喜欢画画的小伙伴有私信这样的漫画怎么画的?这个秘密工具就是:ipad ➕ Apple pencil ➕ a…

pycharm中python的默认安装路径_mac PyCharm添加Python解释器及添加package路径的方法...

一、背景PyCharm执行Python时,找不到自己安装的package,例如pandas、numpy、scipy、scikit等,在执行时报如下错误ImportError: No module named pandas:Traceback (most recent call last):File "", line 1, in File &q…

java kettle6_java 调用kettle 6.1 转换

有人用过java 调用kettle6.1 转换脚本吗? 我用同样的代码,可以执行kettle 4.1的脚本,可6.1始终不行? 是6.1 不支持了?还是写法变了?如下这段代码4.1可以,6.1就不行。求解!&…

transactional注解的使用_Java:Spring @Transactional工作原理

本文将深入研究Spring的事务管理。主要介绍Transactional在底层是如何工作的。之后的文章将介绍:propagation(事务传播)和isolation(隔离性)等属性的使用事务使用的陷阱有哪些以及如何避免JPA和事务管理很重要的一点是JPA本身并不提供任何类型的声明式事务管理。如果…

java 2d划线 刷子_月光软件站 - 编程文档 - Java - Java图形设计中,利用Bresenham算法实现直线线型,线宽的控制(NO 2D GRAPHICS)...

Java 2D Graphics提供了强大的画线功能,可以控制线型,线宽,刷子的形状等,但在JDK1.2以前,没有提供这样一个功能,为了保持与旧版JDK的相容,实现一个可控制线型,线宽的画直线方法还是…

python socketserver最大连接_大聊Python----SocketServer

什么是SocketServer?SocketServer的最主要的作用是实现并发处理,也就是可以多个用户同时上传和下载文件。socketserver模块简化了编写网络服务器的任务。socketserver一共有这么几种类型class socketserver.TCPServer(server_address, RequestHandlerClass, bind_an…

java 位运算符在实际开发中的用处_java 位运算 和实际应用

public class Test {public static void main(String[] args) {// 1、左移( <// 0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后&#xff0c;低位补0&#xff1a;//// 0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20System.out.println(5 <// 2、右…

python django开发工具_利用pyCharm编辑器创建Django项目开发环境-python开发工具第一篇...

【前置说明】1、django环境与python对应关系&#xff1a;Django versionPython versions1.112.7, 3.4, 3.5, 3.6, 3.7 (added in 1.11.17)2.03.4, 3.5, 3.6, 3.72.13.5, 3.6, 3.72.23.5, 3.6, 3.7, 3.8 (added in 2.2.8)3.03.6, 3.7, 3.8【正式进入部署开发环境之pyCharm】安装…

mock教程 java_java代码实现mock数据

废话不多说&#xff0c;直接上代码。1 /** 2 * 发get请求&#xff0c;获取文本 3 * 4 * param getUrl 5 * return 网页context 6 */ 7 public static String sendGetRequest(String getUrl) { 8 String result null; 9 CloseableHttpClient httpClient HttpClients.createDef…

system流怎么判断为空_并行流ParallelStream中隐藏的陷阱

点击上方蓝字 ↑↑ Throwable文摘关注公众号设置星标&#xff0c;不定时推送高质量原创文章关注前提这篇文章介绍一下日常开发中并行流ParallelStream中隐藏的陷阱&#xff0c;这个问题其实离我们很近&#xff0c;特别是喜欢使用JDK1.8的流式编程的伙伴&#xff0c;应该会深有感…

python脚本怎么打印日志_python 接口测试1 --如何创建和打印日志文件

python自带的logging实在是不好用&#xff0c;推荐使用logbook思路如下&#xff1a;1.创建path.py文件&#xff0c;获取工程根路径2.创建log.py文件&#xff0c;在工程根路径下创建日志文件(文件名称按日期命名)&#xff0c;并设置log输出等级3.执行测试用例&#xff0c;调用lo…

吸血鬼 java_吸血鬼数

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼代码:/** * 功能:找出四位数中由二位数相乘得出的吸血鬼数 * author wiley */public class Vampire { public static void main(String[] arg){ String[] ar_str1,ar_str2; int sum0; //双重循环穷举 for(int i10;i<100;i){ //j…

vfp操作excel排序_中招计算机信息技术考试训练|Excel操作题一|排序和筛选

Excel操作题&#xff08;一&#xff09;&#xff1a;进入本题工作目录&#xff0c;请完成以下操作。1、将单元格区域A1:F1合并后居中&#xff0c;字体格式设置为黑体、16号。2、将单元格区域A2:F2填充颜色改为橙色&#xff0c;A3:A7填充颜色改为黄色。3、用函数计算5个储蓄所的…

java 反射机制 视频_【视频笔记】Java反射机制笔记

Java 语言的反射机制在Java运行时环境中&#xff0c;对于任意一个类&#xff0c;可以知道这个类有哪些属性和方法。对于任意一个对象&#xff0c;可以调用它的任意一个方法。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。Java 反射…

算术溢出使用4字节值上的运算符_c语言程序设计的数据类型、运算符和表达式介绍...

数据类型 为什么在用计算机运算时,要指定数据的类型呢?在数学中,数值是不分类型的,数值的运算是绝对准确的,例如:1/3的值是0.333333(循环小数)。 而在计算机中,数据是存放在存储单元中的,它是具体存在的。而且,存储单元是由有限的字节构成的,每一个存储单元中存放数据…

java windows 下载_Windows环境下JDK的下载与安装

1.首先检查一下本机是否有安装java。按winR&#xff0c;在弹出窗口中输入cmd&#xff0c;按回车打开控制台在控制台中输入 java 并按回车&#xff0c;如果显示“java 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件“&#xff0c;则说明这台电脑还没安装java可…