关键字super和this的使用及区别

"this"作为一个特殊的关键字,它的规则如下:

1.可以表示构造函数传递。this(a,b)表示调用另外一个构造函数。这里面的this就是一个特殊语法,不是变量,没有什么类型。
2.可以在一个类的非static成员内部使用,表示当前这个对象。此时,this就是一个final的普通变量,它有静态类型,就是这个类本身;它有动态类型,就是当前这个对象的类型。你可以对它调用成员函数,把它传递给别的函数等。

"super"和"this"类似,但是也有不同的地方: 
1.表示调用父类的构造函数。也是一个特殊语法,不是变量,没有什么类型。

2.可以在一个类的非static成员内部使用。比如super.method()。
但是,注意,这个super.method()只是长得跟some_var.method()一样,一个语法糖而已。实质上,"super"根本不是一个变量。

使用中有一些需要注意:

1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位

class Base {Base() {System.out.println("Base");}
}public class Checket extends Base {Checket() {super();//调用父类的构造方法,一定要放在方法的首个语句System.out.println("Checket");}public static void main(String argv[]) {Checket c = new Checket();}
}

   如果想用super继承父类构造的方法,但是没有放在第一行的话,那么在super之前的语句,肯定是为了满足自己想要完成某些行为的语句,但是又用了super继承父类的构造方法。那么以前所做的修改就都回到以前了,就是说又成了父类的构造方法了。

 

2.在Java中,有时还会遇到子类中的成员变量或方法与父类中的成员变量或方法同名。因为子类中的成员变量或方法名优先级高,所以子类中的同名成员变量或方法就隐藏了父类的成员变量或方法,但是我们如果想要使用父类中的这个成员变量或方法,就需要用到super。

class Country {String name;void value() {name = "China";}
}class City extends Country {String name;void value() {name = "Hefei";super.value();//不调用此方法时,super.name返回的是父类的成员变量的值nullSystem.out.println(name);System.out.println(super.name);}public static void main(String[] args) {City c=new City();c.value();}
}

    为了在子类中引用父类中的成员变量name和方法value(),在代码中使用了super、super.name和super.value(),若不调用super.value()时,super.name返回父类成员变量默认值null,调用此方法时,super.value()方法把成员变量name赋值为China,再利用super.name调用父类的成员变量的值。

  

3.用super直接传递参数:

class Person {public static void prt(String s) {System.out.println(s);}Person() {prt("A Person.");}Person(String name) {prt("A person name is:" + name);}
}public class Chinese extends Person {Chinese() {super(); // 调用父类构造函数(1)prt("A chinese.");// (4)}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("kevin");cn = new Chinese("kevin", 22);}}

结果为:

A Person.

A chinese.

A person name is:kevin

his name is:kevin

A person name is:kevin

his name is:kevin

his age is:22

在这段程序中,this和super不再是像以前那样用“.”连接一个方法或成员,而是直接在其后跟上适当的参数,因此它的意义也就有了变化。super后加参数的是用来调用父类中具有相同形式的构造函数,如1和2处。this后加参数则调用的是当前具有相同参数的构造函数,如3处。当然,在Chinese的各个重载构造函数中,this和super在一般方法中的各种用法也仍可使用,比如4处,你可以将它替换为“this.prt”(因为它继承了父类中的那个方法)或者是“super.prt”(因为它是父类中的方法且可被子类访问),它照样可以正确运行。

4.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关键字。

 

转自 Java中super的几种用法并与this的区别

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

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

相关文章

家庭组计算机无法,【求助】Windows无法从该家庭组中删除你的计算机

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼echo 服务名称fdPHost,显示名称Function Discovery Provider Host,进程svchost.exeecho DEMAND或DISABLED或AUTO(手动、禁止、自动)sc config fdPHost start DEMANDecho stop立即停止start立即开启delete删除…

2013计算机系统导论,【精选】2013计算机系统导论-期末考卷-发布.pdf

【精选】2013计算机系统导论-期末考卷-发布北京大学信息科学技术学院考试试卷考试科目: 计算机系统导论 姓名: 学号:考试时间: 2014 年 1 月 7 日任课教师:题号 一 二 三 四 五 六 七 八 总分分数装订 阅卷人线内 北京大学考场纪律…

ckeditor+ckfinder+syntaxhighlighter编辑器

闲着没事将这三个组件合成在一起做个功能强大的编辑器,可以起到代码高亮的作用。 效果呢和博客园的编辑器功能差不多。功能可以直接定制,有需要的朋友可以下载一份看看,如果在使用中有什么问题可以和我交流,当然如果如果有更好的方…

需求管理

需求管理是内部集成和外部集成的结合点。 从企业内部管理来讲,如何不断提高制造柔性、缩短各类提前期,又是应对需求变化和提高响应速度的一个极其重要的因素。 现货生产MTS和定单组装ATO两类响应策略面对的问题,只要是对日用消费品和耐用消费…

个人计算机既pc机,个人计算机简称pc机这种计算机属于___pc机开机后计算机执行_个人计算机即pc机(14)...

[解析]略十四. 涉及到计算机的“键盘、鼠标、扫描仪、显示器、绘图仪”127、 保持微型计算机正常运行必不可少的输入输出设备是___C___。A.键盘和鼠标B.显示器和打印机C.键盘和显示器D.鼠标和扫描仪[解析]略128、 有关微型计算机键盘可能要问以下几个问题&#xff1…

shell脚本工具之控制结构

流程控制结构是程序语言中用于控制一段脚本执行流程的结构,shell提供了对多种流程控制结构的支持,包括条件结构,分支结构和循环结构.一.if语句格式1:if 表达式;then语句1else语句2fi格式2:if 表达式1;then语句1elseif 表达式2;thenelseif 表达式3语句2else语句3fi语句4fifi格式…

Android基础教程(三)之------ Activity 窗口切换

首先在layout里建2个xml文件 分别有按钮1和按钮2 JAVA代码: 1.public class Activity01 extends Activity{ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* 设置显示main.xml布局 */ setContentView(R.layout.main)…

哈夫曼树(最优树)及编码

1转载于:https://www.cnblogs.com/kt-xb/p/11110461.html

计算机注册表管理,学会注册表几个常用的设置,更好地管理自己的电脑!

注册表是Windows操作系统的核心数据库,存放着各种参数,直接控制着Windows的启动、硬件驱动程序的装载以及一些Windows应用程序的运行。从Microsoft Windows 95操作系统开始,注册表成为了Windows用户可以经常接触的内容,并在其后的…

纯数字加密和解密算法(原创)

自己最近无聊,写了一个简单的纯数字加密解密算法,对于一般 要求不高的加密环境,自认为是够用的吧,下载地址: http://download.csdn.net/detail/jine515073/8532099

nio~view buffer

此文介绍nio中ByteBuffer的特性之一,视图. *view buffer概念 ---把ByteBuffer转换为其他数据类型的buffer,比如char,long,float等,这样就方便处理连续的多字节情况 ---相关的api,形如as*Buffer,如LongBuffer asLongBuffer()之类 *功能特性(ByteBuffer注释中"views"条…

三星自带软件测试手机电池,10图带你领略三星全新电池测试全过程,亡羊补牢?...

原标题:10图带你领略三星全新电池测试全过程,亡羊补牢?在2016年Note 7起火爆炸事件后,三星意识到此前的测试没有注意到电池问题。为此,三星已经改变测试流程,实施八点安全检查制度,包括某些新测…

前端面试每日 3+1(每日三问)

https://github.com/haizlin/fe-interview转载于:https://www.cnblogs.com/buerBlog/p/11126713.html

Android自己主动化測试之Monkeyrunner用法及实例

眼下android SDK里自带的现成的測试工具有monkey 和 monkeyrunner两个。大家别看这俩兄弟名字相像,但事实上是完全然全不同的两个工具,应用在不同的測试领域。总的来说,monkey主要应用在压力和可靠性測试上,执行该命令能够随机地向…

Windows SC命令详解

SC命令详解(一个很有用的command)作为一个命令行工具,SC.exe可以用来测试你自己的系统,你可以设置一个批处理文件来使用不同的参数调用 SC.exe来控制服务。一.SC使用这样的语法:1. SC [Servername] command Servicename [Optionname Optionva…

计算机开机b00t设置,电脑boot启动项设置

打开电脑,按下【Delete】键进入BIOS界面,点击【startup(启动)】分别进入【primary Boot Sequence(主要)】、【Automatic Boot Sequence(自动)】和【Error Boot Sequence(错误)】三个页面,通过【】、【-】和【X】键进行项目挑选和排序&#xf…

python爬虫:其他操作

import time from selenium import webdriverbrowser webdriver.Chrome() browser.get("https://www.baidu.com/") browser.get("https://www.taobao.com/") browser.get("https://www.sina.com/")# 后退 browser.back()time.sleep(5)# 前进 b…

微软职位内部推荐-SDEII_ ECO

微软近期Open的职位: SDE II SDE II Organization Summary: Engineering, Customer interactions & Online (ECO) is looking for a great "Software Development Engineer" to join our team. Customer support is a strategic differentiator for Microsoft an…

XML随笔

读取Xml节点内容public void readXml(){ string str ""; XmlReader re XmlReader.Create("d://s.xml"); while (re.Read()) { if (re.NodeType XmlNodeType.Text) { …

一位良心发现的交易员自述:我们是怎么玩弄散户的

我 曾经在一家知名的公司做投资,从研究员做起,后来被抽调去做投资。上个月,我离开了这家公司,总结自己3年的投资经历,越发感觉到自己原来的研究一文不 值,也体会到中国股市中散户是多么可怜和悲哀。下面是我…