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

一、this

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

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

1.普通的直接引用

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

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

packagecom.demo;public classPerson {private int age = 10;publicPerson(){

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

}public int GetAge(intage){this.age =age;return this.age;

}

}

packagecom.demo;public classTest1 {public static voidmain(String[] args) {

Person Harry= newPerson();

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

}

}

运行结果:

初始化年龄:10Harry's age is 12

3.引用构造函数

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

二、super

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

super也有三种用法:

1.普通的直接引用

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

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

packagecom.demo;public classCountry {

String name;voidvalue() {

name= "China";

}

}

packagecom.demo;public class City extendsCountry{

String name;voidvalue() {

name= "Shanghai";super.value(); //调用父类的方法

System.out.println(name);

System.out.println(super.name);

}public static voidmain(String[] args) {

City c= newCity();

c.value();

}

}

运行结果:

Shanghai

China

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

3.引用构造函数

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

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

packagecom.demo.test;public classPerson {public static voidprt(String s) {

System.out.println(s);

}

Person() {

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

}//构造方法(1)

Person(String name) {

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

}//构造方法(2)

}

packagecom.demo.test;public class Chinese extendsPerson {

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

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

}

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

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

}

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

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

}public static voidmain(String[] args) {

Chinese cn= newChinese();

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 is18

从本例可以看到,可以用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关键字。

一、this

Java关键字this只能用于方法体内。当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是this。因此,this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this。并且this只和特定的对象关联,而不和类关联,同一个类的不同对象有不同的this。下面给出一个使用this的综合实例,以便说明问题:

packagecom.demo.test;public classTestthis {private intnumber;privateString username;privateString password;private int x = 100;public Testthis(intn) {

number= n; //这个还可以写为: this.number=n;

}public Testthis(inti, String username, String password) {//成员变量和参数同名,成员变量被屏蔽,用"this.成员变量"的方式访问成员变量.

this.username =username;this.password =password;

}//默认不带参数的构造方法

publicTestthis() {this(0, "未知", "空"); //通过this调用另一个构造方法

}publicTestthis(String name) {this(1, name, "空"); //通过this调用另一个构造方法

}public static voidmain(String args[]) {

Testthis t1= newTestthis();

Testthis t2= new Testthis("游客");

t1.outinfo(t1);

t2.outinfo(t2);

}private voidoutinfo(Testthis t) {

System.out.println("-----------");

System.out.println(t.number);

System.out.println(t.username);

System.out.println(t.password);

f();//这个可以写为: this.f();

}private voidf() {//局部变量与成员变量同名,成员变量被屏蔽,用"this.成员变量"的方式访问成员变量.

intx;

x= this.x++;

System.out.println(x);

System.out.println(this.x);

}//返回当前实例的引用

privateTestthis getSelf() {return this;

}

}

运行结果如下:

-----------

0未知

空100

101

-----------

0游客

空100

101

看着上面的例子,说明在什么情况下需要用到this:

第一、通过this调用另一个构造方法,用法是this(参数列表),这个仅仅在类的构造方法中,别的地方不能这么用。

第二、函数参数或者函数中的局部变量和成员变量同名的情况下,成员变量被屏蔽,此时要访问成员变量则需要用“this.成员变量名”的方式来引用成员变量。当然,在没有同名的情况下,可以直接用成员变量的名字,而不用this,用了也不为错,呵呵。

第三、在函数中,需要引用该函数所属类的当前对象的时候,直接用this。其实这些用法总结都是从对“this是指向对象本身的一个指针”这句话的更深入的理解而来的,死记不然容易忘记而且容易搞错,要理解!

二、super

super关键字和this作用类似,使被屏蔽的成员变量或者成员方法变为可见,或者说用来引用被屏蔽的成员变量和成员方法。不过super是用在子类中,目的是访问直接父类中被屏蔽的成员,注意是直接父类(就是类之上最近的超类)。下面是一个综合运用super的例子,有两个类:一个Father类,一个Father类的子类Son,通过这两个类完全演示了super的用法,以下是代码:

packagecom.demo.test;public classFather {public String v = "Father";public String x = "输出了Father类的public成员变量x!!!";publicFather() {

System.out.println("Father构造方法被调用!");

}publicFather(String v) {this.v = "Father类的带参数构造方法!运行了.";

}public voidoutinfo() {

System.out.println("Father的outinfo方法被调用");

}public static voidmain(String[] args) {//TODO 自动生成方法存根

}

}

packagecom.demo.test;public class Son extendsFather {public String v = "Son";publicSon() {super(); //调用超类的构造方法,只能放到第一行.

System.out.println("Son无参数构造方法被调用!");//super();//错误的,必须放到构造方法体的最前面.

}publicSon(String str) {super(str);

System.out.println("Son带参数构造方法被调用!");

}//覆盖了超类成员方法outinfo()

public voidoutinfo() {

System.out.println("Son的outinfo()方法被调用");

}public voidtest() {

String v= "哈哈哈哈!"; //局部变量v覆盖了成员变量v和超类变量v

System.out.println("------1-----");

System.out.println(v);//输出局部变量v

System.out.println(this.v); //输出(子类)成员变量v

System.out.println(super.v); //输出超类成员变量v

System.out.println("------2-----");

System.out.println(x);//输出超类成员变量v,子类继承而来

System.out.println(super.x); //输出超类成员变量v

System.out.println("------3-----");

outinfo();//调用子类的outinfo()方法

this.outinfo(); //调用子类的outinfo()方法

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

}public static voidmain(String[] args) {newSon().test();

}

}

运行结果:

Father构造方法被调用!Son无参数构造方法被调用!

------1-----哈哈哈哈!Son

Father------2-----输出了Father类的public成员变量x!!!输出了Father类的public成员变量x!!!

------3-----Son的outinfo()方法被调用

Son的outinfo()方法被调用

Father的outinfo方法被调用

说明:此例子仅仅为了说明super的用法,实际在设计类的时候一般都尽可能私有(private)化。

通过上面的例子,下面总结一下super的用法:

第一、在子类构造方法中要调用父类的构造方法,用“super(参数列表)”的方式调用,参数不是必须的。同时还要注意的一点是:“super(参数列表)”这条语句只能用在子类构造方法体中的第一行。

第二、当子类方法中的局部变量或者子类的成员变量与父类成员变量同名时,也就是子类局部变量覆盖父类成员变量时,用“super.成员变量名”来引用父类成员变量。当然,如果父类的成员变量没有被覆盖,也可以用“super.成员变量名”来引用父类成员变量,不过这是不必要的。

第三、当子类的成员方法覆盖了父类的成员方法时,也就是子类和父类有完全相同的方法定义(但方法体可以不同),此时,用“super.方法名(参数列表)”的方式访问父类的方法。

this、super的用法也不过这些,只有理解了其中的原理,才不会跌入陷阱!

java中super和this_Java中this和super的用法总结相关推荐

  1. java界面布局的super_Java中的super

    java中的super()是什么 是不是什么类中的方法 在创建窗口中使用的super 1)super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句) 2)this(参数):调用本类 ...

  2. Java中的 <T extends Comparable<? super T>>

    Java 中类似 <T extends Comparable<? super T>> 这样的类型参数 (Type Parameter) 在 JDK 中或工具类方法中经常能看到. ...

  3. java中super可以重新父类么_Java Super 覆盖方法

    子类从父类中继承方法,有时候,子类需要修改父类中定义的方法的实现,这称作方法覆盖. 比如,GeometricObject类中的toString方法返回表示集合对象的字符串,这个方法就可以被覆盖,返回表 ...

  4. java中this_JAVA中this用法小结

    Java关键字this只能用于方法方法体内.当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是 this.因此,this只能在类中的非静态方法中使用,静 ...

  5. java中finaljava中this_Java中this,static,final,const用法详解

    一.this 用类名定义一个变量的时候,定义的应该只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法,那们类里面是够也应该有一个引用来访问自己的属性和方法纳?JAVA提供了一个很好的东西, ...

  6. java 静态方法重写_Java 类中可以覆盖静态方法吗?

    Java技术栈 www.javastack.cn 打开网站看更多优质文章 Java 类中可以覆盖静态方法吗? 不,你不能在Java中覆盖静态方法,但在子类中声明一个完全相同的方法不是编译时错误,这称为 ...

  7. java获取jsp页面参数_jsp页面中获取servlet请求中的参数方法总结

    jsp页面中获取servlet请求中的参数的办法详解 在JAVA WEB应用中,如何获取servlet请求中的参数,并传递给跳转的JSP页面?例如访问http://localhost:8088/bbs ...

  8. java可以多重继承吗_Java中的多重继承与组合vs继承

    java可以多重继承吗 有时我写了几篇有关Java继承,接口和组成的文章. 在这篇文章中,我们将研究多重继承,然后了解组成优于继承的好处. Java中的多重继承 多重继承是创建具有多个超类的单个类的能 ...

  9. java handler使用方法_Android中Handler的使用方法及实例(基础回顾)

    Handler使用例1 这个例子是最简单的介绍handler使用的,是将handler绑定到它所建立的线程中. 本次实验完成的功能是:单击Start按钮,程序会开始启动线程,并且线程程序完成后延时1s ...

  10. Java 8系列之Stream中万能的reduce

    Stream系列: Java 8系列之Stream的基本语法详解 Java 8系列之Stream的强大工具Collector Java 8系列之重构和定制收集器 Java 8系列之Stream中万能的 ...

最新文章

  1. 2020公文格式模板及范文_四六级考试答题顺序推荐 2020四级作文预测 四级作文范文模板...
  2. 动态获取的图片当做背景,而且图片是小图
  3. 先进先出算法_结构与算法(02):队列和栈结构
  4. cap理论具体含义_分布式事务的CAP理论
  5. 10-04 矩形覆盖(斐波那契数列的应用)
  6. 高并发之服务降级和服务熔断____服务降级、熔断、限流的区别
  7. html里面Meta标签的使用
  8. 【论文笔记】一种有效攻击BERT等模型的方法
  9. Android在WindowManagerService和ActivityManagerService中的Token
  10. [Python] zip
  11. springboot项目执行controller方法时进入慢的问题
  12. Emacs进阶之M-x创建别名
  13. Plants vs. Zombies(二分好题+思维)
  14. 各种开源协议介绍 BSD、Apache Licence、GPLv2 、v3 、LGPL、MIT
  15. mysql打开数据库的sql语句_数据库MySQL——SQL语句(命令)
  16. python视频教程全集免费-Python免费视频教程
  17. 驾考——科一,三笔记
  18. B站视频搬运项目,宅男必选!
  19. 公众号被关注后怎么发送多条自动回复消息?可以插入外链吗?
  20. mysql ibd文件删除_误删除MySQL数据库表的ibd文件怎么办

热门文章

  1. 用生成器做斐波那契数列
  2. 201521123014 《Java程序设计》第7周学习总结
  3. js对特殊字符转义、时间格式化、获取URL参数
  4. NOIP201103瑞士轮【B002】
  5. c#无标题窗口的拖动
  6. Grails 基础环境搭建及HelloWorld
  7. Mutes锁_递归锁_信号量semaphore
  8. RabbitMQ-理解消息通信-虚拟主机和隔离
  9. 【15】万魂杀服务器开发之原始NIO、Mina、Netty使用
  10. UI_storyboard实现页面回调