[Java基础]java中this和super

时间:2023-02-13 16:31:30

一、this关键字

1.this概念

(参考:http://www.cnblogs.com/xdp-gacl/p/3636071.html

  this是一个引用,它指向自身的这个对象,它的内存分析如下图。假设我们在堆内存new了一个对象,在这个对象里假设有一个引用this,this指向这个对象自己,所以这就是this,这个new出来的对象名字是什么,我们不知道,不知道也没关系,因为这并不影响这个对象在内存里面的存在,这个对象只要在内存中存在,他就一定有一个引用this。

[Java基础]java中this和super

2.this在方法中的应用--区分成员变量与局部变量

   一个方法要运行的时候,一个jvm会在栈内存开辟一片属于这个方法的空间让这个方法在这个内存空间运行。

如果在一个方法中访问了一个变量,该变量只存在成员变量的情况下,那么java编译器会在该变量的 前面添加this关键字。 如果存在同名成员变量与局部变量时,在方法内部默认是访问局部变量的数据,可以通过this关键字指定访问成员变量的数据,如下图,通过this将成员变量i和局部变量i分开。

[Java基础]java中this和super

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的更多相关文章

  1. java基础---->java中正则表达式二

    跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...

  2. Java基础学习中一些词语和语句的使用

    在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看brea ...

  3. Java基础-Java中的堆内存和离堆内存机制

    Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  4. Java基础-Java中的内存分配与回收机制

    Java基础-Java中的内存分配与回收机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二.

  5. Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock)

    Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在学习Java的之前,你可能已经听说过读 ...

  6. Java基础-Java中的并法库之线程池技术

    Java基础-Java中的并法库之线程池技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是线程池技术 二.

  7. Java基础-Java中23种设计模式之常用的设计模式

    Java基础-Java中23种设计模式之常用的设计模式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.设计模式分类 设计模式是针对特定场景给出的专家级的解决方案.总的来说设 ...

  8. Java基础-JAVA中常见的数据结构介绍

    Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...

  9. Java基础__Java中自定义集合类

    Java基础__Java中集合类 传送门 自定义MyArrayList集合实现:增加数据.取数据.查看集合中数据个数方法 package com.Gary; public class MyArrayL ...

  10. Java基础-Java数据类型

    Java基础-Java数据类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据类型的作用 数据类型就是一组值,以及这一组值上的操作,数据类型可以决定数据的存储方式,取值范围 ...

随机推荐

  1. angular的跨域(angular百度下拉提示模拟)和angular选项卡

    1.angular中$http的服务: $http.get(url,{params:{参数}}).success().error(); $http.post(url,{params:{参数}}).su ...

  2. 算法导论_ch2

    Ch2算法基础 whowhoha@outlook.com 2.1 插入排序 输入:n个数的一个序列〈a1,a2,…,an〉. 输出:输入序列的一个排列〈a′1,a′2,…,a′n〉,满足a′1≤a′2 ...

  3. Ibatis中sqlmap参数map中还需要套list的情况如何写?

    原始需求: 有若干个参数,需要作为ibatis拼装sql的参数传入,但是有个参数的值比较特殊,是若干种枚举值.具体到这个case,就是有有限个namespace.我每次需要通过传入多个namespac ...

  4. Ubuntu Apache 伪静态配置 url重写 步骤

    1.加载rewrite模块sudo ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.l ...

  5. C++ 默认参数(转载)

    函数的默认参数值,即在定义参数的时候同时给它一个初始值.在调用函数的时候,我们可以省略含有默认值的参数.也就是说,如果用户指定了参数值,则使用用户指定的值,否则使用默认参数的值. void Func( ...

  6. bzoj4025 二分图 [分治,并查集]

    传送门 思路 是二分图的充要条件:图没有奇环. 考虑按时间分治,用可撤销并查集维护点到根的距离. 仍然可以用一个小trick把两点连边变成根连边,可以看这里. 每次连边时若不连通则连上,否则判一下有没 ...

  7. php$_SERVER['SCRIPT_NAME']和__FILE__的区别

    $_SERVER['SCRIPT_FILENAME']          -------> 当前执行程序的绝对路径及文件名__FILE__                             ...

  8. Writing Reentrant and Thread-Safe Code(译:编写可重入和线程安全的代码)

    Writing Reentrant and Thread-Safe Code 编写可重入和线程安全的代码 (http://www.ualberta.ca/dept/chemeng/AIX-43/sha ...

  9. centos7 部署 汉化版 gitlab 10.0.2

    更新说明: 20171009:增加3.5的内容 20171008:整理出gitlab部署手册 =============================================== gitla ...

  10. 从一道简单的dp题中学到的...

    今天想学点动态规划的知识,于是就看了杭电的课件,数塔问题啊,LCS啊都是比较经典的动规了,然后随便看了看就开始做课后练习题... HDOJ 1421 搬寝室 http://acm.hdu.edu.cn ...