理解关键字static、this

static

静态属性在Java开发中会经常使用到,它只能在类中和方法上被声明(无法在方法块中声明);
在类中,使用static声明的属性称为静态变量或类变量或类属性;
在方法上,使用static声明的方法称为静态方法;

我们可以通过内存剖析图来看看static在内存中是如何被加载和使用的;

首先声明一个功能类(我这里以Student为例):

package com.project.static00;

public class Student {
	String name;
	int id;
	
	static int ss;
	
	public static void printSS(){
		System.out.println(ss);
	}
	
	public void study(){
		System.out.println(name+"在学习");
	}
	
	public void sayHello(String sname){
		System.out.println(sname + "说:你好");
	}
}

再声明一个Test测试类:

package com.project.static00;

public class Test {
	public static void main(String[] args) {
		Student.ss = 3;
		Student.printSS();
	}
}

然后,我们将这两个类在内存中的形态画出来( 程序在执行过程中的内存分析.):
在这里插入图片描述

内存图分析:

通过内存图我们可以发现,static声明的变量或方法是被加载到方法区当中,而new出来的对象当中并没有static属性和方法,且没有指针指向方法区中的静态属性和方法;
在方法区当中不仅加载了对象的普通方法和属性,且加载了static方法和属性,因此new的新对象无法调用static属性和方法,而通过类名可直接调用(同样静态变量也可通过类名.属性名调用)

static块的作用

写法:

static{
		//代码块:static块中不能访问非static成员
	}

static块的作用为:静态初始化模块;
如果希望加载后,对整个类进行初始化操作,可使用static初始化模块;
值得注意的是:它是在类初始化时执行,而不是创建对象时执行; 静态初始化模块中不能访问非static成员(从内存图中可知,静态属性是被加载到方法区当中的,非静态属性同new出的对象在堆中保存,二者在无参数传递的情况下无联系);

this

this一般用于方法当中,可以是构造方法,也可以是普通方法(构造方法居多);
1:this在普通方法中总是指向“调用该方法的对象”,比如下段代码:

public class Student {
	String name;
	int id;
	
	public void study(){
		this.name = "小明";
		System.out.println(name+"在学习");
	}
}

public class Test{
	public static void main(string []args){
		Student s = new Student();
		s.study();
	}
}

这里的this .name表示其实就是s .name;如果从内存图剖析,我们可以发现,this被作为隐式参数传入到方法区中指定的方法块中(this代表调用对象被程序默认传递,如果不传,堆中无法区分是哪个对象调用的该方法);

2:this在构造方法中总是指向“正要初始化的对象”,举例,如下:

public class Student {
	String name;
	int id;
	
	public Student(){
	}
	
	public Student(String name, int id){
		this(name);
		this.name = name;
		this.id = id;
	}
	
	public Student(String name){
		this.name = name;
	}

从上面代码中我们可以看到this. name指带的是当前初始化及构造方法传递的形参;
另外,在构造器中有一句this(name),这句代表的是调用当前对象中某一个构造器,如果要使用该语句,记住必须放在第一条
注:this不能用于static方法中(static方法只能被加载到方法区当中,新建对象中不能加载static成员,因此this作为隐式参数来代表调用对象传递时,是无法指向方法区中的static方法的)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值