第2章 Java编程基础——FAQ2.02 Java中有哪些关键字?
FAQ2.02 Java中有哪些关键字?
才发现Java中的好多关键字都不知道什么意思,特转一遍过来。
Java保留关键字
Java语言有51个关键字,其中const和goto虽然被保留但未使用。你不能使用保留关键字来命名类、方法或变量。
一、保留关键字
数据类型:
Boolean int long short byte float double char class interface
流程控制:
if else do while for switch case default break continue return try catch finally
修饰符:
public protected private final void static strictfp abstract transient
synchronized volatile native
动作:
package import throw throws extends implements this Super instanceof new
保留字:
true false null goto const
二、访问修饰符:
访问修饰符: public , protected , private
* 只能应用于类的成员变量。(局部变量只能在函数的范围内可见,不能使用访问修饰符)
* 能够用来修饰类本身。(protected , private 不能用于顶级类,只能用于内部类)
* 能够应用于成员方法和构造函数。
下面是一个例子:
package Examples;
public class HelloWorld02{
//以下定义了三个了类成员变量
public String str1="Hello"; //可被你程序中的任何其他代码访问
protected String str2="World!"; //程序中同一包的成员和不同包中的该类子类可以访问
private String str3=" "; //仅该类中的成员可以访问
String str=str1+str3+str2; //不使用修饰符的话,变量的访问控制在所在包内为public,
// 不能被所在包外的代码存取
//以下定义了三个使用不同修饰符和不同参数的构造方法。
public HelloWorld(){
System.out.println(str);
}
protected HelloWorld(long l){
System.out.print("Use \"protected\" constructor! And l is ["+l+"] ");
System.out.println(str);
}
private HelloWorld(float f){
System.out.print("Use \"private\" constructor! And f is ["+f+"] ");
System.out.println(str);
}
//声明构造方法为void类型是合法的.不过因为没有返回值,所以不能用来创建新对象.
public void HelloWorld(){
System.out.println(str +" Use the void constructor!");
}
public static void main(String[] args){
HelloWorld hw1=new HelloWorld(); //使用无参数的构造方法
HelloWorld hw2=new HelloWorld(5); // 虽然5是int类型,但会自动提升成long类型
HelloWorld hw3=new HelloWorld(5L);
HelloWorld hw5=new HelloWorld(3.14f); // 但float类型则必须指明,否则会出错
hw5.HelloWorld(); // 无返回值的构造方法只能这样调用
(new HelloWorld()).HelloWorld(); //这里创建了一个匿名类对象并调用无返回值的构造方法
}
}
总结:
请认真思考一下:
(1)public、protected、private 可用来修饰哪些成员?
使用这些修饰符的成员的访问控制是怎样的?
没有指定访问修饰符的成员的访问控制是怎样的?
* public、protected和private可以用来修饰类成员变量、方法、构造方法和内部类;
public可以用来修饰顶级类,但protected和private则不行。
注意事项:
* 每一个java文件中可以包含多个类,但只能存在一个public顶级类,如果声明了两个顶级类的话,则会出现编译错误。
二、部分其他修饰符
this:
Java中定义了this关键字来访问当前对象实例内的成员。当局部变量和类实例内的类变量同名时,在这个局部变量所作用区域内类变量就被隐藏了,必须使用this来指明。
static:
有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它所在类使用,而不必引用所在类的实例。将类中的成员声明为static就能实现这样的效果。声明为static的变量实质就是全局变量。当声明一个对象(某个类的实例)时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。
声明为static的方法有以下三条限制:
* 它们只能访问static数据
* 它们仅能调用其他的static方法
* 它们不能以任何方式引用this或super
实例分析:
package Examples;
public class StaticDemo{
public static void main(String[] args){
System.out.println(MyStaticClass.str); //不用创建MyStaticClass的实例就能访问它的str变量
// System.out.println(MyStaticClass.str2); 这句是错误的。
MyStaticClass msc=new MyStaticClass(); //这里创建MyStaticClass的一个实例
System.out.println("After create instance:");
msc.printString();
}
}
class MyStaticClass{
static String str="Hello World!";
String str2;
void setString(String s){
str2=s;
}
static void setNewString(String s){
str=s;
}
static void printString(){
//setString(str); 在static方法中调用非static方法是错误的
//System.out.println(str2); 也不能访问非static变量
//Java中是先检测static变量再检测static方法的
System.out.println(str); // 可以正常访问static变量
setNewString("Static method is OK!"); //正常调用static方法
System.out.println(str);
}
}
final:
一个变量可以被声明为final,这样做的目的是阻止它的内容被修改。这意味着在声明final变量的时候,你必须初始化它。一个final变量实质上是一个常数,为final变量的所有字母选择大写是一个普遍的编码约定。声明为final的变量在实例中不占用内存。
声明成final的方法不能被重载。通常,Java在运行时动态的调用方法,这叫做后期绑定(late binding);由于被声明为final的方法不能被重载,那么对final方法的调用可以在编译时解决,这叫做早期绑定(early bingding)。
声明为final的类不能被其他类继承。声明一个final类含蓄的宣告了它的所有方法也都是final的。所以,声明一个既是abstract的,又是final的类是不合法的,因为抽象类本身是不完整的,它依靠它的子类提供完整的实现。
strictfp:
Java2向Java语言增加了一个新的关键字strictfp。与Java2同时产生的浮点运算计算模型很轻松的使某些处理器可以以较快速度进行浮点运算(例如奔腾处理器)。这个浮点运算计算模型在计算过程中,不需要切断某些中介值。如果用strictfp来修饰类或方法,可以确保浮点运算(以及所有切断)正如它们在早期Java版本中那样准确(即使用原始的浮点运算模型)。切断只影响某些操作的指数。当一个类被strictfp修饰,所有该类的方法都自动被strictfp修饰。坦白说,很多程序员从未用过strictfp,因为它只对非常少的问题有影响。
native:
有时你希望调用不是用Java语言写的子程序,或者你希望调用一个专用的第三方的库,例如统计学包。虽然这种情况比较少,但Java提供了native关键字,该关键字用来声明本机代码方法。
为声明一个本机方法,在该方法之前用native修饰符,但是不要定义任何方法体。例如:
public native int meth();
声明本机方法后,必须编写本机方法并要执行一系列复杂的步骤使它与Java代码链接。很多本机方法是用C写的。把C代码结合到Java程序中的机制是调用Java Native Interface(JNI)。
transient:
如果用transient声明一个实例变量,当对象储存时,它的值不需要维持。例如:
class T{
transient int a; // will not persist
int b; // will persist
}
这里,如果T类的一个对象被写入一个持久的存储区域,a的内容不被保存,但b将被保存。
volatile:
volatile修饰符告诉编译器被volatile修饰的变量可以被程序的其他部分改变。一种 这样的情形是多线程程序。在多线程程序里,有时两个或更多的线程共享一个相同的实例变量。考虑效率的问题,每个线程可以自己保存该共享变量的私有拷贝。实际的(或主要的)变量副本在不同的时候更新,例如当进入synchronized方法时。当这种方法运行良好时,它在时间上会是低效的。在某些情况下,真正要紧的是变量主副本的值会体现当前的状态。为保证这点,仅需把变量定义成volatile型,它告诉编译器它必须总是使用volatile变量的主副本(或者至少总是保持一些私有的最新的主副本的拷贝,反之亦然),同时,对主变量的获取必须以简洁次序执行,就像执行私有拷贝一样。