Java基础语法(一)
目录道阻且长,行则将至,行而不辍,未来可期。 ——《荀子·修身》
一、Java注释
-
单行注释
// Java的单行注释
-
多行注释
/* Java的多行注释 */
-
文档注释
/** Java的文档注释 */
特点:
- 注释主要是用来帮助人们更好地理解代码。
- 注释的内容不参与编译,即不会将其编译到 class 字节码文件里。
- 多行注释和文档注释不能嵌套使用!
二、关键字和保留字
关键字:Java 事先定义好并赋予了特殊含义的单词,每个关键字都有特殊作用,这里就不一一列举。
保留字关键字:现在 Java 版本尚未使用,但以后可能会赋予特殊含义的单词:goto、const。
注意:
- 所有的关键字都是小写的。
- 程序中的标识符不能以关键字命名。
- true、false 和 null 不属于关键字,但在 Java 中也有其特殊的含义,标识符命名时也要避开。
三、标识符
标识符:在程序中定义一些符号来标记一些名称,如包名、类名、方法名、参数名、变量名等。
-
定义标识符规则:
标识符可以由字母、数字、下划线(_)和美元符号($)组成,但标识符不能以数字开头,不能是 Java 中关键字,不能含空格。
不遵守命名规则,编译不通过。
-
标识符命名规范:
- 包名所有字母一律小写。
- 类名和接口名首字母大写,采用驼峰式命名。例如:HelloWorld
- 变量名和方法名首字母小写,采用驼峰式命名。例如:helloWorld
- 常量名所有字母一律大写,每个单词之间用下划线连接。例如:DAY_OF_MONTH
- 标识符取名尽量做到见名知意,最好不要用拼音。
注:Java采用Unicode字符集,因此标识符可以采用汉字命名,但不建议。
四、数据类型
Java是一门强类型语言,所有变量必须先定义才能使用。
Java的数据类型可以分为两大类:基本数据类型 和 引用数据类型。
基本数据类型:四大类八大类型。
一些注意事项:
- 在为一个 long 类型的变量赋值时,所赋的值后面要加上一个字母 L (最好是大写),说明赋值为 long 类型。如果赋的值未超过 int 类型的取值范围,则可以省略 L 。
long a1 = 20000000000; //报错(Integer number too large)
//原因:右边的20000000000为int类型,所赋的值超过int型的取值范围
long a2 = 20000000000L; //所赋的值未超过int型的取值范围,后面必须加上字母L
long a3 = 100; //所赋的值未超过int型的取值范围,后面可以省略字母L
long a4 = 100L; //所赋的值未超过int型的取值范围,后面可以加上字母L
-
在 Java 中,一个整数被默认为 int 类型的值,而一个小数被默认为 double 类型的值。
-
为一个 float 类型的变量赋值需要注意,所赋值的后面一定要加上字母 F (或 f )。
而 double 类型的变量赋值时,可以在赋的值后面加上字母 D (或d),也可以不加。
float f1 = 12.3F;
float f2 = 12.3; //报错,由于小数默认为double类型,将double类型的值赋给float类型的变量需要强制转换(后面讲到)
double d1 = 12.3D;
double d2 = 12.3;
- 字符类型变量用于存储单一字符,在给 char 类型变量赋值时,需要用一对英文半角格式的单引号 ' ' 把字符括起来;也可以将 char 类型的变量赋值为 0~65535 范围内的整数,计算机会自动把整数转换为对应的字符。
char c1 = 'A'; //为一个char类型的变量赋值字符 A
//char c = 'AB' 报错(编译不通过),只能赋一个字符,可以是中文、英文...,也可以是转义字符
char c2 = 65; //为一个char类型的变量赋值整数 65,相当于赋值字符为 A
- 布尔类型的变量只有两个值,即 true 和 false。缺省默认为 false。
变量的类型转换:分为自动类型转换和强制类型转换。
为什么需要类型转换:运算中,不同类型的数据需要转换为相同类型,然后才能运算。
-
自动类型转换(也叫隐式类型转换)
需满足两个条件:第一是两种数据类型相互兼容;第二是 变量类型 高于 值的类型 的取值范围。
低------------------------------------------------>高 byte/char/short -> int -> long -> float -> double 注:布尔类型不能参与转换 double d = 128; //结果输出为128.0,自动类型转换
-
强制类型转换(也叫显式类型转换,条件:变量类型 低于 值的类型)
缺点:容易造成数据精度丢失。当小数类型的值强制转换为整数时,直接舍去小数部分!
//强制类型转换格式 目标类型 变量名 = (目标类型)值; byte b = (byte)128; //结果输出b为-128,跟内存溢出有关 int i = (int)3.9; //结果输出i为3
注意:表达式类型自动提升:变量在表达式中进行运算时,有可能发生自动类型转换
//例如:一个byte类型的变量在运算期间类型会自动提升为int型后参与运算
byte b1 = 3;
byte b2 = 4;
//byte b3 = b1 + b2; 报错,
//原因:在表达式 b1 + b2 运算期间,变量b1和b2都被自动提升为int类型,表达式的运算结果也为int型,这是赋给byte类型变量就会报错
byte b3 = (byte)(b1+b2); //输出b3为7
//注:当byte、short、char类型的数据参与运算时,运算结果均被自动提升为int型!
五、常量(Constant)
常量:初始化后不能再改变值,不会变动的数据。
//定义语法
final 常量名 = 值;
//例如:定义圆周率常量 PI,常量名一般使用大写字符
final double PI = 3.14;
六、变量(variable)
- (一)变量概念:
在程序运行期间,用来存放程序产生的临时数据的内存单元称为变量。每个变量都要有一个标识符(名称)标识,即为变量名,内存单元中存储的数据就是变量的值。
并且顾名思义,变量的值是可以根据程序的要求发生变化。
Java是一门强类型语言,每个变量必须声明其类型。Java变量是程序中最基本的存储单元,其要素包括变量类型、变量名和作用域。
/* 变量的命名:
变量类型 变量名 = 变量值;
*/
int a; //可以先声明变量名,默认初始化值
int a,b,c; //可以同时声明多个变量(不建议)
int age = 20; //可以先声明变量并初始化值
int a = 1, b = 2, c = 3; //可以先声明多个变量并初始化值(不建议)
double pi = 3.14; //double类型变量的声明
char x = 'A'; //char类型变量的声明
String name = "xiaozhao"; //引用类型变量的声明
注意:
-
每个变量都有类型,可以是基本数据类型,也可以是引用数据类型。
-
变量名必须是合法的标识符。
-
变量声明是一句完整的语句,必须以英文分号结束。
-
一般不推荐同时声明多个变量,会让代码可读性下降,最好做到每一条语句声明一个变量。
-
变量必须先声明后使用!
-
(二)变量的作用域:
变量除了先定义后使用,还必须是在它的作用范围中才能使用,这个作用范围就是它的作用域。
根据作用域的不用,可以分为:类变量、实例变量和局部变量。
- 类变量:
//变量作用域——类变量 public class ClassVariable { /* 类变量:从属于类,随着类加载一起出现、一起消失。可以在类的方法中根据变量名直接输出。 类变量可以不初始化就输出,输出结果为默认初始值。 声明语法:static 变量类型 变量名 = 变量值; */ static String name; static String name2 = "xiaozhao"; public static void main(String[] args){ System.out.println(name); //输出为默认值 null System.out.println(name2); //输出为 xiaozhao } }
- 实例变量:
//变量作用域——实例变量 public class InstanceVariable { /* 实例变量:从属于对象,在类里面,在方法外面。 实例变量可以不初始化就输出,输出结果为默认初始值。 声明语法:变量类型 变量名 = 变量值; */ String name = "xiaozhao"; int age; public static void main(String[] args) { //System.out.println(name); 报错,需要实例化对象才能调用实例变量! InstanceVariable i = new InstanceVariable(); //实例化InstanceVariable类的对象,且实例对象名为 i //输出方法一: String name = i.name; //声明一个局部变量name,将实例 i 的属性 name 的值赋给局部变量 name //注意:两个 name 是不同的变量 System.out.println(name); //此处的 name 是局部变量name,输出为 xiaozhao(因为已经被赋值) //输出方法二: System.out.println(i.name); //直接输出实例 i 的属性 name 的值,输出为 xiaozhao System.out.println(i.age); //因为 age 没有初始化,所以输出 int 类型的默认值 0 } }
- 局部变量:
//变量作用域——局部变量 public class LocalVariable { /* 局部变量:在方法里面,从属于所在方法,可在方法中直接根据变量名输出。 局部变量必须初始化才能使用和输出。 声明语法:变量类型 变量名 = 变量值; */ public static void main(String[] args) { int age; double money = 100; //System.out.println(age); 报错(Variable 'age' might not have been initialized),没初始化变量age System.out.println(money); //输出为100.0,因为变量 money 的类型为double,int类型的 100 会被自动转换为 double 类型的100.0 } //同一个类不同方法 void add(){ //System.out.println(money); 报错(Cannot resolve symbol 'money'),无法解析 money //因为局部变量 money 的作用域只在 main 方法里 } }
七、String类型变量
-
String类型属于引用数据类型,不属于八大基本数据类型变量。
-
声明 String 类型时使用英文半角的双引号 " "。
-
String 类型可以和 8 种数据类型做运算,且只能是连接运算,使用 + 号实现,运算结果仍为 String 类型。
int num = 100; boolean b = true; String s = "小钊"; String s1 = s + num; String s2 = s + b; System.out.println(s1); //输出为:小钊100 System.out.println(s2); //输出为:小钊true
-
特殊运算
char c = 'a'; //a:97 int num = 10; String str = "hello"; System.out.println(c + num + str); //输出为:107hello System.out.println(c + str + num); //输出为:ahello10 System.out.println(c + (num + str)); //输出为:a10hello System.out.println(str + num +c); //输出为:hello10a
-
注意:String类型不能直接与基本类型进行强制类型转换
String str = "123"; //int num = (int)str; 报错,类型不兼容不能强制转换 int num = Integer.parseInt(str); System.out.println(num); //输出为:123
八、运算符
- 算术运算符:(从左到右运算)
注意:
-
进行除法运算时,当除数和被除数都是整数,得到的结果也是一个整数(忽略小数部分)。如果运算中有小数参与,结果就是一个小数。
System.out.println(3/2); //输出为1 System.out.println(3/2.0); //输出为1.5 System.out.println(3./2); //输出为1.5
-
在进行取模(%)运算时,运算结果的正负取决于被模数(%号左边的数)的符号。
System.out.println((-5)%3); //输出为-2 System.out.println(5%(-3); //输出为2
- 赋值运算符:
注意:赋值(=)的运算顺序为从右到左。
- 关系运算符:
- 逻辑运算符:与、或、非
注意:
-
当逻辑与(&)和短路与(&&)都表示 与 操作区别:
-
使用逻辑与(&)进行运算时,不管左边为 true 或 false ,右边的表达式都会进行运算。
-
使用短路与(&&)进行运算时,当左边判断为 false 时,右边的表达式则不会进行运算。
-
-
当逻辑或(|)和短路或(||)都表示 或 操作区别:
- 使用逻辑或(|)进行运算时,不管左边为 true 或 false ,右边的表达式都会进行运算。
- 使用短路或(||)进行运算时,当左边判断为 true时,右边的表达式则不会进行运算。
例子:
public class demo1 {
public static void main(String[] args) {
int x = 0;
int y = 0;
int z = 0;
boolean a,b;
a = x > 0 & y++ >1;
System.out.println(a); //输出:false
System.out.println("y = "+ y ); //输出:y = 1(原因:y++进行了运算)
b = x > 0 && z++ >1;
System.out.println(b); //输出:false
System.out.println("z = "+ z ); //输出:z = 0(原因:z++没进行运算)
}
}
- 位运算符:
- 按位运算符用来操作整数类型中的 比特 位,也就是操作二进制数。
-
左移右移运算符就是将操作数的二进制数向左或向右移动指定的二进制位数。
<<:*2
>>:/2
-
取反(~):所有二进制位0变为1,1变为0.
-
条件运算符(也叫三元运算符):( ?: )
语法:条件表达式 ? 表达式1 : 表达式2;
问号前为判断的条件,结果为 true 时调用表达式1,为 false 时调用表达式2。
public class demo1 {
public static void main(String[] args) {
int score = 80;
String result = score > 60 ? "及格" : "不及格";
System.out.println(result); //输出为及格
}
}
-
运算符的优先级(不用刻意记忆)
编写程序时,尽量使用优先级最高的括号 ( ) 来实现想要的运算顺序。
九、包机制(拓展)
Java中的包是专门用来存放类的,有点类似于文件夹,可以方便项目的管理(不会一打开项目只有一堆类很混乱),一般是将相同功能的类放在同一个包里。
在声明包时,使用package语句,并且只能位于Java源文件的第一行。
package com.cnblogs.chapter01;
public class demo01{...}
企业中对包的命名一般是公司域名的倒置。
在开发时,一个项目可能会使用很多包,当一个包中的类需要调用另一个包中的类时,就需要使用关键字 import 来引入需要的类。
//具体格式
import 包名.类名;
注意:import 语句通常在 package 语句之后,类定义之前,如果需要用到一个包中的很多类,则可以使用 import 包名.*
来导入这个包里的所有类。
在 JDK 中,不同功能的类放在不同的包中。其中,Java的核心类主要放在 java 包及其子包下,Java扩展的大部分类都放在 javax 包及其子包下。
Java常用包:
- java.util:包含 Java 中大部分工具类、集合类等。
- java.net:包含 Java 网络编程相关的类和接口。
- java.io:包含 Java 输入输出有关的类和接口。
- java.awt:包含构建图形界面(GUI)的相关类和接口。