Java 关键字详解
简介:java关键字是有特别意义的标识符,用来表示一种数据类型或者程序的结构等,关键字总共51个,见如下分类,关键字不能用作变量名、方法名、类名、包名和参数
数据类型10个:boolean、int、long、short、byte、float、double、char、class、interface;
流程类型14个:if、else、do、while、for、switch、case、default、break、continue、return、try、catch、finally;
修饰符12个:public、protected、private、final、void、static、strict、abstract、transient、synchronized、volatile、native;
动作10个:package、import、throw、throws、extends、implements、this、supper、instanceof、new;
保留字5个:true、false、null、goto、const。
一、this(当前对象)
1. 作用:用于任何实例方法内指向当前对象、也可指向对其调用当前方法的对象、或者需要当前类型对象引用时使用;
2. this.属性名
当一个类的属性(成员变量)名与访问该属性的方法参数名相同时,则需要使用 this 关键字来访问类中的属性,以区分类的属性和方法中的参数;
3. this.方法名
A. Java允许对象的一个成员直接调用另一个成员,可以省略 this 前缀,但最好加上,增加阅读性;
B. static修饰的方法中不能使用 this 引用,静态成员不能直接访问非静态成员;
4. this() 访问本类构造方法
A. this()只能写在构造方法中,且必须是第一条语句。
二、static(静态变量和静态方法)
1. 概念
A. 静态变量(类变量):用static修饰的属性,属于类,使用类名.属性调用;
B. 静态方法(类方法):用static修饰的方法,属于类,使用类名.方法调用;
C. 成员变量:包含静态变量和实例变量;
2. 静态变量和实例变量的区别
静态变量
A. 运行时,Java 虚拟机只分配一次内存,在加载类的过程中完成静态变量的内存分配;
B. 在类的内部,可以在任何方法内直接访问静态变量;
C. 在其他类中,可以通过类名访问该类中的静态变量;
实例变量
A. 每创建一个实例,Java 虚拟机就会为实例变量分配一次内存;
B. 在类的内部,可以在非静态方法中直接访问实例变量;
C. 在本类的静态方法或其他类中则需要通过类的实例对象进行访问;
3. 静态方法和实例方法的区别
A. 静态方法不需要通过它所属的类的任何实例就可以被调用;
B. 在实例方法中可以直接访问所属类的静态变量、静态方法、实例变量和实例方法;
C. 在访问实例方法时,需要通过实例对象来访问,而在访问静态方法时,可以直接访问,也可以通过类名来访问,还可以通过实例化对象来访问;
4. 静态代码块
A. 类中的 static{ } 静态代码块,主要用于初始化类,为类的静态变量赋初始值,提升程序性能,注意非静态代码块就是不用static修饰{};
B. 静态代码块类似于一个方法,但它不可以存在于任何方法体中;
C. 若需要进行一次的初始化操作都放在 static 代码块中进行;
D. 类中可包含多个静态代码块,则会按顺序依次执行它们,每个静态代码块只会被执行一次。
5. 初始化顺序
A. 静态变量和静态代码块优先于实例变量和普通语句块,静态变量和普通语句块的初始化顺序取决于它们在代码中的顺序;
B. 继承:父类(静态变量、静态语句块) > 子类(静态变量、静态语句块) > 父类(实例变量、普通语句块) > 父类(构造函数) > 子类(实例变量、普通语句块) > 子类(构造函数)。
三、final(不可改变)
1. final修饰变量
A. final修饰的成员变量称为常量,字母应全部大写;
B. final修饰的成员变量若在声明时没有赋值的叫"空白final变量",空白final变量必须在构造方法或静态代码块中初始化;
C. final修饰的局部变量必须初始化值;
D. 对基本类型变量来说是其值不可改变,而对引用类型变量来说是其引用的地址值不可再变,但引用指向对象里的内容是可以发生改变的;
2. final修饰方法:方法仅仅是不能被重写,并不是不能被重载;
3. final修饰类:表示该类是无法被其他类继承。
四、synchronized(锁)
1. 锁分类
按使用位置划分:
A. 同步方法锁:synchronized修饰普通方法,锁对象为this,若修饰静态方法,则由对象锁变为类锁;
B. 同步代码块锁:可以是this,也可以是自定义对象,若指定锁对象为class对象,则由对象锁变为类锁;
按作用域划分:
A. 对象锁:锁在当前实例上,可以是this,也可以是自定义对象;
B. 类锁:锁在Class类上,无论哪个线程访问它,需要的锁只有一把;
2.