why的JAVA自学笔记3 =w=

本文深入解析Java中的静态关键字static的用途,包括静态变量、静态方法和静态代码块的概念及应用场景,探讨其在类加载过程中的行为,以及this关键字在实例方法中的作用。

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

static

1、static翻译为“静态
2、所有static关键字修饰的都是类相关的,类级别的。
3、所有static修饰的,都是采用“类名.”的方式访问
4、static修饰的变量:静态变量
5、static修饰的方法:静态方法

变量的分类:

变量根据声明的位置进行划分:
	在方法体当中声明的变量叫做:局部变量。
	在方法体外声明的变量叫做:成员变量。

成员变量又可以分为:实例变量和静态变量

class Chinese{
int idNumber;//实例变量,**对象级别的变量**,也就是说必须要通过"引用."的方式去访问,是每个对象都独有(**且值不一定一样**)的属性。
static String country;//静态变量,**类级别的变量**,也就是说访问通过"类."的方式,是类中每个对象共同拥有**且值一样**的属性。

在此 Chinese 类中,idNumber是每个对象都有且不一样的,所以是对象级别的数据,定义为实例变量;然而country是每个Chinese中对象共同拥有且值一样的对象,(都是"中国"),如果将其定义为实例变量会造成内存的浪费,不必要。所以定为静态变量 static String country

}

静态变量在类加载时初始化,不需要new对象,静态变量的空间就开出来了。
静态变量存储在方法区。
至于JAVA的内存结构,将在下一篇讲述。

空指针异常只有在什么情况下才会发生呢?
只有在“空引用”访问“实例”相关的,都会出现空指针异常。

如何访问?

//访问实例变量,需要通过对象去访问,如
Chinese c1  = new Chinese();
c1.idNumber;
//访问静态变量,则直接通过类去访问
Chinese.country;

同样,在类中也就有了 实例方法和静态方法

实例方法是
[修饰符列表] [返回值内型] 方法名(参数列表){}
实例方法(实例相关的都需要new对象,使用"引用."来访问。)

静态方法是
[修饰符列表] static [返回值内型] 方法名(参数列表){}
// 静态方法(静态方法不需要new对象,直接使用“类名.”来访问)
// 但是也可以使用“引用.”来访问,不建议用。(因为其他程序员会感到困惑。)

如何判断是使用实例方法还是静态方法?
当这个方法体当中,直接访问了实例变量,这个方法一定是实例方法。

静态代码块

使用static关键字可以定义:静态代码块
语法为

static {
   java语句;
   java语句;
  }

static静态代码块在类加载时执行。并且只执行一次。
也就是说静态代码块在main方法执行之前执行。
且静态代码块一般是按照自上而下的顺序执行。

静态代码块一般在类加载时期使用,具体作用暂时未接触···
也许公司开发需要记录等会用到吧

静态变量

public class Test{
	static int i = 100;
	//这个i就是静态变量,他储存在方法区,类加载时初始化。
}

this

1、this是一个关键字,全部小写。
2、一个对象一个this,是一个变量,是一个引用,保存了当前对象的内存地址,指向自身。this代表的就是“当前对象”,this存储在堆内存当中对象的内部。
3、**this只能使用在实例方法中。**谁调用这个实例方法,this就是谁。
4、“this.”大部分情况下是可以省略的。
5、this不能使用在静态方法中,this表示当前对象,是对象级别的,然而静态方法则是类级别的,里面没有当前对象。

this关键字大部分情况下可以省略,什么时候不能省略呢?
在实例方法中,或者构造方法中,为了区分局部变量和实例变量,
这种情况下:this. 是不能省略的。
主要是为了增强代码可读性。
例如有一个类

class Studnet{
	int id;
	String name;
}

那么我提供2个构造方法(无参和有参)

public Student(){}
public Student(int a,String b){
	id = a;
	name = b;
	//上述代码的确可以执行,完全没问题,但是参数中的a和b是不符合命名规范的,然而如果改为id和name又造成了重复,无法起到构造初始化的作用。此时则需要this了。
}
public Student(int id,String name){
	this.id  =  id;
	this.name = name;
	//这就解决了问题,在这种情况下是不能省略this的。
}

新语法:this()

通过当前的构造方法去调用另一个本类的构造方法,可以使用以下语法格式:
this(实际参数列表);
对于this()的调用只能出现在构造方法的第一行。
完成代码复用的功能。
什么意思呢?例如对于一个日期类,里面包含了 年 月 日 三个属性。

class Date{
	private int year;
	private int month;
	private int day;
}

对于此类有要求:
如果调用无参数构造方法,默认创建的日期为:1970年1月1日。
一般的方法是写两个构造方法

public Date(){
	year = 1970;
	month = 1;
	day = 1;
}
public Date(int year,int month,int day){
	this.year = year;
	this.month = month;
	this.day = day;
}

我们注意到,两个构造方法内部基本一样的,那么就可以在第一个无参数构造方法中写

public Date(){
	this(1970,1,1);
}

这样使代码简洁易懂。

实例方法

{
  System.out.println("实例语句块,构造方法执行一次,这里就执行一次!");
 }

实例方法是写在类体之中,构造方法执行一次,这里就执行一次。
例如,创建一个 Student 类

class Student{
	private int idNumber;

	public Studnet(){
		this(0);//默认idNumber为0
	}//无参数构造方法
	
	public Studetn(int idNumber){//有参数的构造方法
		this.idNumber = idNumber;
	}
	
	//实例语句块
	{
 		 System.out.println("实例语句块,构造方法执行一次,这里就执行一次!");
 	}
}

当在其他地方创建对象时

Student s1 = new Student();

就会输出一次

实例语句块,构造方法执行一次,这里就执行一次!

每调用构造方法(创建对象)时就会调用一次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值