Java常见关键字解析
Java关键字与保留字
1,Java 关键字列表 (依字母排序 共50组):
abstract, assert, boolean, break, byte, case, catch, char, class, const(保留关键字), continue, default, do, double, else, enum, extends, final, finally, float, for, goto(保留关键字), if, implements, import, instanceof, int, interface, long, native, new, package, private, protected, public, return, short, static, strictfp, super, switch, synchronized, this, throw, throws, transient, try, void, volatile, while
2,保留字列表 (依字母排序 共14组),Java保留字是指现有Java版本尚未使用,但以后版本可能会作为关键字使用:true,false,null,byValue, cast, future, generic, inner, operator, outer, rest,var, goto (保留关键字) , const (保留关键字)
3、goto和const是保留字也是关键字。
java标识符
标识符就是用于Java程序中变量,类,方法等命名的符号,
1Java标识符只能由数字、字母、下划线_或$符号以及Unicode字符集组成
[2]Java标识符必须以字母、下划线“_”或“$”符号以及Unicode字符集开头
[3]Java标识符不可以是Java关键字、保留字(const、goto)和字面量(true、false、null)
[4]Java标识符区分大小写,是大小写敏感的
1、 构造器
1、 this关键字
this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。
类方法不能用this调用。
2、 static关键字
static方法就是没有this的方法。
在static方法内部不能调用非静态方法;而在非静态方法中是可以调用静态方法的,且可以在没有创建任何对象的前提下。
static不能修饰成员变量,即static修饰字段的语句行不能出现在main方法及其它方法中。Java中静态变量只能在类主体中定义,不能在方法中定义。 静态变量属于类所有而不属于方法。
2、 访问控制权限
![](https://images2017.cnblogs.com/blog/814455/201710/814455-20171014224837746-1755801865.png)
2.1、 private:你无法访问的
只能当前类能够访问private修饰的变量或方法
2.2、 default:包访问权限(默认default)
同一个包内的所有类都可以访问没有修饰符(即默认)的变量或方法。即当前的包中的所有其他类对那个成员都有访问权限,但对于包之外的类,却是不能访问该成员的。
取得对某成员访问权的途径有如下方式:
1. 用public修饰成员,任何人在任何地方都有访问权限
2. 不加访问权限修饰词,并将其他类放在同一包内
3. 继承,继承来的类可以访问父类的public成员和protected成员
4. 提供get和set方法,以读取和改变数值(JavaBeans的基本原理)
2.3、 protected:继承访问权限
基类的protected成员只有派生类能够访问(同一包内的其他类也可以访问)
2.4、 public:接口访问权限
所有的类都可以访问。对于接口来说只能使用public修饰。
2.5、 类的访问权限
为了控制某个类的访问权限
- 修饰词必须出现于class之前(默认修饰(去掉public)为包访问控制权限)
- 每个编译单元(文件)都只能有一个public类。
- public类的名称必须与含有该编译单元的文件名相同(包括大小写)
- 编译单元内完全不带public修饰也有可能。在这种情况下可以随便对文件命名。
注意
-
类不可以是private,及protected的。只能是public或默认包访问权限。(实际上内部类可以使private或protected,但这是一个特例)
-
如果不希望其他任何人对该类有访问权限,可以把所有的构造器都指定为private,从而阻止任何人创建该类的对象。
在这种情况下可以在该类的static成员内部创建,例如:
//第一种方式
class Soup1{
private Soup1(){
}
public static Soup1 makeSoup(){
return new Soup1(); //通过静态成员创建该类的对象
}
}
//第二种方式(用到了设计模式-单例模式)
class Soup2{
private Soup2(){
}
private static Soup2 ps1 = new Soup2();
public static Soup2 acess(){
return new Soup1(); //通过静态成员创建该类的对象
}
pubblic void f(){
}
}
3、 final关键字
3.1、 final数据
1、 final关键字可以用于成员变量、本地变量、方法以及类。
2、 final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。
3、 你不能够对final变量再次赋值。
4、 本地变量必须在声明时赋值。
5、 在匿名类中所有变量都必须是final变量。
6、 final方法不能被重写。
7、 final类不能被继承。
8、 没有在声明时初始化final变量的称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。
final+基本数据类型:在Java中对基本数据类型用final修饰表示这类变量可在编译时执行计算式,减轻运行负担,但在定义时必须对其进行赋值。
final+static+基本类型数据:即编译期常量,只占据一段不能改变的存储空间。将用大写表示,并使下划线分隔各个单词。
final+对象或数组(数组也是一个对象):final使引用恒定不变。一旦引用被初始化指向一个对象,就无法把它改为指向另一个对象。但对象自身是可变的。
注意:不能因为某个数据是final的就认为它在程序编译完成时就知道他的值了,也可能实在程序执行运行时才知道他的值的。例如private final value = rand.nextInt(20),在编译完成时并不知道value的值,在程序执行运行后才知道它的值的。
空白final:例如private final int num;
final在使用时一般在定义处赋值,而对于这种空白final定义类型没有在定义处赋值就必须在构造器中赋值。
final参数:当final用来修饰参数时,
若修饰的参数为基本类型参数(final int i),则基本类型的值不能被改变,即只能读不能执行i++,i--等改变i的值的操作。否则不能编译。
若修饰的参数为对象(final Car car)时,不能更改指向的对象的参数引用;如car = new Car()就是错误的用法。
3.2、 final方法
final修饰的方法,无法被覆盖。
注意:其实类中的所有private方法都隐式地指定为final的。所以private final void f() 这种写法编译器不会不报错的。 由于private修饰的方法子类是访问不到的,子类更加不可能去覆盖了,所以与final修饰的方法无法被覆盖并不冲突。
3.3、 final类
final修饰的类不能被继承。
final修饰的类中的类成员跟普通的类的类成员没有区别;但是final类中的方法都是隐式指定为final类型的。
String
String str1 = "hello";
String str2 = "he" + new String("llo");
System.err.println(str1 == str2);
String str1 = "hello";这里的str1指的是方法区的字符串常量池中的“hello”,编译时期就知道的; String str2 = "he" + new String("llo");这里的str2必须在运行时才知道str2是什么,所以它是指向的是堆里定义的字符串“hello”,所以这两个引用是不一样的。
如果用str1.equal(str2),那么返回的是True;因为两个字符串的内容一样。
instanceof
o instanceof Class 若instanceof左边的参数为null,则返回FALSE。
transient
Java的Serializable提供了一种序列化对象实例的机制。当序列化对象时,可能有一个特殊的对象数据成员,我们不想用Serializable机制来保存它。为了在一个特定对象的一个域上关闭Serializable,可以在这个域前加上关键字transient。
transient是Java语言的关键字,用来表示一个域不是该对象序列化的一部分。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的。