2021-04-10

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表示当前对象在这里得到了很好的验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值