基本语法
一、标识符和关键字
1. 标识符
标识符用来表示变量、常量、类名、方法名、数组名、文件名等元素的名字。由字母、下画线、美元符号$的数字组成,并遵循一定的规则。
- 区分大小写。
- 不能以数字开头。
- 以字母、下画线或者$符号开头。
- 长度没有限制,最多可以标识65535个字符。
- 不能使用Java关键字。
2. 关键字
关键字是Java语言中已经被赋予特定意义的单词,也称保留字。系统事先定义的,对Java的编译器有特殊的作用。
abstract | break | byte | boolean | catch |
---|---|---|---|---|
case | class | char | continue | default |
double | do | else | extends | false |
final | float | for | finally | if |
import | implements | int | interface | instanceof |
long | length | native | new | null |
package | private | protected | public | return |
switch | synchronized | short | static | super |
try | true | this | throw | threadsafe |
void | while | goto(保留字) | const(保留字) |
**修饰成员变量volatile ** volatile:贡献变量,用于并发线程的共享,实现线程中的通信。在原子操作的情况下,当变量被volatile修饰时,线程每次使用时都会直接到内存中提取,不会去缓存。volatile 修饰符适用于以下场景:某个属性被多个线程共享,其中有一个线程修改了此属性,其他线程可以立即得到修改后的值;或者作为状态变量,如 flag = ture,实现轻量级同步。
volatile 属性的读写操作都是无锁的,它不能替代 synchronized,因为它没有提供原子性和互斥性。因为无锁,不需要花费时间在获取锁和释放锁上,所以说它是低成本的。 volatile 只能作用于属性,我们用 volatile 修饰属性,这样编译器就不会对这个属性做指令重排序。 volatile 提供了可见性,任何一个线程对其的修改将立马对其他线程可见。 volatile 提供了 happens-before 保证,对 volatile 变量 V 的写入 happens-before 所有其他线程后续对 V 的读操作。 volatile 可以使纯赋值操作是原子的,如 boolean flag = true; falg = false。 volatile 可以在单例双重检查中实现可见性和禁止指令重排序,从而保证安全性。
**修饰成员方法synchronized ** synchronized:控制多个并发线程的访问 防止冲突 实现同步。在多线程的环境下,多个线程同时访问共享资源会出现一些问题,而synchronized关键字则是用来保证线程同步的。
synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:
- 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
- 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
- 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
- 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。
3. 分隔符
圆括号() 花括号{} 方括号[] 分号; 逗号, 句号.
二、数据类型
1. 整型
byte8位 short16位 int32位 long64位
//例2_1整型进制转换
public class Example2_1 {
public static void main(String[] args) {
byte a = 56; /* byte占8位(2^7~2^7-1) 以此类推*/
System.out.println("hello world"+a);
short b = 63; /*short占16位*/
System.out.println("hello world"+b);
int c = 073; /* int占32位 073八进制数*/
System.out.println(c);
long d=0xa38f; /*long占64位 0xa38f十六进制数*/
System.out.println(d);
}
}
2. 浮点类型
float32位 double64位 默认double类型,加F/f为float类型。
//例2_2正方形的面积
public class Example2_2 {
public static void main(String[] args) {
/* 浮点类型 */
float a=4.0f; /*占32位 加f为float类型*/
double b = 3.0; /* 占64位 默认double类型*/
double c=4.0;
double d=b*c*a;
System.out.println(d);
}
}
3. 字符类型
\n 换行、\t 制表符、\b退格、回车、\f换页、\反斜杠、'单引号、"双引号、 \ddd 1~3位八进制数据所表示的字符'?',如'\356' \uxxxx 十六进制的Unicode码字符'星图形',如'\u2605' ···
4. 布尔类型
boolean 变量名;1位1/0
//例2_3布尔类型的使用
public class Example2_3 {
public static void main(String[] args) {
String a="123456"; /* 字符串类型 */
char b='1'; /*字符类型 无符号16位 0-65536*/
boolean c=true; /*布尔类型*/
System.out.println(a+b); /*字符类型的连接*/
System.out.println(c);
//数据类型的转换 低级-高级(自动) 反之(强制)
//低-高:(byte,short,char)-int-long-float-double
// char-int
char a1=(char)97;
int b1='\u008a';
int c1='a';
System.out.println(a1);
System.out.println(b1);
System.out.println(c1);
//instanceof关键字判断变量是否是目标类型 a instanceof int
int i=1; //int类型变量
System.out.println(getType(i)); //打印变量类型为int
}
public static String getType(Object o) { //获取变量类型方法
return o.getClass().toString(); //使用int类型的getClass()方法
}
}
5. 字符串类型
string 变量名;
6. 数据类型转换
低级-高级 自动:(byte short char)-int-long-float-double 高级-低级 强制:(目标数据类型)表达式
7. 引用数据类型
字符串、数组、类、接口等
三、常量和变量
1. 常量
final 类型 常量名=常量值
2. 变量
类型 变量名=变量初值
//例2_4常量和变量的使用
public class Example2_4 {
//成员变量(类中)、局部变量(类的方法中)
//static关键字-静态变量\静态方法\代码块\嵌套类
//用final定义常量
static final double PI=3.14; //静态常量,必须赋初值
static int member=23; //静态变量 ,赋初值
public static void main(String[] args) {
final int part=123;
member=24;
System.out.println(part*member*PI);
}
}
3. 变量的有效范围
成员变量:在整个类体中都有效。分为静态成员变量(加static)、实例变量。 局部变量:只在方法体类中有效。
package chap2.task2_1;
//例2_5声明静态成员变量和实例变量
public class Example2_5 {
//成员变量 在整个类中有效, 局部变量在方法中有效
int x=1; /*实例变量*/
static int y = 234; /* 静态变量 static*/
}
class print{
public static void main(String[] args) {
//定义时使用static 直接通过类名调用,成员变量或方法。但在static静态方法中,只能调用用这种方式静态的变量方法
System.out.println(Example2_5.y);
//没有static 需要实例化调用
System.out.println(new Example2_5().x);
}
}
四、数据操作
1. 运算符
运算符是描述数据运算的符号。它们有相应的优先级、类型、结合性。
2. 算术运算符
算术运算符用于整数类型和浮点数类型。
运算符 | 含义 |
---|---|
++ | 自增 |
-- | 自减 |
+ | 加(或取正) |
- | 减(或取负) |
* | 乘 |
/ | 除 |
% | 取余 |
//例2_6算术运算测试示例
public class Example2_6 {
public static void main(String args[]) {
int a = 5 + 4; // a=9
int b = a * 2; // b=18
int c = b / 4; // c=4 浮点数中除数为0,结果为NaN(非数),整数中报错
int d = b - c; // d=14
int e = -d; // e=-14 负数
int f = e % 4; // f=-2 负数求余
double g = 18.4;
double h = g % 4; // h=2.4 浮点数求余
int i = 3;
int j = i++; // i=4��j=3 先赋值再自增
int k = ++i; // i=5��k=5 先自增再赋值
System.out.println("a=" + a);
System.out.println("b=" + b);
System.out.println("c=" + c);
System.out.println("d=" + d);
System.out.println("e=" + e);
System.out.println("f=" + f);
System.out.println("g=" + g);
System.out.println("h=" + h);
System.out.println("i=" + i);
System.out.println("j=" + j);
System.out.println("k=" + k);
}
}
3. 关系运算符
整数或浮点数的关系运算符是比较数的大小,字符型数据的是比较其Unicode码的大小。boolean值只能进行==或!=比较。
运算符 | 含义 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
//例题2_7关系运算符使用实例
public class Example2_7 {
public static void main(String[] args) {
int n = 3;
int m = 4;
System.out.println();
System.out.println("n<m is " + (n < m)); //结果True
System.out.println("n=m is " + ((++n) == m)); //结果True
System.out.println("n>m is " + ((++n) > m)); //结果True
System.out.println("n is " + n); //n经过了两次自增
//boolean类型只能进行==或!=比较
}
}
4. 逻辑运算符
逻辑运算符针对布尔类型数据。!是一元运算符,其余全是二元运算符。
运算符 | 含义 |
---|---|
& | 非简洁与AND |
| | 非简洁或OR |
^ | 逻辑异或XOR |
! | 逻辑非NOT |
&& | 条件与AND |
|| | 条件或OR |
//例题2_8逻辑运算使用示例
public class Example2_8 {
public static void main(String[] args) {
int a = 3;
int b = 4;
boolean result1 = (a > b) && (a != b); //条件与and
boolean result2 = (a > b) || (a != b); //条件或or
System.out.println(result1);
System.out.println(result2);
// 测试短路现象
boolean result3 = (a < b) || ((a = 5) > b); //条件或or
System.out.println(result3 + ",a=" + a + ",b=" + b); //结果通过+变量+拼接
// 标准逻辑运算符没有短路现象
boolean result4 = (a < b) | ((a = 5) > b); //非简洁或or 这里出现了赋值
System.out.println(result4 + ",a=" + a + ",b=" + b);
}
}
5. 位运算符
位运算操作数只能是整型和字符型,除了"~"外,其余均为二元运算符。
运算符 | 含义 |
---|---|
~ | 按位取反 |
<< | 按位左移 |
>> | 按位右移 |
>>> | 无符号按位右移 |
& | 按位与 |
^ | 按位异或 |
| | 按位或 |
//例题2_9位运算使用示例
public class Example2_9 {
public static void main(String[] args) {
int a = 3;
int b = 4;
// 先把数据变成二进制
System.out.println(a & b); //按位与,一0即0
System.out.println(a | b); //按位或,一1即1
System.out.println(a ^ b); //按位异或,同为0,异为1
System.out.println(b << 2); //按位左移2位
System.out.println(b >> 2); //按位右移2位
//条件运算符-三元运算
int a1=1,b1=2,c1;
c1=a1>b1?a1:b1;
System.out.println(c1);
//赋值运算符-等号 左变量 右表达式
int a2;
a2=5+3/2;
System.out.println(a2);
}
}
6. 条件运算符
语法格式: 表达式1?表达式2:表达式3
7. 赋值运算
简单:= 左变量 右表达式 复合:+=、-=、*=、/=、%=、&=、|=、^=。
五、表达式与语句
1. 表达式
表达式是由变量、常量、对象、方法调用和操作符等元素的有效组合。 Java中除了表达式语句,还有声明语句(声明变量的数据类型)和流程控制语句(控制语句的执行顺序)。
//例题2_10计算圆的面积和周长
public class Example2_10 {
public static void main(String[] args) {
double r = 8.5; // 赋值语句
double length, area; // 声明语句
length = 2 * Math.PI * r; //Math类库的常量PI
area = Math.PI * r * r;
System.out.println("圆周长为:" + length);// 方法调用语句
System.out.println("圆面积为:" + area);
//java中除了表达式语句,还有声明语句和流程控制语句
}
}
2. 语句
Java程序由语句组成,每一个语句是一个完整的执行单元,以分号";"结尾。
3. 语句块和作用域
语句块由一对{}以及其中的语句组成。每个语句定义了一个作用域。
//例题2_11定义变量i和语句块内的局部变量j,观察i和j不同的作用域
public class Example2_11 {
public static void main(String[] args) {
int i = 0;
//语句块{}和作用域
{
int j = 0;
System.out.println(i+"\n"); // 语句块外定义的变量在语句块内具有可见性
System.out.println(j); //转义字符以\开头,\n为换行符
}
i = 5;
// j = 10; //j不可使用,语句块内定义的变量在语句块外不具有可见性
}
}