this、final和static关键字的使用

this、final和static关键字的使用

方法是用于操作对象以及它们的实例域。下面就是一个方法

public void raiseSalary(double byPercent)
{
	double raise = salary*byPercent/100;
	salary += raise;
}

在这个方法当中有两个参数。
第一个参数称为隐式参数,是出现在方法名前的Emloyee类对象。也可以叫方法调用的目标或者说接收者。
第二个参数就是位于方法名后面括号中的数值,这是一个显式参数。
关键字this用来表示隐式参数,他代表对象本身。
关于this的使用
①this.属性名,用来区分属性和方法当中的参数,很好的将实例域与局部变量明显的区分开来。
就比如说

private String name;
private double salary;
public Emloyee(String name,double salary){
	this.name = name;
	this.salary = salary;
}

就很好的做到了这一点。但是要注意static中是不可以使用this关键中的,因为static是类元素,不是对象元素。也可以这么理解,用到this关键字,是指当前对象,而static是无法写一个对象的。
②this.方法名,调用当前对象的某个方法。
③this()可以访问构造函数,也只能访问构造函数,不可以访问普通函数。

public Employee(String name,double salary){
	this.name = name;
	this.salary = salary;
}
public Employee(){
	this("张三","10000.0");
}

final关键字

可以将实例域定义为final。构建对象时必须初始化这样的域,一经赋值,不可以再更改。

final大多应用于基本类型域,或不可变类的域(如果类中的每个方法都不会改变其对象,这种类就是不可变类),比如String类。
但是对于可变类而言,final修饰引用数据类型的时候,对其初始化之后就不能让其指向其他对象。但是,这里指的是指向地址不能发生变化,对象的内容是可以发生改变的。

如果final修饰类,这个类是不能被继承的。同样,继承一个类,父类中有方法带有final关键字,子类是不可以对这个方法重写的。但是由于子类只能继承父类的public方法,如果父类中private方法加了final关键字,子类是可以对这个方法“重写”的,准确的来说,不能称为重写,应该叫重新定义,因为压根就没有继承这个方法,所以加不加final和子类没有关系。

注意:final关键字要慎用,如果要修改fina变量,引用其的所有文件全部要重新部署,只重新部署修改的java文件对应的class文件是没用的,因为java编译器在访问final变量时,直接存储到了引用的类文件自身的副本里。所以慎用。

static关键字

static的关键理念在于共享,同一个类中所有对象都用到的方法,变量,如果我们在堆内存,每创建一个对象,就要开辟一部分内存来存储这些,显然太浪费内存了。于是Java设计者,就设计了一个静态存储区(方法区中)用来存储不同对象中有的相同内容。当然只有被static修饰的方法才能放入静态存储区中,(main方法也存储在静态存储区中)

静态变量(static修饰变量)用的比较少(一变全变),静态常量(static final修饰变量)用的比较多,一经初始化就不可更改,且所有对象共用此静态常量。

静态方法,静态方法是一种不能向对象实施操作的方法,所以不能使用this关键字。换句话说就是,属于类但是不属于类对象的函数。不能通过静态方法改变或者获取当前对象状态

public static int getNextId(){
	return nextId;
}

调用static方法的两种方式
①类名.方法名

int n = Employee.getNextId;

②对象名.方法名

Employee employee = new Employee();
int n = employee.getNextId;

但是其实第二种的调用方式和当前对象没有任何关系

在静态方法中,是不能访问非静态成员变量和非静态成员方法,道理很简单,因为静态方法是脱离对象的,不变的,而非静态成员变量和非静态成员方法都是会改变的。
非静态方法中可以访问到静态成员变量和方法。

有两种情况使用静态方法
①一个方法不需要访问对象状态,其所需参数都是通过显示参数提供的。
②一个方法只需要访问类的静态域

以下在JVM中类的加载过程
在这里插入图片描述
在准备阶段,正式为类变量(static变量)分配内存,并设置类变量的初始值,这个初始值不是定义被设置的值而是0,或null这些内存都将在方法区进行分配
初始化阶段,是执行类构造器()方法的过程,这个类构造器()方法是由编译器自动收藏类中的所有类变量的赋值动作和静态语句(static块)中的语句合并产生。

在执行过程中static块先执行,然后才是main方法。

我们可以通过JVM中类的加载过程,分析一下final,static,static final修饰的字段赋值的区别

static修饰的字段我们可以从图中看出,在链接的准备阶段就被初始化。然后在初始化阶段在类的构造器中被赋值。

final修饰的字段,其实final对于变量、方法的存储区域是没有任何影响的,只不过定义了final关键字的类,地址不许更改,变量的值不许改变
那就会有人说,final没影响有什么好放在一起说的?
这是因为 static final修饰的字段【仅限于基本类型和String(常量池中只能引用到基本类型和String的字面量)】在javac编译是会生成一个constantValue属性,这个属性的作用就是通知虚拟机自动为静态变量赋值,也就是说类加载的链接的准备阶段直接把constantValue的值赋给该字段,在这个阶段就放入了常量池中。

在一个类的定义时,如果是fianl变量,每创建一次对象,就可以赋值一次,而static变量在类装载时就已经被初始化了,创建多少个对象,他还是他,如果被static final所修饰,那么这个变量不仅在类装载时就被初始化,而且还不可更改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值