[Java基础]java中this和super
一、this关键字
1.this概念
(参考:http://www.cnblogs.com/xdp-gacl/p/3636071.html)
this是一个引用,它指向自身的这个对象,它的内存分析如下图。假设我们在堆内存new了一个对象,在这个对象里假设有一个引用this,this指向这个对象自己,所以这就是this,这个new出来的对象名字是什么,我们不知道,不知道也没关系,因为这并不影响这个对象在内存里面的存在,这个对象只要在内存中存在,他就一定有一个引用this。

2.this在方法中的应用--区分成员变量与局部变量
一个方法要运行的时候,一个jvm会在栈内存开辟一片属于这个方法的空间让这个方法在这个内存空间运行。
如果在一个方法中访问了一个变量,该变量只存在成员变量的情况下,那么java编译器会在该变量的 前面添加this关键字。 如果存在同名成员变量与局部变量时,在方法内部默认是访问局部变量的数据,可以通过this关键字指定访问成员变量的数据,如下图,通过this将成员变量i和局部变量i分开。

3.this在构造函数中的应用--调用其他构造函数以及区分成员变量与局部变量
this关键字调用其他的构造函数时,this关键字必须要位于构造函数中 的第一个语句。
this关键字在构造函数中不能出现相互调用 的情况,因为是一个死循环。
public class ConstructFuction {
public ConstructFuction()
{
}
public ConstructFuction(int id)
{
this(); //调用无参数额构造方法
System.out.println(id);
}
public ConstructFuction(int id,int age)
{
this(id); //使用this调用其他构造函数
System.out.println(age);
}
public ConstructFuction(int id,int age,String name)
{
this(id,age);
System.out.println(name);
}
}
4.this作为方法的返回值--返回对象本身
class ReturnObjectSelf
{
public String name="Hello World";
public ReturnObjectSelf returnObject()
{
return this;
}
}
5.this在内部类的使用
this在内部类中代表内部类,在外部类中代表外部类。
内部类调用外部类的成员变量,即可以直接调用,也可以用 类名.this.成员变量。
内部类调用外部类的变量时,要区分成员变量和局部变量,有冲突时,局部变量直接调用,成员变量用 类名.this.成员变量
public class InnerClassThis {
public String outer="Hello Outer";
//内部类
public class InnerClassTest
{
public String inner="Hello Inner";
public void showInfo()
{
System.out.print(this.inner);//内部类调用内部类成员变量
System.out.print(outer); //内部类调用外部类的成员变量
System.out.print(InnerClassThis.this.outer);
}
}
public void partClass()
{
String outer = "Hello Outer Part";
class PartClassTest
{
public void showInfo()
{
System.out.println(outer); //内部类调用外部类局部变量
System.out.print(InnerClassThis.this.outer); //内部类调用外部类成员变量
}
}
PartClassTest pct = new PartClassTest();
pct.showInfo();
}
}
二、super关键字
super关键字代表了父类空间的引用。
super关键字的作用:
1) 子父类存在着同名的成员时,在子类中默认是访问子类的成员,可以通过super关键字指定访问父类的成员。
2) 创建子类对象时,默认会先调用父类无参的构造方法,可以通过super关键字指定调用父类的构造方法。
super关键字调用父类构造方法要注意的事项:
1) 如果在子类的构造方法上没有指定调用父类的构造方法,那么java编译器会在子类的构造方法上面加上super()语句。
2) super关键字调用父类的构造函数时,该语句必须要是子类构造函数中的第一个语句。
3) super与this关键字不能同时出现在同一个构造函数中调用其他的构造函数。因为两个语句都需要第一个语句。
super关键字与this关键字的区别:
1) 代表的事物不一致。
1. super关键字代表的是父类空间的引用。
2. this关键字代表的是所属函数的调用者对象。
2) 使用前提不一致。
1. super关键字必须要有继承关系才能使用。
2. this关键字不需要存在继承关系也可使用。
3) 调用构造函数的区别:
1. super关键字是调用父类的构造函数。
2. this关键字是调用本类的构造函数。
public class SuperSon extends SuperFather{
public static void main(String[] args) {
// TODO Auto-generated method stub
SuperSon ss = new SuperSon();
ss.overrideMethod();;
}
public SuperSon()
{
super(10,"dengsenlin");//调用父类指定的构造函数,必须放到构造函数的首位
}
@Override
public void overrideMethod()
{
super.overrideMethod(); //父类与子类具有相同的函数,通过super调用父类
System .out.println("I'm Son!");
}
}
class SuperFather{
//无参数构造函数,子类默认调用该构造函数
public SuperFather()
{
}
//第一个参数构造函数
public SuperFather(int age)
{
}
//第一个参数构造函数
public SuperFather(int age,String name)
{
}
public void overrideMethod()
{
System.out.println("I'm father");
}
}
[Java基础]java中this和super的更多相关文章
- Java基础(中)
面向对象基础 面向对象和面向过程的区别 两者的主要区别在于解决问题的方式不同: 面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题. 面向对象会先抽象出对象,然后用对象执行方法的方式 ...
- java基础---->java中正则表达式二
跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...
- Java基础学习中一些词语和语句的使用
在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看brea ...
- Java基础-Java中的堆内存和离堆内存机制
Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Java基础-Java中的内存分配与回收机制
Java基础-Java中的内存分配与回收机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二.
- Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock)
Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在学习Java的之前,你可能已经听说过读 ...
- Java基础-Java中的并法库之线程池技术
Java基础-Java中的并法库之线程池技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是线程池技术 二.
- Java基础-Java中23种设计模式之常用的设计模式
Java基础-Java中23种设计模式之常用的设计模式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.设计模式分类 设计模式是针对特定场景给出的专家级的解决方案.总的来说设 ...
- Java基础-JAVA中常见的数据结构介绍
Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...
- Java基础__Java中自定义集合类
Java基础__Java中集合类 传送门 自定义MyArrayList集合实现:增加数据.取数据.查看集合中数据个数方法 package com.Gary; public class MyArrayL ...
随机推荐
- Java基础知识系列——String
最近晚上没有什么事(主要是不加班有单身),就复习了一下Java的基础知识.我复习Java基础知识主要是依据Java API和The Java™ Tutorials. 今天是第一篇,复习了一下Strin ...
- AD账号创建日期、最近一次登录时间、最近一次重置密码时间查询
一:查询此AD域内所有用户的创建日期 Get-ADuser -filter * -Properties * | Select-Object Name,SID, Created,PasswordLas ...
- Android笔记:如何在Fragment里使用findViewById()方法?
在Activity中,可以直接用findViewById(int id),通过xml的id来找到对应的View. 查找官方的api,具体如下: https://developer.android.go ...
- 读《UNIX编程艺术》一感
我记得早在2006年的时候就开始频繁使用awk做文本处理方面的工作,07年的时候周围有人用perl,我还感到很不解,觉得写得很复杂,没有awk one liner 那么方便和神奇.一直在了解awk的具 ...
- 常用的PHP框架
ThinkPHP http://www.thinkphp.cn Yii http://www.yiichina.com laravel https://laravel ...
- 如何用java获得字符串的ASCII值
使用Integer.valueOf就可以直接将char类型的数据转为十进制数据表现形式. int value=Integer.valueOf('1');//49int value=Integer.va ...
- 16.10.16学到的JAVA知识
1. 每个字节就是八位,所以每个字节的取值范围是 -128~127,它可以保存一个英文字符,包括字母,数字和英文标点.而汉字的的数量很多,一个字节没法把所有的汉字表达出来,所以汉字就是用两个字节来存 ...
- JVM内存模型和性能优化
JVM内存模型优点 内置基于内存的并发模型: 多线程机制 同步锁Synchronization 大量线程安全型库包支持 基于内存的并发机制,粒度灵活控制,灵活度高于数据库锁. 多核并行计算模 ...
- MyISAM和InnoDB索引区别
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.下图是MyISAM索引的原理图: 图8 这里设表一共有三列,假设我们以Col1为主键,则图8是一个MyISAM表 ...
- Hibernate+jsp+struts+spring做增删该查,
同样还是web项目,这里只做了一张表,做一个测试,例子.主要是建Hibernate 的时候要非常注意,有时间了整理一下建Hiberbnate 的时候需要注意的事项 这里我是建了5个包,其实只要四个就好 ...