Java标识符
Java 中标识符是为方法、变量或其他用户定义项所定义的名称。标识符可以有一个或多个字符。在 Java 语言中,标识符的构成规则如下。
- 标识符由数字和字母、美元符号($)、下划线以及 Unicode 字符集中符号大于 0xC0 的所有符号组合构成(各符号之间没有空格)。
- 标识符的第一个符号为字母、下划线和美元符号,后面可以是任何字母、数字、美元符号或下划线。
Java区分大小写,因此myvar和MyVar是两个不同标识符
java注释
Java支持三种注释
- 单行注释
- 多行注释,可以嵌套单行注释,但是不能嵌套多行注释和文档注释。
- 文档注释能嵌套单行注释,不能嵌套多行注释和文档注释。
文档注释可以通过 Javadoc 命令把文档注释中的内容生成文档,并输出到 HTML 文件中,方便记录程序信息。还可以包含一个或多个 @ 标签,每个 @ 标签都在新的一行开始。Javadoc 工具识别的标签例:
标签 | 描述 | 示例 |
---|---|---|
@author | 标识一个类的作者 | @author description |
java常量值
整型常量值
- 十进制数形式:如 54、-67、0。
- 八进制数形式:Java 中的八进制常数的表示以 0 开头,如 0125 表示十进制数 85,-013 表示十进制数 -11。
- 十六进制数形式:Java 中的十六进制常数的表示以 0x 或 0X 开头,如 0x100 表示十进制数 256,-0x16 表示十进制数 -22。
整型(int)常量默认在内存中占 32 位,是具有整数类型的值,当运算过程中所需值超过 32 位长度时,可以把它表示为长整型(long)数值。长整型类型则要在数字后面加 L 或 1, 如 697L,表示一个长整型数,它在内存中占 64 位。
浮点常量
- 十进制数形式:由数字和小数点组成,且必须有小数点,如 12.34、-98.0。
- 科学记数法形式:如 1.75e5 或 32&E3,其中 e 或 E 之前必须有数字,且 e 或 E 后面跟着+或-整数。
浮点数后缀可以是f或F表示单精度float型,若后缀为d或D或者无后缀表示双精度double型。
例:123.6 …123e+3 … 123.97E-3D… 12f
布尔型常量值
Java 的布尔型常量只有两个值,即 false(假)和 true(真)。
字符型和字符串常量值
Java 的字符型常量值是用单引号引起来的一个字符,如 ‘e’、E’。需要注意的是,Java 字符串常量值中的单引号和双引号不可混用。双引号用来表示字符串,像 “11”、“d” 等都是表示单个字符的字符串。
转义字符
除了以上所述形式的字符常量值之外,Java 还允许使用一种特殊形式的字符常量值来表示一些难以用一般字符表示的字符,这种特殊形式的字符是以开头的字符序列,称为转义字符。
定义常量
常量不同于常量值,它可以在程序中用符号来代替常量值使用,因此在使用前必须先定义。常量一旦初始化就不可以被修改。为了与变量区别,常量取名一般都用大写字符
语法形式:
final dataType variableName = value
例:
public class HelloWorld {
// 静态常量
public static final double PI = 3.14;
// 声明成员常量
final int y = 10;
public static void main(String[] args) {
// 声明局部常量
final double x = 3.3;
}
}
java 变量的声明和初始化
Java 语言是强类型(strongly typed)语言,强类型包含以下两方面的含义:
- 所有的变量必须先声明、后使用。
- 指定类型的变量只能接受类型与之匹配的值。
声明、初始化、赋值和C语言类似的形式
根据作用域的不同,一般将变量分为不同的类型:成员变量和局部变量。
成员变量
Java 的成员变量有两种,分别是全局变量和静态变量(类变量)。定义在方法体和语句块之外,不属于任何一个方法,作用域是整个类。
例:变量声明代码
public class DataClass {
String name; // 成员变量、实例变量
int age; // 成员变量、实例变量
static final String website = "C语言中文网"; // 成员变量、静态变量(类变量)
static String URL = "http://c.biancheng.net"; // 成员变量、静态变量(类变量)
}
测试类代码如下:
public class Test {
public static void main(String[] args) {
// 创建类的对象
DataClass dc = new DataClass();
// 对象名.变量名调用实例变量(全局变量)
System.out.println(dc.name);
System.out.println(dc.age);
// 对象名.变量名调用静态变量(类变量)
System.out.println(dc.website);
System.out.println(dc.URL);
// 类名.变量名调用静态变量(类变量)
System.out.println(DataClass.website);
System.out.println(DataClass.URL);
}
}
运行结果:
在本例的第一段代码中定义了 4 个成员变量,由输出结果可以看出,name 和 age 显示系统默认初始化的值,website 和 URL 显示初始化的值。且用 static final 修饰的变量必须赋予初始值。
局部变量
局部变量是指在方法或者方法代码块中定义的变量,其作用域是其所在的代码块。可分为以下三种:
- 方法参数变量(形参):在整个方法内有效。
- 方法局部变量(方法内定义): 从定义这个变量开始到方法结束这一段时间内有效。
- 代码块局部变量(代码块内定义):从定义这个变量开始到代码块结束这一段时间内有效。
局部变量在使用前必须被程序员主动初始化值。
方法局部变量
public class Test2 {
public static void main(String[] args) {
int a = 7;
if (5 > 3) {
int s = 3; // 声明一个 int 类型的局部变量
System.out.println("s=" + s);
System.out.println("a=" + a);
}
System.out.println("a=" + a);
}
}
上述实例中定义了 a 和 s 两个局部变星,其中 int 类型的 a 的作用域是整个 main() 方法,而 int 类型的变量 s 的作用域是 if 语句的代码块内。如果在 if 方法外调用变量 s,则会报无法解析该变量的错误。
方法参数变量
作为方法参数声明的变量的作用域是整个方法。
public class Test3 {
public static void testFun(int n) {
System.out.println("n=" + n);
}
public static void main(String[] args) {
testFun(3);
}
}
在上述实例中定义了一个 testFun() 方法,该方法中包含一个 int 类型的参数变量 n,其作用域是 testFun() 方法体内。当调用方法时传递进了一个参数 3,因此其输出控制台的 n 值是 3。
代码块局部变量
代码块局部变量常用于 try catch 代码块中,成为异常处理参数变量。
public class Test4 {
public static void test() {
try {
System.out.println("Hello!Exception!");
} catch (Exception e) { // 异常处理块,参数为 Exception 类型
e.printStackTrace();
}
}
public static void main(String[] args) {
test();
}
}
在上述实例中定义了异常处理语句,异常处理块 catch 的参数为 Exception 类型的变量 e,作用域是整个 catch 块。
public static void main(String[] args) {
char a = 'A'; // 向 char 类型的 a 变量赋值为 A,所对应的 ASCII 值为 65
char b = 'B'; // 向 char 类型的 b 变量赋值为 B,所对应的 ASCII 值为 66
System.out.println("A 的 ASCII 值与 B 的 ASCII 值相加结果为:"+(a+b));
}
java引用数据类型
引用数据类型建立在基本数据类型的基础上,包括数组、类和接口。引用数据类型是由用户自定义,用来限制其他数据的类型。另外,Java 语言中不支持 C++ 中的指针类型、结构类型、联合类型和枚举类型。
引用类型还有一种特殊的 null 类型。所谓引用数据类型就是对一个对象的引用,对象包括实例和数组两种。实际上,引用类型变量就是一个指针,只是 Java 语言里不再使用指针这个说法。
注意:空引用(null)只能被转换成引用类型,不能转换成基本类型,因此不要把一个 null 值赋给基本数据类型的变量。
隐式转换
两种数据类型彼此兼容
目标类型的取值范围大于源数据类型(低级类型数据转换成高级类型数据)
转换规则:
- 数值型数据的转换:byte→short→int→long→float→double。
- 字符型转换为整型:char→int。
自动类型提升有好处,但它也会引起令人疑惑的编译错误。例如,下面看起来正确的程序却会引起问题:
byte b = 50;
b = b * 2; // Type mismatch: cannot convert from int to byte
该程序试图将一个完全合法的 byte 型的值 50*2 再存储给一个 byte 型的变量。但是当表达式求值的时候,操作数被自动的提升为 int 型,计算结果也被提升为 int 型。这样表达式的结果现在是 int 型,不强制转换它就不能被赋为 byte 型。确实如此,在这个特别的情况下,被赋的值将仍然适合目标类型。所以应该使用一个显示的强制类型转换,例如:
byte b = 50;
b = (byte)(b*2);
显示转换
尽管自动类型转换是很有帮助的,但并不能满足所有的编程需要。例如,如果你需要将 double 型的值赋给一个 int 型的变量,你将怎么办?
类似于C语言:
public static void main(String[] args) {
float price1 = 10.9f;
double price2 = 5.8;
int num1 = 2;
int num2 = 4;
int res2 = (int) (price1 * num1 + price2 * num2);
System.out.println("一共付给收银员" + res2 + "元");
}
运算符
运算符也和C语言大同小异
条件运算符
短路与(&&)和短路或(||)能够采用最优化的计算方式,从而提高效率。在实际编程时,应该优先考虑使用短路与和短路或。
逻辑运算符的优先级为:!运算级别最高,&& 运算高于 || 运算。!运算符的优先级高于算术运算符,而 && 和 || 运算则低于关系运算符。结合方向是:逻辑非(单目运算符)具有右结合性,逻辑与和逻辑或(双目运算符)具有左结合性。
Java也提供位运算符
Java 语言中的位运算符分为位逻辑运算符和位移运算符两类,和C语言类似