[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,又称堆栈,它是运算受限的线性表 ...
随机推荐
- cocos2d-x android 环境部署
1.下载jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2.下载 and ...
- 继承static的注意点
继承static的注意点 singleton模式会使用 <?php class Auth { protected static $_instance = null; /** * 单用例入口 * ...
- c3p0参数详解
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数.Default: 3 --> <property name="acquireIncrement"& ...
- laydate.js 月份区间选择插件
laydate.render({ elem: '#reservation2' , type: 'month' , range: true, //format: '2018/09', theme: '# ...
- java虚拟机(七)--java内存模型JMM
本文参考慕课网相关视频和博客https://mp.weixin.qq.com/s/tV0MfDdJqGwGMHCIkqnAgA,图也是这个博客的,这篇只是自己的简单总结,想要深 入理解可以访问这两块内 ...
- 第二节:SQLServer导出-重置sa密码-常用sql语句
1.SQLServer导出: 点击要导出数据库----->右键(任务)----->生成脚本----->下一步----->下一步(高级)要编写脚本的数据类型---选择架构和数据 ...
- 微服务网关从零搭建——(二)搭建api网关(不带验证)
环境准备 创建空的core2.1 api项目 演示使用名称APIGateWay 过程参考上一篇 完成后在appsettings.json 添加节点 "Setting": { & ...
- 当ECharts碰到TWaver
百度公司的ECharts发展迅速,已经成为HTML5 Chart的佼佼者,这让大家骄傲:中国人终于也有世界级的开源通用UI产品了.正如其网站所说,它是百度的,是中国的,也是世界的.想想那些年,我们追逐 ...
- 移动端开发需要加的meta
移动端开发需要加的meta和常用的css3媒体查询样式,移动开发中头部要加的一些常用meta. <meta name="viewport" content="ini ...
- Go:函数、defer
一.函数可赋值给一个变量 示例1: package main import "fmt" func add(a, b int) int { return a + b } func m ...