[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 ...
随机推荐
- grep使用多个查询条件--或
[root@mail ~]# grep 'usrquota\|grpquota' /etc/fstabLABEL=/1 / e ...
- DBCP数据源连接池实现原理分析
前些天在调试公司系统的时候发现这样的一个问题:mysql数据库服务停止一段时间后再次重启后吗,tomcat服务无法请求数据库服务,调试了半天对这个问题进行定位解决,期间也搞了很多有关mysql数据库的 ...
- JDBC获取sql server存储过程查询结果集(没有出参)
对于一些较为复杂的统计条件查询,可以通过存储过程来实现,既可以提高效率,减少网络流量,也可以避免sql语句耦合在代码中.但是存储过程返回的结果集如何获取(类似表数据),却着实让我费劲心力. 如下: C ...
- 很多事情就像看A片,看的人觉得很爽,做的人未必。
http://m.jingdianju.com/wzgs/shenghuo/201307185135.html 转载自: 从这个角度上来说,我不太赞成过于关注第一份工作的薪水,更没有必要攀比第一份工作 ...
- Android开发学习---template requires a minimum SDK version of at least 7,build target API version of 14
adt 22.6.3的bug 当adt更新到22.6.3,其编辑器中最低支持api7,即android 2.1,这里可能是google故意这么做的,也可能是其bug.其target sdk 和comp ...
- 查看oracle表中列的数据类型
一. SQLPLUS中,直接用 DESC[ribe] tablename 即可. 二.在外部应用程序调用查看ORACLE中的表结构时,只能用下面的语句代替: 1.看字段名与数据类型 select * ...
- 使用javascript实现贪吃蛇游戏
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- PowerShell全自动分配CPU
代码 $pro = Get-Process foreach ($n in $pro){ if($n.ProcessorAffinity -ne 255){ #continue } if($n.Id - ...
- 遇到IIS7配置PHP出现403和404错误的解决办法
服务器要配置PHP,总是出现403错误.服务器是新装的,操作系统是windows server 2008 R2,装的IIS7. IIS里PHP和本地服务器对比了好几遍,都没到出错的原因,后来通过cmd ...
- sql 将查询结果为多行一列合并为一行一列
使用sql stuff函数 /* stuff(param1, startIndex, length, param2)说明:将param1中自startIndex(SQL中都是从1开始, ...