JAVA-this关键字

本文详细探讨了Java中的this关键字,解释了它在对象内存分布中的作用,以及为何静态方法中无法调用实例成分。通过实例展示了如何在静态方法中访问实例成分,并阐述了构造方法中this的应用,强调了this在简化代码和构造方法调用中的重要性。
摘要由CSDN通过智能技术生成

目录

1、this关键字是什么?

2、this引用内存分布图

3、为什么静态方法中不能调用实例成分?

4、如何在静态方法中访问实例成分

5、构造方法中this的应用


1、this关键字是什么?

        java关键字,字面意思“这个”,当对象创建之后,每个对象的堆内存之内就有一个this引用,这个引用指向内存单元本身,指向对象自己,是一个引用变量。

        所以某些角度看,this就等于当前对象,所以它可以出现在实例方法中,因为它是一个可以访问对象的引用。

2、this引用内存分布图

        如下图,当在main方法中创建一个对象 Student stu=new Student();,除了该对象的自身的属性之外,还隐含了一个this引用,这个引用存储着自身内存单元的地址。

        例如:主方法

public class test04 {
    public static void main(String[] args) {

        Chinese chinese=new Chinese();
        chinese.add(1,2);
        System.out.println(chinese.getSum());
        System.out.println(chinese);
    }
}

        Chinese类:

public class Chinese {
    private String id;
    private String name;
    private String country;
    private int sum;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public int getSum() { 
        return sum;
    }

    public void setSum(int sum) {
        this.sum = sum;
    }

    //主要代码
    public void add(int a, int b){
        this.sum=a+b;
        System.out.println(this);
    }
}

运行结果:

        可以发现在main方法中指向Chinese对象的一个引用的地址和add方法中this引用所存储的地址是相同的,都指向的是Chinese对象在堆内存中的内存单元。所以这里也可以看到,this其实就是方法的调用对象,谁调用了这个方法,this就指代哪个对象。静态方法不需要对象调用,所以更能证明静态方法中没有对象和引用存在,就不能调用实例成分了。

Chinese@4554617c
3
Chinese@4554617c

Process finished with exit code 0

3、为什么静态方法中不能调用实例成分?

         静态方法的调用,是类名·方法名的方式进行调用,所以它和对象并没有关联,方法内部不存在对象,因而也就不存在this关键字,因为this指代的是当前对象,而实例成分的调用需要对象引用的参与,所以在静态方法中不存在能够调用实例成分的对象或者引用。再者静态方法在类加载的时候放置在方法区内存中,但是实例成分是在堆内存中,且要在对象创建并初始化后才有意义的,如果静态方法中有实例成分在编译阶段就会出现问题。

        例如下图:图中num变量是实例变量,对它的调用应该通过【引用·成分名】的方式进行引用,main方法是static类型的方法,所以其内部没有对象,因而也就不能直接的去调用。

——————————为什么在实例方法中可以调用实例方法?————————————

        因为调用实例方法的必然是一个对象的引用,那么这个被调用的实例方法A中就存在指代当前类对象的this引用,利用这个引用可以完成当前类中实例方法的调用

        所以实例方法中可以调用实例方法,因为必然存在指向当前对象的引用this,所以this可以省略不写

        实例方法中可以调用静态方法,如果在同一个类当中,可以省略类名,直接写方法名和参数的方式进行调用即可。

        例如:代码中对方法B的调用可以写【this.B( )】也可以写做【B( )】;

类AB{
    实例方法A(){
        方法B();
    }
    实例方法B(){
        java语句;
    }
}

4、如何在静态方法中访问实例成分

        很简单,不能访问实例成分是因为没有对象存在于静态方法内部,那么我们为它创建一个对象就可以了。

        在静态方法内部进行实例化一个对象,然后再访问实例成分,这里注意,main方法就是普通的一个静态方法,和其他任意的静态方法一样,所以能在main方法中做的事情,都能在其他的静态方法中进行,所以是可以创建对象的,但是注意这个新创建的对象是一个新的内存单元,和你所调用方法的那个this所指代的对象不同,可以利用传参的方式,将当前对象内存单元的引用传递过去,使形参变量引用指向所期望的内存单元,以充当this的作用。

5、构造方法中this的应用

        语法结构:this{  可选参数  };————调用当前类构造方法;

        构造方法用于创建对象,完成一定的对象信息的初始化操作,方法是可以嵌套调用的,构造方法也不例外,利用this可以很好的简化构造方法的编写,尤其是构造方法中有过多的内容时,很常用。

        例如:创建一个矩形类rectangle,默认(调用无参的构造方法)生成的矩形是长2cm,宽2cm的矩形,自定义(调用有参的构造方法并传递参数)生成的矩形是长为long,宽为width的矩形。在两个构造方法中的操作都是进行赋值操作,只不过无参的构造方法是以固定的长宽生成矩形,有参的构造方式是以指定的长宽生成矩形,二者之间殊途同归,如果写两遍代码,作为练习无伤大雅,但是真正的项目之中,代码成千上万行,很多操作,这时候再写一遍会,代码繁琐重复,妨碍代码理解,也会占据不必要的内存。

public class rectangle {
    private float length;
    private float width;
    public rectangle(){
        this(2,2);   // 调用有参的构造方法,该种方式只能写一句
    }
    //get/set方法
    public float getLength() {
        return length;
    }

    public void setLength(float length) {
        this.length = length;
    }

    public float getWidth() {
        return width;
    }

    public void setWidth(float width) {
        this.width = width;
    }
    
    //有参的构造方法
    public rectangle(float length,float width){
        this.length=length;
        this.width=width;
    }
}

         根据是否有参数,决定调用哪一个构造器。

        调用构造方法要通过new关键字,但是这样需要重新创建对象,开辟新的内存空间,但是我们想要的效果是对我们所使用的当前对象发挥作用,那么通过this关键字可以有效的解决这个问题,简化代码。

        注意使用this在某个构造方法中调用其他构造方法,这种调用只能有一次,只能有一句调用的语句。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值