这一节我们接着上一节来继续学习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; }
结果:
上面我们看了两个在使用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就代表那个对象.