吐血整理:一文搞懂this 和 static 关键字

this

1,this是什么

this 可以看做一个变量,它是一个引用,存储在Java 虚拟机堆内存的对象内部,this 这个引用保存了当前对象的内存地址指向自身,任何一个堆内存的Java 对象都有一个this ,也就是说创建100个Java 对象则分别对应100个this。

this 指向“当前对象”,也可以说this 代表“当前对象”,this 可以使用在实例方法中以及构造方法中,语法格式分别为“this.” 和“this(…)” 。this不能出现在带有static 的方法中。

2,this 使用在实例方法中

this 不能出现在static 的方法中,这是为什么呢?
首先static 的方法,在调用的时候是不需要创建对象的,直接采用“类名” 的方式调用,也就是说static 方法执行的过程中是不需要“当前对象”参与的,所以static 的方法中不能使用this,因为this 代表的就是“当前对象”。

大家是否还记得之前的“封装”过程中,曾编写属性相关的set 和get 方法,set 和get 方法在声明的时候是不许带static 关键字的,我们把这样的方法叫做实例方法,说到实例方法,大家肯定会想到实例边量,没错,实例变量和实例方法都是对象相关,必须有对象的存在,然后通过“引用”去访问。

为什么set 和get 方法设计为实例方法呢?

那是因为set 和get 方法操作的是实例变量,“不同对象”调用get 方法最终得到的数据是不同的,例如,zhangsan 调用getName()方法得到的名字是zhangsan ,lisa 调用getName()得到的名字是lisa ,显然get 方法是一个对象级别的方法,不能直接采用“类名”调用,必须先创建对象,在通过“引用”去访问。

this 可以出现在实例方法当中,因为实例方法在执行的时候一定是对象去触发的,实例方法一定是对象才能去调用的,而this 恰巧又代表“当前对象”,所以 “谁”去调用这个实例方法this 就是“谁”。

接下来我们再看一段代码来体会一下this 的使用

public class Customer{
    private String name;
    public Customer(){
        
    }
    public Customer(String name){
        this.name=name;
    }
    public void setName(String name){
        this.name=name;
    }
    public String getName(){
        return name;
    }
    //实例方法  
    public void shopping(){
        System.out.println(name+"is shopping!");
        System.out.println(name+"选好商品了!");
        //pay()支付方法是实例方法,实例方法需要使用“引用”调用
        //那么这个引用时谁呢?
        //当前对象在购物,肯定是当前对象在支付,所以引用是this 
        this.pay();
        //同样“this.”可以省略  
        pay();
    }
    //实例方法
    public void pay(){
        System.out.println(name+"支付成功!");
    }
}  

public class CustomerTest{
    public static void main(String[] args){
        Customer jack=new Customer("jack");
        jack.shopping();
        System.out.println("=============");
        Customer rose=new Customer("rose");
        rose.shopping();
    }
}  
//运行结果如下:
jack is shopping!
jack 选好商品了!
jack 支付成功!
jack支付成功!
=============
rose is shopping!
rose 选好商品了!
rose 支付成功!
rose 支付成功!

通过以上测试,可以看出在一个实例方法当中可以直接访问其他的实例方法,方法是对象的一种行为描述,实例方法中直接调用其他的实例方法,就表示“当前对象”完成了一系列行为动作。

3,this 使用在构造方法中

this 还用一种用法就是,使用在构造方法的第一行。注意:只能出现在第一行,这是规定,记住就行。该方式的目的就是,通过当前构造方法调用本类当中其他的构造方法,就是为了代码能够复用。其调用格式如下:

public Date(){
    this(1980,1,1);//正确调用
}
---------------------
public Date(){
   System.out.println("...");   
  this(1980,1,1);//发生错误,因为对this 的调用必须是构造器中的第一个语句。
}

static

1,static概述

static是Java 语言中的关键字,表示“静态的”,它可以用来修饰变量、方法、代码块等,修饰的变量叫做静态变量,修饰的方法叫做静态方法,修饰的代码块叫做静态代码块。

在Java 语言中凡是用static 修饰的都是类相关的,不需要创建对象,直接通过“类名”即可访问,即使用用“引用”去访问,在运行的时候也和堆内存当中的对象无关。

2,静态变量

Java 中的变量包括:局部变量和成员变量,在方法体中声明的变量为局部变量,有效范围小,只能在方法体中访问,方法结束之后局部变量内部就释放了,在内存方面局部变量存储在栈当中。

在类体中定义的变量为成员变量,而成员变量又包括实例变量和静态变量,当成员变量声明时使用了static 关键字,那么这种变量称为静态变量,没有使用static 关键字称为实例变量,实例变量是对象级别的,每个对象的实例变量值可能不同,所以实例变量必须先创建对象,通过“引用”去访问,而静态变量访问时不需要创建对象,直接通过“类名“访问。

实例变量存储在堆内存当中,静态变量存储在方法区当中。实例变量在构造方法执行过程中初始化,静态变量在类加载时初始化。那么变量在什么情况下会声明为静态变量呢?

当一个类的所有对象的某个的某个“属性值”不会随着对象的改变而改变的时候,建议将该属性定义为静态属性,静态变量在类加载的时候初始化,存储在方法区中当中,不需要创建对象,直接通过“类名”来访问。

3,静态代码块

静态代码块的语法格式是这样的:

类{
    //静态代码块
    static{
        java 语句;
    }
}

静态代码块实际上是Java 语言为程序员准备的一个特殊时刻,这个时刻就是类加载时刻,如果你想在类加载的时候执行一段代码,那么这段代码就有的放矢了。例如我们要在类加载的时候解析某个文件,并且要求该文件只解析一次,那此时就可以把解析该文件的代码写到静态代码块当中了。看下面一段代码的例子:

public class StaticTest01{
    //静态代码块
    static{
        System.out.println(2);
    }
    //静态代码块
    static{
        System.out.println(1);
    }
    public static void main(String[] args){
        System.out.println("main execute!");
    }
    //静态代码块
    static{
        System.out.println(0);
    }
}
//运行结果如下:
2
1
0
main execute!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阔升

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值