JavaSE--this和static
一、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; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?