Java关键字
本文涵盖了Java中常见的关键字,并对其逐一详细解释
final
用于修饰类,方法,属性
- 被
final
修饰的类不可以被继承,fianl
类中的方法默认都是final
的,不能被子类重写 - 被
final
修饰的方法不可以被重写 - 被
final
修饰的变量不可以被改变
final,finally,finalize的区别
final
可以修饰类,变量,方法.修饰类表示该类不能被继承,修饰方法表示该方法不能被重写,修饰变量表示该变量不能被重新赋值finally
一般作用在try-catch
代码块中,表示不管是否出现异常,该代码块都会执行,一般用来执行一些关闭资源的代码finalize
是一个方法,属于Object
类的一个方法,而Object
类是所有类的父亲,该方法一般由垃圾回收器来调用,当我们调用System.gc()
方法时,由垃圾回收器调用finalize()
,回收垃圾
this关键字的用法
this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针
this的用法可分为3种:
- 普通的直接引用,this相当于是指向当前对象本身
- 形参与成员变量重名,用this来区分
public Person(String name,int age){
this.name = name;
this.age = age;
}
- 引用本类的构造函数
public Person{
private String name;
private int age;
public Person(){
}
public Person(String name){
this.name = name;
}
public Person(String name,int age){
this(name);
this.age = age;
}
}
super关键字
super可以理解为是指向自己父类对象的一个指针,这个父类是指离自己最近的一个父亲
super也有三种用法:
- 普通的直接引用
与this类似,super相当于是指向当前对象的父亲的引用,这样就可以用super.xxx来引用父亲的成员
- 子类中的成员变量或方法与父类中的成员变量或方法同名时,用super进行区分
class Person{
protected String name;
public Person(String name){
this.name = name;
}
}
class Student extends Person{
private String name;
public Student(String name,String name1){
super(name);
this.name = name1;
}
public void getInfo(){
System.out.println(this.name); //child
System.out.println(super.name); //father
}
}
public class Test{
public static void main(String args[]){
Student s1 = new Student("father","child");
s1.getInfo)();
}
}
- 引用父类构造函数
this与super的区别
- super: 它引用当前对象的直接父类中的成员
- this: 代表当前对象名(在程序中产生二义性之处,使用this来指明当前对象)
- super(参数):调用父类中的某一个构造函数(应写在第一行)
- this(参数): 调用本类中的另一种形式的构造函数(应写在第一行)
- super()和this()的区别:super()是在子类中调用父类的构造方法,this()在本类内调用本类的其他构造方法
- super()和this()均需放在构造方法的第一行
- this和super不能同时出现在一个构造函数里,因为this必然会调用其他的构造函数,其他的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译报错
- this()和super()都指的是对象,所以都**不可以在static环境中使用.包括:static变量,static方法,static语句块
- 本质上,this是一个指向本对象的指针,然而super是一个Java关键字
static存在的意义
static
的主要意义是在于创建独立于具体对象的域变量或方法,以致于即使没有创建对象,也能使用属性和调用方法
static
关键字还有一个比较关键的作用就是用来形成静态代码块以优化程序性能.static
块可以放在类中的任何地方,类中可以有多个static
块,在类初次被加载的时候,会按照static
块的顺序来执行每个static
块,并且只会执行一次
为什么说static
块可以用来优化程序性能?
是因为他的特性:只会在类加载的时候执行一次.因此,可以将一些只需要进行一次的初始化操作都放在static
代码块中进行
static的独特之处
- 被
static
修饰的变量或者方法是独立于该类的任何对象,也就是说,这些变量和方法不属于任何一个实例对象,而是被类的实例对象共享 - 在该类被第一次加载的时候,就会去加载被
static
修饰的部分,而且只在类第一次使用时加载并进行初始化,注意这是第一次用就要初始化,后面根据需要是可以再次赋值的 static
变量值在类加载的时候分配空间,以后创建类对象的时候不会重新分配,赋值的话是可以任意赋值的- 被
static
修饰的变量或方法是优先于对象存在的,也就是说当一个类加载完毕之后,即使没有创建对象,也可以访问
static应用场景
因为static
是被类的实例对象所共享的,因此如果某个成员变量是被所有对象所共享的,那么这个成员变量就应该定义为静态变量
常见应用场景:
修饰成员变量
修饰成员方法
静态代码块
修饰类(只能修饰内部类,也就是静态内部类)
静态导包
static
修饰变量:变量分为两种,一种是被static
修饰的静态变量(类变量),一种是没有被static
修饰的实例变量- 静态变量在内存中只有一个拷贝,
JVM
只为静态变量分配一次内存,在类加载的过程中完成静态变量的内存分配,而实例变量则是每创建一个实例,就会为实例变量分配一次内存,内存中的实例变量可以在内存中存在很多拷贝,但是互不影响 - 静态变量可以通过类名.静态变量直接访问(注意中间有个点’.‘),也可以通过对象.静态变量名(这里也有个点’.')来访问;实例变量只能通过对象名.变量名访问
- 静态变量在内存中只有一个拷贝,
static
变量的初始化按照定义的顺序进行初始化,static
不能修饰局部变量静态变量一般的使用场景:对象之间需要共享值时,方便访问变量
-
static
修饰方法- 静态方法不用生成类的实例就可以调用,即
static
修饰的方法归类所有,可以理解为共享的方法,可以通过类名直接调用,不用消耗资源反复创建对象,因为在类加载的时候静态方法已经在内存中了,直到程序结束才会被内存释放,而实例方法在方法结束后就会被内存收回 - 静态方法只能调用本类的静态成员,不能调用非静态成员
- 静态方法不用生成类的实例就可以调用,即
-
静态方法不能使用任何方式调用this和super关键字(this关键字用于表示当前对象本身,或当前一个类的实例,通过this可以调用本对象的所有属性和方法,成员变量和方法内部的变量名重名时,只能使用this关键字)
-
static
修饰类:一般静态内部类由static
修饰,只能访问外部类的static
成员,不能直接访问外部类的实例方法和实例变量 -
static
修饰代码块static
静态代码块是在类中独立于类成员的static
语句块,静态代码块可以有多个,不在任何方法体内部,JVM
在执行类的加载的时候就会执行这些静态代码块,如果有多个静态代码块,则会按顺序执行- 静态代码块是类加载的时候自动执行的,静态方法是在调用的时候才执行的
注意区分执行和加载的概念
static注意事项
- 静态只能访问静态
- 非静态既可以访问非静态的,也可以访问静态的