基础不牢,地动山摇!!!
一些相关的名词
关键字,修饰符,标识符
-
关键字:
Java关键字是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字,还有特别意义的变量。Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名和参数。
关键字汇总和解释详见下表:
关键字 | 含义 |
---|---|
abstract | 表明类或者成员方法具有抽象属性 |
assert | 断言,用来进行程序调试 |
boolean | 基本数据类型之一,声明布尔类型的关键字 |
break | 提前跳出一个块 |
byte | 基本数据类型之一,字节类型 |
case | 用在switch语句之中,表示其中的一个分支 |
catch | 用在异常处理中,用来捕捉异常 |
char | 基本数据类型之一,字符类型 |
class | 声明一个类 |
const | 保留关键字,没有具体含义 |
continue | 回到一个块的开始处 |
default | 默认,例如,用在switch语句中,表明一个默认的分支。Java8 中也作用于声明接口函数的默认实现 |
do | 用在do-while循环结构中 |
double | 基本数据类型之一,双精度浮点数类型 |
else | 用在条件语句中,表明当条件不成立时的分支 |
enum | 枚举 |
extends | 表明一个类型是另一个类型的子类型。对于类,可以是另一个类或者抽象类;对于接口,可以是另一个接口 |
final | 用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变,用来定义常量 |
finally | 用于处理异常情况,用来声明一个基本肯定会被执行到的语句块 |
float | 基本数据类型之一,单精度浮点数类型 |
for | 一种循环结构的引导词 |
goto | 保留关键字,没有具体含义 |
if | 条件语句的引导词 |
implements | 表明一个类实现了给定的接口 |
import | 表明要访问指定的类或包 |
instanceof | 用来测试一个对象是否是指定类型的实例对象 |
int | 基本数据类型之一,整数类型 |
interface | 接口 |
long | 基本数据类型之一,长整数类型 |
native | 用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的 |
new | 用来创建新实例对象 |
package | 包 |
private | 一种访问控制方式:私用模式 |
protected | 一种访问控制方式:保护模式 |
public | 一种访问控制方式:共用模式 |
return | 从成员方法中返回数据 |
short | 基本数据类型之一,短整数类型 |
static | 表明具有静态属性 |
strictfp | 用来声明FP_strict(单精度或双精度浮点数)表达式遵循IEEE 754算术规范 |
super | 表明当前对象的父类型的引用或者父类型的构造方法 |
switch | 分支语句结构的引导词 |
synchronized | 表明一段代码需要同步执行 |
this | 指向当前实例对象的引用 |
throw | 抛出一个异常 |
throws | 声明在当前定义的成员方法中所有需要抛出的异常 |
transient | 声明不用序列化的成员域 |
try | 尝试一个可能抛出异常的程序块 |
void | 声明当前成员方法没有返回值 |
volatile | 表明两个或者多个变量必须同步地发生变化 |
while | 用在循环结构中 |
-
修饰符:
修饰符是java关键字其中的一部分,其是用来修饰类名,方法名,变量名,以达到控制其访问权限,功能定义的目的
修饰符的学习比一般关键字要更加深入和重要
-
标识符:
Java 中标识符是为方法、变量或其他用户定义项所定义的名称。标识符可以有一个或多个字符。在 Java 语言中,标识符的构成规则如下。
标识符由数字(0~9)和字母(A~Z 和 a~z)、美元符号($)、下划线(_)以及 Unicode 字符集中符号大于 0xC0 的所有符号组合构成(各符号之间没有空格)。标识符的第一个符号为字母、下划线和美元符号,后面可以是任何字母、数字、美元符号或下划线。
另外,java标识符区分大小写,因此name和 Name是两个不同的标识符。
标识符可以理解为用户自定义的“关键字”,标识符虽然有自己的书写规则,但是通常规范来说标识符应当遵守“小驼峰”规则。最好不要用特殊字符开头,会影响代码可阅读性。在遵守规范的前提下,标识符可以按照开发者意愿命名。基本没有什么学习成本
这三个名词概念对于java程序员来说应当是基础中的基础,但是由于本人总是混淆,特此记录。
其中修饰符最为重要并且有一定的学习难度
范围:标识符>关键字>修饰符
修饰符
我从前认为java修饰符分为两类,即:访问修饰符,非访问修饰符。这个认知本质上没有问题,但是在我查阅资料之后我意识到在这个分类的上层概念还有一个分类,即:类修饰符,方法修饰符,变量修饰符。其中的每一类再细分为访问修饰符和非访问修饰符。以此方可以更加清晰的掌握修饰符的用法
类修饰符
访问修饰符:
public(公共类修饰符)
-
public :java有且仅有一个公共类访问修饰符:public,其表示公共的,在同一个工程里的其他文件都可以import这个类
问:类必须用public修饰嘛?
答:并不是,这存在两种情况:
第一种公共类不用public修饰,那么上面说到公共类有且仅有一个访问修饰符public。如果不用public修饰怎么办呢?不是自相矛盾么,其实不用public修饰的意思是不写访问修饰符,即缺省修饰符的写法(在有的文档里解释为default或者friendly。我不主张这种说法,这存在误导性,实际上Java中并没有名为default或者friendly的访问修饰符(即不能使用default或者friendly定义类或变量),只是为了方便标识缺省访问控制符的情况,写这样的代码是直接报错的)。这种情况我们直接理解为不写访问修饰符,那么此时主类的访问权限便被控制在了同包里。
第二种情况是内部类,内部类是可以被public,protected,缺省,private修饰的。内部类我们用类成员去理解即可
非访问控制符:
abstract(抽象类修饰符 ) 、 final(最终类修饰符)
-
abstract :用 abstract 修饰符修饰的类,被称为抽象类。(有关抽象类的概念我将在其他文章记录)
-
final :当一个类不能被继承时可用修饰符 final修饰为最终类。被定义为 final 的类通常是一些有固定作用、用来完成某种标准功能的类。
方法修饰符
访问修饰符
public(公共访问修饰符)、protected(保护访问修饰符)、缺省访问控制符、private(私有访问修饰符)
-
public:同工程范围
-
protected:同包加子类
-
缺省:同包
-
private:同类,只允许自己访问(从这里可以看出private不能用来修饰类是有原因的,类如果私有了,还有什么意义呢)
非访问修饰符
abstract(抽象方法修饰符) 、static(静态方法修饰符)、final (最终方法修饰符)、native (本地方法修饰符)、synchronized(同步方法修饰符)
-
abstract : abstract 修饰的方法称为抽象方法。抽象方法仅有方法头,没有方法体和具体实现。
-
static :用修饰符 static 修饰的方法称为静态方法。静态方法是属于整个类的类方法;而不使用static 修饰、限定的方法是属于某个具体类对象的方法。 由于 static方法是属于整个类的,所以它不能操纵和处理属于某个对象的成员变量,而只能处理属于整个类的成员变量,即 static 方法只能处理 static的域。(静态域的理解区分类和实例的概念就明白了,类的属性行为可以理解为静态的。而类实例化得到的对象的属性行为则不是静态的,静态的行为属性是在程序初始化就加载到内存的,同时需要注意的是对象可以访问静态域的行为属性,但是类不能访问对象的行为属性)
-
final :用修饰符 final修饰的方法称为最终方法。最终方法是功能和内部语句不能更改的方法,即最终方法不能重写覆盖。final固定了方法所具有的功能和操作,防止当前类的子类对父类关键方法的错误定义,保证了程序的安全性和正确性。所有被 private 修饰符限定为私有的方法,以及所有包含在 final 类 ( 最终类) 中的方法,都被认为是最终方法。
-
native :用修饰符 native 修饰的方法称为本地方法。为了提高程序的运行速度,需要用其它的高级语言书写程序的方法体,那么该方法可定义为本地方法用修饰符 native 来修饰。(感觉不常用)
查看Thread.start()方法的源码,可以看到下面代码块
public synchronized void start() { if (threadStatus != 0) throw new IllegalThreadStateException(); group.add(this); boolean started = false; try { start0(); started = true; } finally { try { if (!started) { group.threadStartFailed(this); } } catch (Throwable ignore) { } } } private native void start0();
其中 private native void start0();
就用了native修饰符,这个方法表示启动本地操作系统的一个新线程,
-
synchronized :该修饰符主要用于多线程程序中的协调和同步。
变量修饰符
访问控制符
public (公共访问修饰符)、protected(保护访问修饰符) 、缺省访问修饰符、private(私有访问修饰符)
-
public:用 public 修饰的域称为公共域。由于 public 修饰符会降低运行的安全性和数据的封装性,所以一般应减少 public 域的使用。
-
protected:用 protected 修饰的成员变量可以被三种类所引用:①该类自身;②同一个包中的其它类;③其它包中的子类。
使用修饰符 protected 的主要作用是允许其它包中的子类来访问父类的特定属性。
-
缺省:没有访问控制符的成员变量可以被该类本身或同一包中的其他类访问。
-
private:private 修饰的成员变量只能被该类自身所访问,不能被其它任何类 ( 包括子类 ) 访问。
非访问控制符
static (静态域修饰符)、 final(最终域修饰符) 、volatile (易失 ( 共享 ) 域修饰符)、transient(暂时性域修饰符)。
-
static :用 static修饰的成员变量仅属于类的变量,而不属于任何一个具体的对象,静态成员变量的值是保存在类的内存区域的公共存储单元,而不是保存在某一个对象的内存区间。该类的任一对象访问它时取到的都是相同的数据;该类的任一对象修改它时 , 也都是对同一个内存单元进行操作。
-
final :最终域修饰符 final 是用来定义常量的。一个类的域 ( 成员变量 ) 如果被修饰符 final 说明,则它的取值在程序的整个执行过程中都是不变的。
-
volatile :易失 ( 共享 ) 域修饰符 volatile是用来说明这个成员变量可能被几个线程所控制和修改。也就是说在程序运行过程中,这个成员变量有可能被其它的程序影响或改变它的取值。通常 volatile 用来修饰接受外部输入的域。
-
暂时性域修饰符 transient :暂时性域修饰符 transient 用来定义一个暂时性变量。其特点是:用修饰符transient 限定的暂时性变量,将指定 Java虚拟机认定该暂时性变量不属于永久状态,以实现不同对象的存档功能。否则,类中所有变量都是对象的永久状态的一部分,存储对象时必须同时保存这些变量。
(JPA中有一个@Transient注解,可以做到不报存被该注解修饰的字段,与transient有相同的意思)
访问控制修饰符总结
访问级别 | 访问控制修饰符 | 同类 | 同包 | 子类(不同包) | 不同包(其他类) |
---|---|---|---|---|---|
公共 | public | 允许 | 允许 | 允许 | 允许 |
受保护 | protected | 允许 | 允许 | 允许 | 不允许 |
默认 | 缺省修饰符 | 允许 | 允许 | 不允许 | 不允许 |
私有 | private | 允许 | 不允许 | 不允许 | 不允许 |
注意:protected修饰的属性或方法,允许不同包的子类中访问。注意这里的访问方式是通过继承访问父类中的protected属性或方法,而不是直接通过父类实例访问protected属性或方法
本文部分内容参考老鼠只爱大米