[javase学习笔记]-7.7 thiskeyword的细节与应用
这一节我们接着上一节来继续学习thiskeyword.
我们之前在7.5节中的构造函数应注意的细节中提到过一个细节就是构造函数能够调用一般函数,但一般函数不能直接调用构造函数.可是我们没有深究构造函数能不能调用构造函数,那么如今我们就来看一看这个问题.
那么构造函数与构造函数之间是怎么訪问呢?
为了掌握这个问题,我们必需要明白一个概念,那就是在一个类中的成员假设要被运行,就必须由对象调用.而每一个对象都有一个所属的this.
java语言给了keywordthis这个功能,那就是用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);//用thiskeyword调用了构造函数Person(String name)
this.age = age;
}
我们看到了thiskeyword能够用于在构造函数中调用其它构造函数,当然对于调用那个构造函数,还是通过參数来确定.
那么我们就明白了构造函数与构造函数之间的调用形式.
以下我们来看两个thiskeyword使用方法中须要注意的两个细节:
第一个细节:构造函数中调用构造函数仅仅能定义在构造函数的第一行.
这是为什么呢,由于初始化动作一定要先运行.这就是java语言定义的一个规则,假设不是定义在第一行,编译直接通只是.
我们看样例,把上面的构造函数3的语句交换位置:
Person(String name,int age)//构造方法3
{
this.age = age;
this(name);//用thiskeyword调用了构造函数Person(String name)
}
我们看编译情况:
我们看到编译错误:对this的调用必须是构造器中的第一个语句,这就是我们在使用thiskeyword时的第一个细节.
第二个细节:注意构造函数的调用出现递归循环而导致栈内在溢出.
我们看个样例:
Person()//构造方法1
{
this("KOBE");
System.out.println("person run");
}
Person(String name)//构造方法2
{
this();
this.name = name;
}
结果:
我们非常easy发现两个构造函数相互调用,形成了递归,使得两个构造函数不断进栈,最后栈内存溢出,程序终止.
上面我们看了两个在使用thiskeyword时须要注意的细节,以下我们再简单的看看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就代表那个对象.
[javase学习笔记]-7.7 thiskeyword的细节与应用的更多相关文章
- [javase学习笔记]-7.6 thiskeyword的原理
这一节我们来讲一个keyword.就是thiskeyword. 我们还是通过样例来看吧: class Person { private String name; private int age; Pe ...
- javaSE学习笔记(16)---网络编程
javaSE学习笔记(16)---网络编程 基本概念 如今,计算机已经成为人们学习.工作.生活必不可少的工具.我们利用计算机可以和亲朋好友网上聊天,也可以玩网游.发邮件等等,这些功能实现都离不开计算机 ...
- JavaSE学习笔记(13)---线程池、Lambda表达式
JavaSE学习笔记(13)---线程池.Lambda表达式 1.等待唤醒机制 线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同. 比如:线程A用来生成包子的,线程B用 ...
- javaSE学习笔记(17)---锁
javaSE学习笔记(17)---锁 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率.本文旨在对锁相关源码(本文中的源码来自JDK 8).使用场景进行举例,为读 ...
- javaSE学习笔记(15) ---缓冲流、转换流、序列化流
javaSE学习笔记(15) ---缓冲流.转换流.序列化流 缓冲流 昨天复习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流.比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化 ...
- JavaSE学习笔记(14)---File类和IO流(字节流和字符流)
JavaSE学习笔记(14)---File类和IO流(字节流和字符流) File类 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 构造方 ...
- JavaSE学习笔记(12)---线程
JavaSE学习笔记(12)---线程 多线程 并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在 ...
- javaSE学习笔记(11)--- Map
javaSE学习笔记(11)--- Map 1.Map集合 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Jav ...
- javaSE学习笔记(10)---List、Set
javaSE学习笔记(10)---List.Set 1.数据存储的数据结构 常见的数据结构 数据存储的常用结构有:栈.队列.数组.链表和红黑树. 1.栈 栈:stack,又称堆栈,它是运算受限的线性表 ...
随机推荐
- C语言用指针输出数组里的值
因为*(arr)是指arr数组内存编号所对应的首地址的值,即arr[0]的值.所以用*(arr+i)可以实现遍历整个数组.
- Farseer.net轻量级开源框架 入门篇:使用前说明
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 框架性能测试 下一篇:Farseer.net轻量级开源框架 入门篇: 增.删.改. ...
- python学习笔记(7)——集合(set)
关键词#1.定义:无序不重复元素集, 基本功能包括关系测试和消除重复元素. 2.关键词:类似dict.只有key无value.常用于集合类数学运算. 3.创建 s=set() #入参可以是list.t ...
- Windows提高_2.1第一部分:线程
第一部分:线程 什么是线程? 线程其实可以理解为一段正在执行中的代码,它最少由一个线程内核对象和一个栈组成. 线程之间是没有从属关系的,同一进程下的所有线程都可以访问进程内的所有内容. 主线程其实是创 ...
- CAD把一个dwg文件,或者图像文件当着一个背景导入(com接口VB语言)
主要用到函数说明: MxDrawXCustomFunction::Mx_OpenBackgroundFile 把一个dwg文件,或者图像文件当着一个背景导入.详细说明如下: 参数 说明 CString ...
- ThinkPHP---thinkphp会话支持和文件载入
[一]会话控制 会话支持一般指cookie和session,在ThinkPHP里为了方便开发,封装了cookie和session方法. (1)session方法 在函数库封装了session方法 se ...
- 02Servlet
Servlet Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地 ...
- 通过Oracle函数SQL实现C# String.Format字符串格式化功能
语言国际化要求,开发上要求Oracle数据库SQL中对应的返回信息-Message,实现一个通用函数调用,比如:提示信息内容:条码123456当前工站在FCT!”,即通用的信息内容格式化标准为:“条码 ...
- 面向对象程序设计--Java语言第三周编程题:查找里程
查找里程 题目内容: 下图为国内主要城市之间的公路里程: 你的程序要读入这样的一张表,然后,根据输入的两个城市的名称,给出这两个城市之间的里程. 注意:任何两个城市之间的里程都已经给出,不需要计算经第 ...
- UVA-127 "Accordian" Patience(模拟)
题目: 把52张牌从左到右排好,每张牌自成一个牌堆.当某张牌与它左边那张牌或者左边第三张牌匹配时(花色或者点数相同)时,就把这张牌移到那张牌上面. 移动之后还要查看是否可以进行其他移动.只有位于牌堆顶 ...