This和Super关键字的对比
this和Super关键字
- this和Super关键字的对比
- Super关键字的用法如下:
- 1. super关键字代表了父类空间的引用;
- 2. super关键字的作用:
- 3. super关键字调用父类构造方法要注意的事项:
- this关键字的用法如下:
- 1.了解没有 this 关键字的问题
- 2. 不需要 this 关键字的程序示例
- 3. this:调用当前类方法
- 3. this():调用当前类的构造函数
- 4. 使用this()构造函数调用
- 4. this:作为参数传递给方法
- 5. this:在构造函数调用中作为参数传递
- 6. this关键字用来返回当前类的实例
- 7. 验证 this 关键字
this和Super关键字的对比
- | this | super() |
---|---|---|
概念 | 访问本类实列属性和方法 | 有子类访问父类中的实列属性和方法 |
查找范围 | 先找本类,找不到再找父类 | 找父类 |
各异功能 | 单独使用时,表示当前对象 | 在子类重写父类方法时,访问父类同名方法 |
相同点 | 1.都是关键字,起指代作用2.在构造方法中必须出现在第一行 |
Super关键字的用法如下:
1. super关键字代表了父类空间的引用;
2. super关键字的作用:
(1) 子父类存在着同名的成员(包括变量和方法)时,在子类中默认是访问子类的成员,可以通过super关键字指定访问父类的成员;
(2) 创建子类对象时,默认会先调用父类无参的构造方法,可以通过super关键字指定调用父类的构造方法。
(1) 如果在子类的构造方法上没有指定调用父类的构造方法,那么java编译器会在子类的构造方法内加上super()语句。
(2) super关键字调用父类的构造函数时,该语句必须要是子类构造函数中的第一个语句。
(3) super与this关键字不能同时出现在同一个构造函数中调用其他的构造函数。因为两个语句都需要第一个语句。
(1) 代表的事物不一致。
① super关键字代表的是父类空间的引用。(并不能代表对象,只是代表一个对象中的一块内存而已)
② this关键字代表的是所属函数的调用者对象。
(2) 使用前提不一致。
① super关键字必须要有继承关系才能使用。
② this关键字不需要存在继承关系也可使用。
(3) 调用构造函数的区别:
① super关键字是调用父类的构造函数。
② this关键字是调用本类的构造函数。
3. super关键字调用父类构造方法要注意的事项:
注意:是两个关键字不能同时出现在同一个构造函数中去调用其他的构造函数,里面还是可以写this.num = num。并不是说不能出现this。
this关键字的用法如下:
- this关键字可用来引用当前类的实例变量。
- this关键字可用于调用当前类方法(隐式)。
- this()可以用来调用当前类的构造函数。
- this关键字可作为调用方法中的参数传递。
- this关键字可作为参数在构造函数调用中传递。
- this关键字可用于从方法返回当前类的实例。
建议:如果你是java初学者,只学习 this 关键字的前三个用法就可以了。
- this:引用当前类的实例变量 this关键字可以用来引用当前类的实例变量。如果实例变量和参数之间存在歧义,则 this 关键字可用于明确地指定类变量以解决歧义问题。
1.了解没有 this 关键字的问题
下面先来理解一个不使用 this 关键字的示例:
class Student {int rollno;String name;float fee;Student(int rollno, String name, float fee) {rollno = rollno;name = name;fee = fee;}void display() {System.out.println(rollno + " " + name + " " + fee);}
}
class TestThis1 {public static void main(String args[]) {Student s1 = new Student(111, "ankit", 5000f);Student s2 = new Student(112, "sumit", 6000f);s1.display();s2.display();}
}
执行上面代码输出结果如下 -
0 null 0.0
0 null 0.0
在上面的例子中,参数(形式参数)和实例变量(rollno和name)是相同的。 所以要使用this关键字来区分局部变量和实例变量。
使用 this 关键字解决了上面的问题
class Student {int rollno;String name;float fee;Student(int rollno, String name, float fee) {this.rollno = rollno;this.name = name;this.fee = fee;}void display() {System.out.println(rollno + " " + name + " " + fee);}
}
class TestThis2 {public static void main(String args[]) {Student s1 = new Student(111, "ankit", 5000f);Student s2 = new Student(112, "sumit", 6000f);s1.display();s2.display();}
}
执行上面代码输出结果如下 -
111 ankit 5000
112 sumit 6000
如果局部变量(形式参数)和实例变量不同,则不需要像下面的程序一样使用this关键字:
2. 不需要 this 关键字的程序示例
class Student {int rollno;String name;float fee;Student(int r, String n, float f) {rollno = r;name = n;fee = f;}void display() {System.out.println(rollno + " " + name + " " + fee);}
}class TestThis3 {public static void main(String args[]) {Student s1 = new Student(111, "ankit", 5000f);Student s2 = new Student(112, "sumit", 6000f);s1.display();s2.display();}
}
执行上面代码输出结果如下 -
111 ankit 5000
112 sumit 6000
对变量使用有意义的名称是一种好的编程习惯。所以使用相同名称的实例变量和参数,并且总是使用this关键字。
3. this:调用当前类方法
可以使用this关键字调用当前类的方法。如果不使用this关键字,编译器会在调用方法时自动添加此 this 关键字。我们来看看这个例子。
执行上面代码输出结果如下 -
hello n
hello m
3. this():调用当前类的构造函数
this()构造函数调用可以用来调用当前类的构造函数。 它用于重用构造函数。 换句话说,它用于构造函数链接。
从参数化构造函数调用默认构造函数:
class A {A() {System.out.println("hello a");}A(int x) {this();System.out.println(x);}
}class TestThis5 {public static void main(String args[]) {A a = new A(10);}
}
执行上面代码输出结果如下 -
hello a
10
从默认构造函数调用参数化构造函数:
class A {A() {this(5);System.out.println("hello a");}A(int x) {System.out.println(x);}
}class TestThis6 {public static void main(String args[]) {A a = new A();}
}
执行上面代码输出结果如下 -
5
hello a
4. 使用this()构造函数调用
this()构造函数调用用于从构造函数重用构造函数。 它维护构造函数之间的链,即它用于构造函数链接。看看下面给出的示例,显示this关键字的实际使用。
class Student {int rollno;String name, course;float fee;Student(int rollno, String name, String course) {this.rollno = rollno;this.name = name;this.course = course;}Student(int rollno, String name, String course, float fee) {this(rollno, name, course);// reusing constructorthis.fee = fee;}void display() {System.out.println(rollno + " " + name + " " + course + " " + fee);}
}class TestThis7 {public static void main(String args[]) {Student s1 = new Student(111, "ankit", "java");Student s2 = new Student(112, "sumit", "java", 6000f);s1.display();s2.display();}
}
执行上面代码输出结果如下 -
111 ankit java null
112 sumit java 6000
注意:调用this()必须是构造函数中的第一个语句。
下面示例为不把 this() 语句放在第一行,因此编译不通过。
class Student {int rollno;String name, course;float fee;Student(int rollno, String name, String course) {this.rollno = rollno;this.name = name;this.course = course;}Student(int rollno, String name, String course, float fee) {this.fee = fee;this(rollno, name, course);// C.T.Error}void display() {System.out.println(rollno + " " + name + " " + course + " " + fee);}
}class TestThis8 {public static void main(String args[]) {Student s1 = new Student(111, "ankit", "java");Student s2 = new Student(112, "sumit", "java", 6000f);s1.display();s2.display();}
}
执行上面代码输出结果如下 -
Compile Time Error: Call to this must be first statement in constructor
4. this:作为参数传递给方法
this关键字也可以作为方法中的参数传递。 它主要用于事件处理。 看看下面的一个例子:
class S2 {void m(S2 obj) {System.out.println("method is invoked");}void p() {m(this);}public static void main(String args[]) {S2 s1 = new S2();s1.p();}}
执行上面代码输出结果如下 -
method is invoked
这个应用程序可以作为参数传递:
在事件处理(或)的情况下,必须提供一个类的引用到另一个。 它用于在多个方法中重用一个对象。
5. this:在构造函数调用中作为参数传递
也可以在构造函数中传递this关键字。 如果必须在多个类中使用一个对象,可以使用这种方式。 看看下面的一个例子:
class B {A4 obj;B(A4 obj) {this.obj = obj;}void display() {System.out.println(obj.data);// using data member of A4 class}
}
class A4 {int data = 10;A4() {B b = new B(this);b.display();}public static void main(String args[]) {A4 a = new A4();}
}
执行上面代码输出结果如下 -
10
6. this关键字用来返回当前类的实例
可以从方法中 this 关键字作为语句返回。 在这种情况下,方法的返回类型必须是类类型(非原始)。 看看下面的一个例子:
作为语句返回的语法
return_type method_name(){ return this;
}
从方法中返回为语句的 this 关键字的示例
class A {A getA() {return this;}void msg() {System.out.println("Hello java");}
}class Test1 {public static void main(String args[]) {new A().getA().msg();}
}
执行上面代码输出结果如下 -
Hello java
7. 验证 this 关键字
现在来验证 this 关键字引用当前类的实例变量。 在这个程序中将打印参考变量,这两个变量的输出是相同的。
class A5 {void m() {System.out.println(this);// prints same reference ID}public static void main(String args[]) {A5 obj = new A5();System.out.println(obj);// prints the reference IDobj.m();}
}
执行上面代码输出结果如下 -
A5@22b3ea59
A5@22b3ea59
相关文章:

SQL Server 2005下的分页SQL
其实基本上有三种方法:1、使用SQL Server 2005中新增的ROW_NUMBER几种写法分别如下: 1SELECTTOP20*FROM(SELECT2ROW_NUMBER() OVER(ORDERBYNamec) ASRowNumber,3*4FROM5dbo.mem_member) _myResults6WHERE7RowNumber >1000081SELECT*FROM(SELECT2ROW_N…

Oozie 配合 sqoop hive 实现数据分析输出到 mysql
文件/RDBMS -> flume/sqoop -> HDFS -> Hive -> HDFS -> Sqoop -> RDBMS 其中,本文实现了 使用 sqoop 从 RDBMS 中读取数据(非Oozie实现,具体错误将在本文最后说明)从 Hive 处理数据存储到 HDFS使用 sqoop 将 HDFS 存储到 RDBMS 中 1.…

关于eclipse的注释和反注释的快捷键
使用eclipse那么久了额,对注释和反注释的快捷键一直很模糊,现在记下来,方便查看。 注释和反注释有两种方式。如对下面这段代码片段(①)进行注释: private String value; private String count; public voi…

DNN和IBatis.Net几乎同时发布新版本
DotNetNuke发布了最新的版本4.5.0,确实让人期待了很久,据说这个版本在性能上有很大的提升。 IBatis.NET几乎在同一时间也发布了新版本DataMapper 1.6.1,也有不少的改进。 项目中使用到的这两个东西几乎同时发布新版本,振奋人心啊&…

Unity 2D物体移动
一,设置 二,脚本 1,PlayerController using System.Collections; using System.Collections.Generic; using UnityEngine;public class PlayerController : MonoBehaviour {private Rigidbody2D m_rg;public float MoveSpeed;public float J…

朱敏:40岁创业如何成就绝代明星?(五)
来源 中国企业家 东方元素是网讯内涵里不可忽视的一部分 如果有机会拜访网讯的美国总部,你会发现这是 一家带着醒目美国特色IT公司,很难说出它与其他 硅谷公司的不同。但在你视野所不能及的地方,朱敏 与苏布拉在驾驭它的方式中输入…

print、printf、println在Java中的使用
print、printf、println在Java中的使用 文章目录print、printf、println在Java中的使用一、println在JAVA中常常使用System.out.pirntf();的输出格式。二、print在JAVA中常常使用System.out.pirnt();的输出格式。三、printf在JAVA中常常使用System.out.printf();的格…

(转) SpringBoot非官方教程 | 第二篇:Spring Boot配置文件详解
springboot采纳了建立生产就绪spring应用程序的观点。 Spring Boot优先于配置的惯例,旨在让您尽快启动和运行。在一般情况下,我们不需要做太多的配置就能够让spring boot正常运行。在一些特殊的情况下,我们需要做修改一些配置,或者…

iexpress全力打造“免检”***
IExpress小档案出身:Microsoft功能:专用于制作各种 CAB 压缩与自解压缩包的工具。由于是Windows自带的程序,所以制作出来的安装包具有很好的兼容性。它可以帮助***传播者制造不被杀毒软件查杀的自解压包,而且一般情况下还可伪装成某个系统软件的补丁(如I…

java 稀疏数组和二维数组转换,并保存稀疏数组到文件后可以读取
稀疏数组和二维数组转换 稀疏数组:当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组 稀疏数组的处理方法: 记录数组一共有多少行,有多少个不同的值把具有不同值得元素的行列及值记录在…

springboot redis配置
1、引入maven依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2、redis连接配置 spring:redis:host: 10.220.1.41port: 6379timeout: 10000passwor…

C# 根据节点索引访问XML配置文件
查了一些,都是根据XML属性来访问指定节点,我这想根据节点索引来访问XML 首先上XML样式 1 <?xml version"1.0" encoding"utf-8" ?> 2 <FeatureClasses> 3 <FeatureClass name "t_room"></Feat…

ASP.NET DEMO 14: 如何在 GridView/DataGrid 模板列中使用自动回发的 CheckBox/DropDownList
有时候希望在 GridView 模板中使用自动回发的 CheckBox (autopostbacktrue) ,但是 CheckBox 没有 CommandName 属性,因此也就无法在 GridView.RowCommand 事件中处理,并且如何获取当前 GridView 行信息呢?我们可以选择…

BI.寒号鸟请吃烧烤/意外入手“speed- dear friends vol.1”/入手“鲍家街43号”/我爱红红/我爱红红...
先说,昨天下午,在逛完西北政法的乐图后,辗转到了高新区,见到了在经典论坛认识的热情的热心的热烈的寒号鸟兄弟,而notus本人则感动的热泪盈眶,想不到在遥远的西安,都有人惦记着我 T_T附上我们的合…

数据结构----单链表增删改查
单链表的增删改查 一、链表(Linked List) 链表是有序列表,以节点的方式来存储的,链式存储;每个节点包含data域,next域:指向下一节点;链表的各个节点不一定是连续存储;链…

Using NUnit with Visual Studio 2005 Express Editions
允许通过Build Toolbar选择"Debug" or "Relese"设置"工具" -> "选项..." -> 选择"显示所有设置" -> "项目和解决方案" ->选择"显示高级生成配置" 在VS2k5 Express工程中使用NUnit-GUI测试&…

代理上网环境下配置TortoiseCVS
以NASA Wind World为例,SF上的提示如下: http://sourceforge.net/cvs/?group_id69528 Anonymous CVS Access This projects SourceForge.net CVS repository can be checked out through anonymous (pserver) CVS with the following instruction set.…

ucos-iii串口用信号量及环形队列中断发送,用内建消息队列中断接收
串口发送部分代码: //通过信号量的方法发送数据 void usart1SendData(CPU_INT08U ch) {OS_ERR err;CPU_INT08U isTheFirstCh;OSSemPend(&Usart1Sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);//阻塞型等待串口发送资源OSSemPend(&Usart1TxBufSem, 0, OS_O…

几款自用的IDEA高效插件
idea几款自用的高效小插件1、CodeGlance2、Translation3、Rainbow Brackets4、Statistic5、Markdown Navigator6、MarkDown Navigator1、CodeGlance CodeGlance是一款非常好用的代码地图插件,可以在代码编辑区的右侧生成一个竖向可拖动的代码缩略区,可以…

CSS中position属性( absolute | relative | static | fixed )详解
我们先来看看CSS3 Api中对position属性的相关定义: static:无特殊定位,对象遵循正常文档流。top,right,bottom,left等属性不会被应用。 relative:对象遵循正常文档流,但将依据top&am…

ASP.NET 2.0 ajax中gridView的刷新问题!
我是一个经常使用ASP.NET2.0的开发人员,最近看了ajax课程,也想使用一下Ajax这个强大的技术,我就使用了,在一个UpdatePanel中放入了一个gridView,果然能达我的满意效果,设置了gridView中的分页,相应的代码我都已经写好了.唯一的问题是当我点击了第二页的时候,我再点击刷新,当前页…

心灵小栈: 镌刻在地下500米的母爱
这位母亲叫赵平饺,今年48岁。谁能想到,在不见天日的煤井深处,她已经弓着脊梁爬行了13 年。1993年,赵平姣的丈夫陈达初在井下作业时被矿车压断了右手的三根手指。此后他只能在井上干轻活,收入少了一大截。为了供女儿陈娟…

js学习总结----crm客户管理系统之项目开发流程和api接口文档
CRM ->客户管理系统 CMS ->内容发布管理系统 ERP ->企业战略信息管理系统 OA -> 企业办公管理系统 产品 / UI设计:需求分析,产品定位,市场调查...按照产品的规划设计出对应的效果图(PSD->photoshop) 前端开发工程师 API接口文…

数据结构--数组队列的实现
数据结构--数组模拟队列1. 说明2. 实现代码1. 数组队列类2.数组队列测试类3.代码运行结果3.完整代码1. 说明 队列是一个有序列表,可以用数组或者链表来实现。 遵循先入先出(FIFO)的原则,即先存入列的数据,会被先取出&…

DIV+CSS一行两列布局
实现效果: main 我是包在外面的div col1 我是第一列col2 我是第二列clear-float;我用来清除浮动(清除float)以下是说明:CSS代码:.main{width:800px;/* 总的宽度 */ background:red; } .main .col1{ float:left;/* 这个…

编程上标和下标使用方法
1.问题:写代码要求显示平方、立方、化学符号等等完全写不出来,Word写出来复制出来也不管用 2.办法:Unicode下标和上标 3.举例:string.Format("{0} km\xB2",1000),单位是平方千米&…

上周新闻回顾:微软补丁个个紧急 奥运网络百花齐放
也许是美国不是黄金周的原因,五一刚过,直接来自国外的新产品发布等IT新闻就源源不断涌来,倒是国内的新闻发布不是非常多。不过,微软的5月安全补丁如期发布,还是值得大家关注的。此外,关于2008年奥运会网络建…

rest-framework之解析器
rest-framework之解析器 本文目录 一 解析器的作用二 全局使用解析器三 局部使用解析器四 源码分析回到目录一 解析器的作用 根据请求头 content-type 选择对应的解析器对请求体内容进行处理。 有application/json,x-www-form-urlencoded,form-data等格式…

httpd常用配置
author:JevonWei版权声明:原创作品 检查配置文件时,如下提示,则因为没有server的服务名称导致,故设置网站的服务server名称,若没有设置web服务名,主默认解析系统主机名(添加主机名解析) [rootda…

[导入]C#中实现Socket端口复用
一、什么是端口复用: 因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限之分。这种多重绑定便称之为端口复用。 二、…