Java深入解析-透析Java本质的36个话题

基本概念

关键字

goto与const是否为关键字?true、false与null是什么?
goto与const是关键字,还是保留字。true、false与null是字面常量,不是关键字。
在C/C++等语言中,使用goto可以实现程序的跳转,从某些方面来说其提供了一定的方便性,例如,在多重嵌套的循环中,可以直接从内层循环中跳出外层循环。然而,这种跳转却没有任何限制,可以随意地进行,从而打破了正常的程序流程。如果程序中多处使用goto,不仅降低程序的可读性,也会对程序的维护与更新造成影响。因此。为了避免这种情况,java语言取消了goto的使用,取而代之的是使用循环标签。但是,为了避免程序员自行使用goto带来同样的混乱性(例如将方法或变量的名称声明为goto),Java语言仍将goto定义为一个关键字,故也称为“保留字”。const同理,C/C++里面用于声明一个常量,java中用static来实现。
关键字:












abstractassertbooleanbreakbyte
casecatchcharclassconst
continuedefaultdodoubleelse
enumextendsfinalfinallyfloat
forgotoifimplementsimport
instanceofintinterfacelongnative
newpackageprivateprotectedpublic
returnshortstaticstrictfpsuper
switchsynchronizedthisthrowthrows
transienttryvoidvolatilewhile


package chapter1;
public class GotoTest{
public static void main(String[] args){
int[][] array={
{1,20,38},
{28,90},
{60,46,71,100}
};
//int goto=0; 错误,不能使用goto作为标识符。
int number=0;
outer:
for(int i=0;i

标识符

在Java语言中,标识符是区分大小写的,仅当两个标识符的Unicode字符序列完全相同时,这两个标识符才是相同的。
标识符的首字符所对应的代码点必须使得Character类的isJavaIdentifierStart方法返回值为true,后续字符(如果存在后续字符的话)
所对应的代码点必须使得Character类的isJavaIdentifierPart方法返回值为true。并且不能与关键字、布尔字面常量(true、false)和
引用字面常量(null)相同。
应该避免在标识符中使用”$”,尽管”$”可以在标识符中使用,但可能会与编译器的命名相冲突。
当标识符的所有字符都是除了null之外的ASCII字符时,其最大长度可以达到65535(2的16次方-1),如果超过了这个长度,编译器将产生错误信息。


package chapter1;
public class ValidIdentifier{
public static void main(String args[]){
int startNumber=0;
int partNumber=0;
for(int i=0x0000;i<=0x10ffff;i++){
if(Character.isJavaIdentifierStart(i)){
startNumber++;
}
if(Character.isJavaIdentifierPart(i)){
partNumber++;
}
}
System.out.println(“Unicode字符集个数:”+(0x10ffff+1)); //1114112
System.out.println(“可作为标识符首字符的字符个数:”+startNumber); //100801
System.out.println(“可作为标识符一部分的字符个数:”+partNumber); //102903
System.out.println(“二者之差:”+(partNumber-startNumber)); //2102
}
}

package chapter1;
public class User$VIP{
public static void main(String[] args){
User user=new User();
User.VIP vip=user.new VIP();
vip.print();
}
}
class User{
class VIP{
void print(){
System.out.println(“成员类”);
}
}
}

增补字符 转义序列符 八进制转义 Unicode转义

注意转义序列符、八进制转义、Unicode转义的使用。Unicode转义的处理时期要早于转义序列符与八进制转义。
Unicode转义处理时期是在编译器将程序解析成各种符号前就进行的。如果\u后没有接4个十六进制数字,将会产生编译错误,就算是在注释中也不例外。
增补字符(U+10000 ~ U+10FFFF)使用两个代码单元(一个代理对)来表示。因此,所有增补字符都不能使用char类型的常量来表示。
以前U+0000 ~ U+FFFF之间的字符集被称为基本多语言面
增补字符代理对的值区间为U+D800 ~ U+DFFF,该区间没有分配字符。利用这个特征,程序就可以来区分一个char类型的字符到底是单个字符还是一个增补字符的代理字符。


public class Escape{
//char c1=’\u0027’; //Unicode转义 转义之后的结果是‘‘’
//char c2=’\u005c’; //转义之后的结果是’\’
//string s=”\u0022”; //转义之后的结果是“””
//char c3=’\400’; //八进制转义,合理的范围应该是0-255(‘/u0000’-‘/u00ff’),’\400’对应的十进制是256
//char c4=’\28’; //八进制,自然只允许出现0-7这几个数
//char c5=’\u000a’; //报错,相当于在行’后键入一个换行符
//char c6=’\u000d’; //报错,相当于在行’后键入一个回车符,注意:八进制转义或转义字符并不会出现这个问题
}

public class SupplementaryCharacter2{
public static void main(String[] args){
int codePoint=0x28e16; //将代码点转换成字符数组,取得代理对编码值
char[] c=Character.toChars(codePoint);
String s=String.valueOf(c);
System.out.println(“增补字符为:”+s); //开发环境不同,字符显示不同
System.out.println(“String长度:”+s.length()); //2
System.out.println(“String代码点数:”+s.codePointCount(0,s.length())); //1
System.out.println(“高代理字符编码值:U+”+Integer.toHexString(c[0])); //d863
System.out.println(“低代理字符编码值:U+”+Integer.toHexString(c[1])”); //de16
//调用Character方法取得代理对编码值
String high=Integer.toHexString(Character.highSurrogate(codePoint));
String low=Integer.toHexString(Character.lowSurrogate(codePoint));
System.out.println(“高代理字符编码值:U+”+high); //d863
System.out.println(“低代理字符编码值:U+”+low); //de16
//通过代理对取得代码点
int codePoint2=Character.toCodePoint(c[0],c[1]);
System.out.println(“代码点:”+Integer.toHexString(codePoint2)); //28e16
}
}

类型转换


运算符与表达式


String类


方法、构造器与变量


类与接口