this关键字
this访问属性
首先在开发之中,经常会出现利用构造方法或者是setter、getter方法设置属性内容的情况,那么下面来观察如下的一段程序。
class Book{
String title ;
double price ;
public Book(String t,double p){
title = t ;
price = p ;
}
public void getInfo(){
System.out.println("书的名称:"+title+" 书的价格:"+price);
}
}
public class Demo {
public static void main(String[] args) {
Book book = new Book("Java开发",79.8);
book.getInfo();
}
}
输出结果:
书的名称:Java开发 书的价格:79.8
既然构造方法中的参数是为了属性设置内容准备的,那么最好的做法是跟属性一个名称。于是对程序的构造函数做出了修改:
public Book(String title,double price){
title = title ;
price = price ;
}
输出结果:
书的名称:null 书的价格:0.0
从结果来看书名和价格都成了默认值。程序本身具备就近取用的原则。而且所谓的近是以“{}” 为范围。也就是说程序中的“title = title ; price = price ;”都会去找“public Book(String title,double price)”中新声明的参数,并不会去找属性中的title、price。
为了明确的分辨出是属性还是参数,所以在进行属性访问的时候都要加上this,即**“this.属性”**的方式进行访问。
下面来看修改后的代码:
class Book{
String title ;
double price ;
public Book(String title,double price){
this.title = title ;
this.price = price ;
}
public void getInfo(){
System.out.println("书的名称:"+this.title+" 书的价格:"+this.price);
}
}
public class Demo {
public static void main(String[] args) {
Book book = new Book("Java开发",79.8);
book.getInfo();
}
}
输出结果:
书的名称:Java开发 书的价格:79.8
结论:以后只要是访问类之中的属性,前面永远都要加上this关键字
this访问方法
使用this还可以调用本类中的方法,而对于方法有两类:
- 第一类:本类的普通方法,this.方法();
- 第二类:本类的构造方法,this();
代码示例(访问普通方法):
class Book{
String title ;
double price ;
public Book(String title,double price){
this.title = title ;
this.price = price ;
this.getInfo(); //调用本类方法
getInfo(); //不使用this也可以完成调用,但是不够规范
}
public void getInfo(){
System.out.println("书的名称:"+this.title+" 书的价格:"+this.price);
}
}
public class Demo {
public static void main(String[] args) {
Book book = new Book("Java开发",79.8);
}
}
输出结果:
书的名称:Java开发 书的价格:79.8
书的名称:Java开发 书的价格:79.8
代码示例(调用构造方法):
class Book{
String title ;
double price ;
public Book(){
System.out.println("这是一个构造方法");
}
public Book(String title){
this(); //调用无参构造函数
}
public Book(String title,double price){
this(title); //调用有参构造函数
}
public void getInfo(){
System.out.println("书的名称:"+this.title+" 书的价格:"+this.price);
}
}
public class Demo {
public static void main(String[] args) {
Book book = new Book("Java开发",79.8);
}
}
输出结果:
这是一个构造方法
在使用this()调用有参构造参数的时候,参数个数一定要小于当前方法的参数个数,如果参数相等,则会报错代码示例:
class Book{
String title ;
double price ;
public Book(){
System.out.println("这是一个构造方法");
}
public Book(String title){
this(); //调用无参构造函数
}
public Book(String title,double price){
this(title,price); //调用的为本方法
}
public void getInfo(){
System.out.println("书的名称:"+this.title+" 书的价格:"+this.price);
}
}
public class Demo {
public static void main(String[] args) {
Book book = new Book("Java开发",79.8);
}
}
输出结果(报错):
java: 递归构造器调用
但是在使用this调用其他构造时有如下的要求:
- 构造的调用必须放在构造方法的首行
- 在使用this互相调用构造方法的时候请保留有一个出口,避免出现递归调用。至少要保留一个不使用this调用其他构造的操作。
this表示当前对象
直接上代码:
class Book {
public void fun(){
System.out.println("Book类"+this);
}
}
public class Demo {
public static void main(String[] args) {
Book bookA = new Book();
System.out.println("主 类"+bookA);
bookA.fun();
}
}
输出结果:
主 类Book@1b6d3586
Book类Book@1b6d3586
输出的结果Book@1b6d3586可以被看作是当前对象的地址,通过结果发现无论是主方法直接调用还是通过this调用所显示的都是当前对象的地址。所以this表示当前对象在这里得到了很好的验证。