javase学习笔记]-7.7 this之细节与应用

这一节我们接着上一节来继续学习this关键字.

我们之前在7.5节中的构造函数应注意的细节中提到过一个细节就是构造函数可以调用一般函数,但一般函数不能直接调用构造函数.但是我们没有深究构造函数能不能调用构造函数,那么现在我们就来看一看这个问题.

那么构造函数与构造函数之间是怎么访问呢?

为了掌握这个问题,我们必须要明确一个概念,那就是在一个类中的成员如果要被执行,就必须由对象调用.而每个对象都有一个所属的this.

java语言给了关键字this这个功能,那就是用this调用构造函数,而且也是通过参数不同选择调用不同的构造函数.

我们来看一个例子:

class Person
{
	private String name;
	private int age;

	Person()//构造方法1
	{
		System.out.println("person run");
	}
	Person(String name)//构造方法2
	{
		this.name = name;
	}
	Person(String name,int age)//构造方法3
	{
		this.name = name;
		this.age = age;
	}

	public void speak()
	{
		System.out.println(this.name+":"+this.age);
	}
}
class ThisTest
{
	public static void main(String[] args)
	{
		Person kobe = new Person("科比",37);
		kobe.speak();
	}
}

对于上面的例子我们可以看到,构造函数3中的第一句语句其实我们已经通过构造函数2实现了,那么为了提高代码的复用性,我们为什么不调用构造函数2呢,java语言中用下面的语句来调用构造函数:

	Person(String name,int age)//构造方法3
	{
		this(name);//用this关键字调用了构造函数Person(String name)
		this.age = age;
	}

我们看到了this关键字可以用于在构造函数中调用其他构造函数,当然对于调用那个构造函数,还是通过参数来确定.

那么我们就明确了构造函数与构造函数之间的调用形式.

下面我们来看两个this关键字用法中需要注意的两个细节:

第一个细节:构造函数中调用构造函数只能定义在构造函数的第一行.

这是为什么呢,因为初始化动作一定要先执行.这就是java语言定义的一个规则,如果不是定义在第一行,编译直接通不过.

我们看例子,把上面的构造函数3的语句交换位置:

	Person(String name,int age)//构造方法3
	{
		this.age = age;
		this(name);//用this关键字调用了构造函数Person(String name)
	}

我们看编译情况:

我们看到编译错误:对this的调用必须是构造器中的第一个语句,这就是我们在使用this关键字时的第一个细节.

第二个细节:注意构造函数的调用出现递归循环而导致栈内在溢出.

我们看个例子:

	Person()//构造方法1
	{
		this("KOBE");
		System.out.println("person run");
	}
	Person(String name)//构造方法2
	{
		this();
		this.name = name;
	}

结果:

我们很容易发现两个构造函数相互调用,形成了递归,使得两个构造函数不断进栈,最后栈内存溢出,程序终止.

上面我们看了两个在使用this关键字时需要注意的细节,下面我们再简单的看看this关键的应用情况.

我们一般什么时候使用this呢,我们上一节中说过this的概念:this就代表对象,就是所在函数所在对象的引用.那么我们不难理解,当我们在一个类中用到了本类的对象,我们就通常会用this来引用.

那么我们来实现一个功能:判断两个人是否是同龄人.

分析一下:要判断两个人是否同龄,我们只需要比较这两个人(也就是两个Person对象)的年龄是否相等即可,那么也就是说一个对象可以直接调用Person类中的方法来与另一个对象做比较就可以了.

我们可以这样实现:

	//判断两个人是否同龄
	public boolean compare(Person p)
	{
		return this.age == p.age;
	}

我们来测试一下:

class ThisTest
{
	public static void main(String[] args)
	{
		Person kobe = new Person("科比",37);
		Person james = new Person("詹姆斯",31);
		kobe.speak();
		james.speak();
		System.out.println("这两个人相等吗:"+kobe.compare(james));
	}
}

结果:

我们看到this的主要应用就是代表对象,那个对象调用了this所有的函数,我们就通俗的认为this就代表那个对象.

时间: 2024-11-10 01:08:57

javase学习笔记]-7.7 this之细节与应用的相关文章

javasE学习笔记:关键字super的使用

/* super 的作用: 1 . super可以在子类中引用父类的成员,通过 .的方式和属性.this相对应. 2. 在子类的构造方法中可以可使用super(参数列表)语句调用父类的构造方法 3. 注意: 子类的构造方法中一定要调用父类的构造方法.... */ javasE学习笔记:关键字super的使用,布布扣,bubuko.com

[学习笔记] 应用程序构建内部细节

本文地址: http://blog.csdn.net/sushengmiyan/article/details/38316829 本文作者:sushengmiyan -------------------------------------------------------------资源链接----------------------------------------------------------------------- 翻译来源  Sencha Cmd官方网站:http://do

Unity3D学习笔记之八为场景添加细节(一)

这一系列教程以及素材均参考自人人素材翻译组出品的翻译教程<Unity游戏引擎的基础入门视频教程>,下载链接附在第二篇学习笔记中. 我花了30分钟做了一个中等大小的迷宫场景,不知道大家自己发挥,做的场景大小如何. 在完成场景之后,我们看到Hierarchy视图里面的东西已经满了,所以我们先来整理一下Hierarchy视图.创建一个空的游戏物体命名为Environment. 然后来到Hierarchy视图,先讲First Person Controller找到,挪到最上方,然后选中第一个物体,按住

Unity3D学习笔记九为场景添加细节(二)

上节为场景中添加了第一块带有碰撞器的石头,本节我们来利用Prefab,将场景细节都添加进去,并且做的更完善. 这一系列教程以及素材均参考自人人素材翻译组出品的翻译教程<Unity游戏引擎的基础入门视频教程>,下载链接附在第二篇学习笔记中. 继续来到那块已经成形的石头--Boulder旁边,我们可以制作很多石头的Prefab,这样对于丰富我们巨大的场景很有利,我们先来创建第一个石头的Prefab按下Control+D复制一块石头,按住坐标轴拖动出来,按下R调整到缩放工具,按住中心的白色立方体缩小

[javase学习笔记]-7.5 构造函数须要注意的几个细节

这一节我们简单的说几个在使用构造函数时须要注意的细节. 通过我们前几节的学习,我们对构造函数有了一个比較清楚的认识,当我们在创建对象时.我们会调用构造函数.那么我们在定义和调用构造函数时.须要注意哪些细节呢? 第一个须要注意的细节:构造函数与set方法 看两个函数代码: class Person { private String name; private int age; //构造函数,初始化name Person(String n) { name = n; System.out.printl

[javase学习笔记]-7.5 构造函数需要注意的几个细节

这一节我们简单的说几个在使用构造函数时需要注意的细节. 通过我们前几节的学习,我们对构造函数有了一个比较清楚的认识,当我们在创建对象时,我们会调用构造函数.那么我们在定义和调用构造函数时,需要注意哪些细节呢? 第一个需要注意的细节:构造函数与set方法 看两个函数代码: class Person { private String name; private int age; //构造函数,初始化name Person(String n) { name = n; System.out.printl

JavaSE学习笔记(五)——类与对象

一.  类和对象 1.1           面向对象与面向过程的区别 1.面向过程 采用面向过程必须了解整个过程,每个步骤都有因果关系,每个因果关系都构成了一个步骤,多个步骤就构成了一个系统,因为存在因果关系每个步骤很难分离,非常紧密,耦合度高,当任何一步骤出现问题,将会影响到所有的系统.如:采用面向过程生产电脑,那么他不会分CPU.主板和硬盘,它会按照电脑的工作流程一次成型. 2.面向对象 面向对象对会将现实世界分割成不同的单元(对象),实现各个对象,如果完成某个功能,只需要将各个对象协作起

JavaSE学习笔记(一)———Java简介与基础

一.  Java语言简介 1.1           计算机语言的发展过程 计算机语言发展主要分为三个阶段: 1.第一代:机器语言 2.第二代:低级语言 3.第三代:高级语言 1.2           Java发展简史 1.Java 是一种程序开发语言,既然是一门语言,就像其他语言一样,具备一定的语法 和自己的数据结构. 2.Java语言来源于sun公司,sun指的是斯坦福大学网络.由james gosling领导并开发. Java语言的具体发展历程 1991~1995  Sun 为了占领智能

JavaSE学习笔记(3)

XML简介 XML即可扩展的标记语言.因此该语言中所有的标签都是没有预先定义的,开发者可以自己随意的指定. 目前为止所有的标记的语言都属于开源的语言.由W3C组织进行一个基本的维护. 因此大家学习这些语言的时候应该参考W3C公布的文档. XML作用 1.可以用作软件的配置文件. 2.可以实现独立平台的数据传输. C à XML à Java   天气预报 3.Web Service. 4.可以描述带关系的数据. XML体验 XML文件其实在实际的开发中可以帮助开发者进行描述一些带关系的数据.