JavaSE--this和static

发布时间 2023-08-09 10:15:25作者: 洛小依ovo

一、static关键字

1、static

  • static翻译为“静态的”
  • 所有static关键字修饰的都是类相关的,类级别的
  • 所有static修饰的,都通过“类名.”的方式访问
  • static修饰的变量:静态变量
  • static修饰的方法:静态方法

成员变量分为:实例变量、静态变量

class VarTest{
    // 以下实例的,都是对象相关的,访问时采用“引用.”的方式访问,需要先new对象
    // 必须先有对象,才能访问,可能会出现空指针异常
    // 成员变量
    int i;
    // 实例方法
    public void m2(){
        
    }
    
    // 以下静态的,都是类相关的,访问时次啊用“类名.”的方式访问,不需要new对象
    // 不需要对象参与,没有空指针异常
    // 静态变量
    static int k;
    // 静态方法
    // 注意::也可以使用“引用.”来访问,不建议用(因为其他程序员看见会困惑)
    public static void m1(){
    
    }
    
}

2、什么时候使用static关键字

// 定义一个类:中国人
class Chinese{
    // 身份证号
    String idCard;// 一个对象一个身份证号,所以应该是实例变量
    // 姓名
    String name;// 一个对象一个姓名
    // 国籍
    // 对于中国人这个类来说 国籍都是“中国”,不会随着对象的改变而改变
    // 显然国籍不是对象级别特征
    // 国籍属于整个类的特征
    static String country = "中国";// 注意::静态变量在类加载是初始化,不需要new对象,静态变量的空间就开出来了
    // 注意::静态变量在方法区
    // 空引用时静态不会为空指针
    
    public Chinese(){
        
    }
    
}

3、关于方法来说:什么是定义为实例方法、什么时候定义为静态方法

  当这个方法体当中,直接访问了实例变量,这个方法一定是实例方法

  大部分情况下,如果是工具类的话,工具类中的方法一般都是静态

4、静态代码块

  1)使用static关键字可以定义:

    静态代码块

  2)静态代码块语法

static{
    java语句;
    java语句;
}

  3)静态代码块什么时候执行

  类加载的时候执行,并且只执行一次

  注意:静态代码块在类加载时执行,并且在main方法之前执行

  4)静态代码块作用

  •   不是很常用(不是每个类当中都用)
  •   静态代码块这种语法机制实际上是sun公司给java 程序员的一个特殊时刻,这个实际叫做类加载时机
    •   具体例子:比如想要记录一下类加载的日志信息(在哪年哪月哪分哪秒哪个类加载到了jvm中)

5、实例语句块

  •   实例块在类加载的时候不会执行
  •   实例块在构造方法之前执行,只要构造方法执行,实例块就会先执行
  •   这叫做对象构建时机

 

public class InstanceCode{
    
    public static void main(String[] args){
        System.out.println("main begin");
        new InstanceCode();
        
    }
    // 实例语句块
    {
        System.out.println("实例语句块执行");
    }
    public InstanceCode(){
        System.out.println("无参构造");
    }
    public InstanceCode(String name){
        System.out.println("有参构造");
    } 
}

 

二、this关键字

1、this

  •   this是一个变量,是一个引用。this保存当前对象的内存地址,指向自身
  •   一个对象一个this。严格来说,this代表的就是“当前对象”,this存储在堆内存当中对象的内部。
  •   this只能使用在实例方法中,谁调用这个实例方法this就是谁
  •   this大部分情况下是可以省略的
  •   this什么时候不能省略
    •   在实例方法中或构造方法中,为了区分局部变量和实例变量
class Customer{
    private String name;
    public Customer(){
        
    }
    /*
        形式参数s没有可读性
    public Customer(String s){
        name = s;
    }
    */
    public Customer(String name){
        this.name = name;
    }
    public void setName(String name){
        this.name = name;
    }
    public void shopping(){
        // this就是当前对象
        System.out.println(this.name + "shopping");
        // this可以省略,省略的话还是默认访问“当前对象”的name
        // System.out.println(name + "shopping");
    }
}

 2、this不仅可以使用在实例方法中,也可以使用在构造方法中

  通过当前的构造方法去调用同一个类中的另一个构造方法,使用新语法格式:this(实际参数);

  注意::this();调用只能出现构造方法的第一行

/*
    定义日期类,可以表示年月日
    无参构造:调用默认创建日期1970年1月1日
    有参构造:
*/
class Date{
    private int year;
    private int month;
    private int day;
    public Date(){
        // 调用无参构造初始化日期为固定值
        // this.year = 1970;
        // this.month = 1;
        // this.day = 1;
        this(1970,1,1);// 构造本类的另一个构造方法
    }
    public Date(int year,int month,int day){
        this.year = year;
        this.month = month;
        this.day = day;
    }
    public void setYear(int year){
        this.year = year;
    }
    public int getYear(){
        return year;
    }
    public void setMonth(int Month){
        this.month = month;
    }
    public int getMonth(){
        return month;
    }
    public void setDay(int day){
        this.day = day;
    }
    public int getDay(){
        return day;
    }
}