JAVA面向对象(7)-this关键字

本文详细介绍了Java中的this关键字,包括它的作用、使用场景以及在实例方法和构造器中的应用。讲解了this如何区分实例变量和局部变量,并通过示例展示了构造器中的this调用。此外,还探讨了this在构造器转发中的重要性,简化了代码的编写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

this关键字:

关于this关键字:

* 1、this:这个。

* 2、this是一个引用,this是一个变量,this变量中保存了内存地址指向了自身,this存储在JVM堆内存java对象内部。

* 3、创建100个对象,每一个对象都有this,即有100个不同的this。

* 4、this可以出现在”实例方法“中,this指向当前正在执行这个动作的对象。

* 5、多数情况下,this也可以省略不写。

* 6、this不能使用在带有static的方法当中。

一、this只能用在实例方法中访问实例变量

以下是this在用户类中的使用举例:

public class Customer {
    String name;   //实例变量 
    public void thisGet(){
        System.out.println(this.name);   //name也是一个实例变量,
    }

    /*不带有static关键字的一个方法:

     * 顾客购物的行为:由于每一个顾客购物最终的结果是不一样的,所以购物这个行为属于对象级别的行为。

     * 由于每一个对象在执行购物这个动作的时候最终结果不同,所以购物这个动作必须有”对象“的参与。

     * 重点:没有static关键字的方法称为”实例方法“;实例方法访问方式:”引用.“。

     * 重点:没有static关键字的变量称为”实例变量“。*/
    public void shopping(){
        //这里name的访问完整的方式应该是”引用.变量名;“,不过这里因为创建的对象是发生变化的。
        //因此这里可以用this.name进行调用。
        System.out.println(this.name+"正在超市挑挑选选。");
    }

    /*在带有static修饰符的方法中不能使用this,this只能在动态对象中访问使用,
      由此this不能访问,直接访问name(实例变量)也不行。

      带有static修饰符的方法这个执行过程中没有”当前对象“,带有static的方法是通过”类名.“的方式访问的;
      且该”上下文“当中没有”当前对象“,不存在this(指向当前对象)需要。*/
    public static void getVue(){
        //创建对象
        Customer c = new Customer();
        System.out.println(c.name);  //因为又新创建了对象,这里name变量存储的是初始化的值null。
    }
}

用户测试类中:

public class CustomerTest {

    public static void main(String[] args) {
        Customer cus = new Customer();
        cus.name = "gege";

        Customer cus1 = new Customer();
        cus1.name = "meimei";

        //根据创建的cus1中存储的Customer对象进行调用
        System.out.println("调用客户类中的实例变量为:"+cus1.name);
        //调用实例方法为"引用."
        int c = cus1.sum(5,6);
        System.out.println("调用客户类中的实例方法结果为:"+c);

        //定义实例方法的原因:每个不同的顾客对象调用的最终的结果不同。即这个动作完成的时候必须有对象的参与。
        cus.shopping();   //gege正在超市挑挑选选。
        cus1.shopping();    //meimei正在超市挑挑选选。


        //调用自己类中不含有static的方法,先创建对象
        CustomerTest cut = new CustomerTest();
        double result = cut.sumDouble(11.3, 12.2);
        System.out.println("调用本类中的不含有static修饰符的实例方法结果则为:"+result);

        //调用含有static的方法”类名.方法名();“,如果在本类中则类名还可以省略
        print();

        Customer.pay();
        //类名.方法名去获取static方法
        Customer.getVue();

    }

二、this不能省略的情况

在局部变量中出现和实例变量重名的变量则需要在实例变量前添加this。

/*
* this不能省去的情况:this.用来区分局部变量和实例变量的时候不能省略。
* */
public class ThisTest03 {
    private int id;   //实例变量
    private String name;
    private double price;

    //设置set()和get()
    public void set(int a){
        id = a;   //对id进行修改
    }

    public void setId(int id) {   //int a是可以的,但为了见名知意,将a修改为id
        //id = id;   
        //java的就近原则,这里id已经跟上述id没有任何关系,仅在该setId方法中作用,将自己赋值给自己,带来问题。
        this.id = id;   //解决:将省去的this添加进来解决命名冲突问题。
    }
}

三、this构造器转发

下面是自定义日期类:

/*自定义的日期类型
* */
public class Date {
    private int year;
    private int month;
    private int day;

    //构造方法
    public Date(int year, int month, int day){   //有参数构造器
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public Date(){    //无参数构造器
        //this.year = 2004;
        //this.month = 4
        //this.day = 14;
        /*这里引出问题:
        由于无参数调用,需要在无参数构造器内部填写对应有参数构造器一一对应的数据,繁复。
        如果有100个值,就要进行100个参数填写。
        能不能在这里直接进行对有参数列表的调用呢?(有参数列表可以自动生成)*/
        //new Date();//虽然可以创建对象,但显然不符合程序设计原则,在DateTest已经进行了对象的创建,这里再一层创建对象不合理,达不到简便的而作用。

        //这时候就可以利用this进行直接调用当前对象,不需要再创建对象。调用方法为this();
        this(2004,4,14);  //Call to 'this()' must be first statement in constructor body
        /*对了,构造方法使用this的要求:必须是构造器内的第一条java语句,否则出现上述报错。*/
        System.out.println("this();语句使用必须是构造器内第一条语句,本输出为第二条语句。");
    }


    //打印方法
    public void print(){
        System.out.println(this.year+"年-"+this.month+"月-"+this.day+"日。");
    }
}

日期测试类:

/*
    this可以用在哪里:
        1、可以用在实例方法当中,代表当前对象【语法格式:this.】
        2、可以使用在构造方法中,通过当前的构造方法调用其他的构造方法【语法格式:this(实参);】

    重点记忆:this()这种语法只能出现在构造函数第一行。

* */

public class DateTest {
    public static void main(String[] args) {
        //需求:调用无参数构造器的时候打印出日期:2004年4月14日。
        Date d1 = new Date();
        d1.print();

        Date d2 = new Date(2021, 5,21);  //调用有参数构造器,可以将参数传入参数列表
        d2.print();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值