[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,又称堆栈,它是运算受限的线性表 ...
随机推荐
- IFormattable,ICustomFormatter, IFormatProvider接口
定 义 1.IFormattable 提供一种功能,用以将对象的值格式化为字符串表示形式. 2.IFormatProvider 提供用于检索控制格式化的对象的机制 ...
- hihocoder offer收割编程练习赛13 D 骑士游历
思路: 矩阵快速幂. 实现: #include <iostream> #include <cstdio> #include <vector> using names ...
- rabbitmq 简单示例(Hello World)
一:消息中间件: AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计 RabbitMQ是实现AMQP( ...
- Windows提高_1.1内核对象
内核对象 什么是内核对象? 内核对象本质上是一个结构体,我们不能直接的操作一个内核对象,需要通过操作系统提供的一系列函数和我们使用的内核对象句柄对它进行一系列的修改. 如何操作内核对象? 创建一个内核 ...
- Java线程处理
Java线程处理 创建线程 继承Thread类 public class TestThread extends Thread{ public void run(){ System.out.printl ...
- HDU多校Round 3
Solved:4 rank:268 C. Dynamic Graph Matching 状压DP一下 #include <stdio.h> #include <algorithm& ...
- adb 命令实用
1.adb安装:adbinstall.bat:原理:将apk文件拖进此bat,install命令会强制(覆盖)安装apk安装包.代码如下: @echo on adb install -r % paus ...
- 【Hadoop】三、HDFS命令行接口
通过前面对HDFS基本概念.高可用性.数据读写流程的介绍,我们对HDFS已经有了大致的了解.这里我们还需要明确一点:Hadoop作为一个完整的分布式系统,它有一个抽象的文件系统的概念,而我们介绍的 ...
- Word2Vec的基本使用
目录 1.建立模型 2.保存与加载模型 3.使用模型 gensim 是 Python 中一款强大的 自然语言处理工具,它包含了常见的模型,其中便有 Word2Vec 这一优秀的 词向量训练工具,可以使 ...
- POJ 3630
Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20894 Accepted: 6532 Descripti ...