在我们讲构造函数的时候,我们知道,如果同时在java的堆内存当中,同时存在好几个刚进内存,但是又没来得及初始化的同一个类的对象。在这种情况下,那么如何去区分栈内存当中的构造函数是属于那个对象的呢,其实从底层上来讲的话,JVM已经为我们分好了,然后给了我们一个this,这个this是一个关键字,也是区分调用该构造函数的时候,此时的构造函数的所属对象是谁。

示例:

class ThisDemo
{ int num; String name; ThisDemo(int n)
{ num = n; } ThisDemo(String s)
{ name = s; } ThisDemo(String s,int n)
{ name = s;
num = n; } void sayDemo()
{ System.out.println(num+"----"+name); } } class ThisDemoR
{ public static void main(String[] args) { ThisDemo ts = new ThisDemo(10);
ThisDemo ts2 = new ThisDemo(10);
ts.sayDemo(); } }

  

这个就作为我们讲解this的基本代码。

但是如果我们对第二个构造函数稍做修改的话,比如:

	ThisDemo(String name)
{ name = s; }

  我们改成这个样子,那么调用这个构造函数的时候会发生什么呢?我们用一个内存图来描述下:

这个时候我们得出了什么结论,很明显嘛,当你传的参数值,跟你的成员变量名字相同的时候,你做就是一次无用功啊,java是伟大的,他给我们提供了一个关键词附带着方法,此时我们只需要让这个同名的name指向堆,这个时候,赋值就会赋给堆中的变量了。代码怎么体现呢?

	ThisDemo(String name)
{ this.name = name; }

  这里this的作用是区分栈内存的同名变量,意思是指我的这个变量是在堆内存当中的,你要去堆内存找才可以,并且要看好了,我是属于某某的别找错了。这个就是this的一个作用。

  

  另外一个要提到的就是我们当构造函数调用构造函数的时候,应该怎么写,这个时候对象都还没有初始化呢?比如在第三个构造函数当中,我们知道他的作用就是初始化num还有name,但是前面的两个构造函数这些都已经声明过了,这里我们再声明一遍的话就略显重复了,我们来修改一下,让第三个构造函数通过调用前两个构造函数来实现他原先的功能。大家第一个想到的可能是这么写:

	ThisDemo(String s,int n)
{ //this.ThisDemo(int n);//书写错误,函数内不能声明函数
//this.ThisDemo(String s);//同上 /**
*如果这个样子调用的话会提示,找不到方法ThisDemo(int),为什么会这么提示呢,因为类似于this.变量名的这种
*调用格式必须要在对象初始化完成之后才能够调用,在未初始化,但是又调用的时候就会报找不到方法这种错误
*/
//this.ThisDemo(n);
//反例反例反例反例
//this.ThisDemo(s); /**
*正确的初始化方法是直接用this,为什么直接用this可以呢,因为这里的this()这里就是深一层的对象初始化,因为他后
*面直接跟的是参数,就是给这个正在初始化的对象说,兄弟,先把这个初始化完成,完成之后咱再继续,就相当于this
*在初始化之前,调用初始化函数,但是在初始化函数返回对象之前,内部又调用了一次初始化,将内部初始化完成之后的对象
*返回给现在正在执行初始化的构造函数,让她继续去初始化。完成后返回一个对象
*/
this(n);//这个才是正确的
/**
*这里还需要注意的一点就是,这两个初始化语句的顺序问题,如果我们把下面的这条语句挪到上面来,会出现什么,艹了,会出现错误啊
*为么?你初始化都没完,自然没有返回对象,没有返回对象还调用个毛啊,上面都说了,this.成员 这种调用方法只能在对象已经存在的
*情况下才可以使用,没存在没法使用的
*/
this.name = s;
//ThisDemo(String s); }

  

java学习面向对象之this的更多相关文章

  1. Java学习---面向对象的远程方法调用[RMI]

    基础知识 分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果. 常见的分 ...

  2. java学习面向对象之异常之一

    一.异常的概述: 什么是异常?在我们编写java程序的时候,会出现一些问题,比如内存溢出啊或者数组索引超出最大索引啊,这些编程当中出现的这些个问题就是异常.但是异常也分为可以处理的和不可以处理的.比如 ...

  3. java学习面向对象之匿名内部类

    之前我们提到“匿名”这个字眼的时候,是在学习new对象的时候,创建匿名对象的时候用到的,之所以说是匿名,是因为直接创建对象,而没有把这个对象赋值给某个值,才称之为匿名. 匿名对象回顾: class N ...

  4. java学习面向对象之内部类

    什么是面向对象内部类呢?所谓的内部类,即从字面意义上来理解的话,就是把类放到类当中. 那么内部类都有什么特点呢? 1.内部类可以访问包裹他的类的成员. 2.如果包裹他的类想访问被其包裹的类的话就得实例 ...

  5. java学习面向对象之多态

    如何理解多态,让我们举个例子来描述一下,因为单纯的说多态大家可能不理解: abstract class Animal { ; abstract void eat(); public void run( ...

  6. java学习面向对象之接口

    上一节当中我们说道抽象类,抽象类当中的方法可以是抽象的也可以是非抽象的,那么当抽象类中所有方法都是抽象的时候,我们就可以把它重新定义为接口.代码示例: abstract class Animal { ...

  7. java学习面向对象之父子构造函数初始化

    在之前讲到java面向对象继承的时候,我们只讲到了两个比较重要的知识点,一个是父子类当中有同名的成员变量,这个时候,我们引入了super这个关键字来区分这两个同名成员变量,除此之外,我们还讲到了父子同 ...

  8. java学习面向对象之继承

    在我们编写程序的过程当中,会遇到这种情况: 比如现在有一个狗,他的功能有跑,有跳,有吃,有叫,属性有雌雄,大小,颜色等等,同时现在我们也有一个猫,上述功能她也有.这个时候我们写代码的时候,就得分别把上 ...

  9. java学习--面向对象

    对象及类的概念 对象是java程序的核心,在java程序中“万事万物皆对象” 对象可以看成是属性和方法的封装体 类是用来创建同一类型的对象的模板,在一个类中定义了该类对象所应具有的属性和方法 J2SD ...

  10. Java学习 面向对象(下)——Java疯狂讲义th4

    面向对象(下) [TOC] 包装类 通过包装类可以把8个基本类型的值包装成对象使用. 自动拆箱.自动装箱 把字符串类型值转换成基本类型的值: 包装类的 parseXxx(String s)静态方法 包 ...

随机推荐

  1. QT QObject::connect函数的学习

      从Qobject(QObject.h)源码中可以看到QObject::connect的定义是这样的: static bool connect(const QObject *sender, cons ...

  2. Java语言基础(九)

    Java语言基础(九) 一.自增运算(++) 自减运算(--) i++ 就是将i+1再赋给 i i-- 是将i-1再赋给 i 对变量i,j来说,i++ 或++i 这里没什么区别,都是将i的值加1后,再 ...

  3. 去掉android点击事件产生的半透明蓝色背景

    在wap开发过程当中,当你点击一个链接或者通过Javascript定义的可点击元素的时候,它就会出现一个半透明的蓝色背景,若要重设这个表现 ,可以利用css3: *{ -webkit-tap-high ...

  4. spring mvc DispatcherServlet详解之三---request通过ModelAndView中获取View实例的过程

    整个spring mvc的架构如下图所示: 上篇文件讲解了DispatcherServlet第二步:通过request从Controller获取ModelAndView.现在来讲解第三步:reques ...

  5. Android(java)学习笔记205:网易新闻RSS客户端应用编写逻辑过程

    1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,bl ...

  6. oracle左右连接 完全连接 有效连接 心得总结

    左链接 A表  Left  join  B表  on  条件 示例 A表 B表 SELECT * FROM A  left JOIN B ON A.AID = B.BID; 结果: 左链接查询出来的数 ...

  7. 第七章----pwm蜂鸣器

    Linux代码的重用: 在头文件中加载即可使用到原来所有的功能,还有动态方式就是一个驱动使用另一个驱动的资源. 对于像蜂鸣器这样的实验,它的内部文件有很多,所有要有很多的源代码以用于妥善管理. 有多个 ...

  8. Unity3D GUI学习

    Unity3D内置有GUI, 首先,使用GUI实现一个按钮,并且点击实现触发, void OnGUI() { //GUI.Button (new Rect (10,10,50,50), "n ...

  9. Unity3D 5.0简单的射线检测实现跳跃功能

    这里是一个简单的跳跃,5.0和其他版本貌似不一样,并且,再起跳功能做的不完全. 不过一个基本的思路在这里. 1.首先,射线检测,这里是利用一个空对象,放到主角对象的下面 2.然后调节射线的位置,在主角 ...

  10. c# try..... catch

    功能说明:在此例中,try 块包含对可能导致异常的ProcessString()方法的调用.catch子句包含仅在屏幕上显示消息的异常处理程序,当从ProcessString内部调用throw语句时, ...