JavaSE:基础语法
注释
单行注释:只能注释当前行,已//开始,
//你好呀
多行注释:注释一段文字
/*
你好呀,我是波小涛!
感谢看我的播客。
*/
文档注释:用于生产API文档,配合JavaDoc。
/**
* @Description 你好呀,我是波小涛!
* @Author 这是文档注释呀。
*/
标识符
java定义好的关键字
abstract | assert | boolean | break | byte |
---|---|---|---|---|
case | catch | char | class | const |
continue | default | do | double | else |
enum | extends | final | finally | float |
for | goto | if | implements | import |
instanceof | int | interface | long | native |
new | package | private | protected | public |
return | stricffp | short | static | super |
switch | synchronized | this | throw | throws |
transient | try | void | volatile | while |
自己起名字要求:
表示类名的标识符用大写字母开始。如:Test,HeadEat。
表示方法和变量的标识符用小写字母开始,后面的以大写开始。如eat(),eatFood()。
关于Java标识符的注意点:
- 所有的标识符都应该已字母,美元符或下划线开始。
- 首字母之后可以是字母,美元符,下划线或数字之外的任何字符组合。
- 不能使用关键字作为变量名或方法名。
- 标识符是大小写敏感的。
数据类型
强弱类型语言
强类型语言:要求变量的使用严格符合规定,所有变量都必需先定义后才能使用。
弱类型语言:与强类型语言相反。像vb,php等就属于弱类型语言。
数据类型
Java的数据类型范围两大类:基本类型和引用类型。
基本数据类型 | 占内存 | 默认值 |
---|---|---|
byte | 1字节 | 0 |
short | 2字节 | 0 |
int | 4字节 | 0 |
long | 8字节 | 0L |
float | 4字节 | 0.0F |
double | 8字节 | 0.0 |
char | 2字节 | ‘\u0000’ |
boolean | 1字节 | false |
位(bit):是计算机最小的储存单位。
字节(byte):是计算机中的基本单位。
字符:指计算机中使用的字母、数字、字和字符
ASCIIS码:
1个英文字母=1个字节
1个中文汉字=2个字节
1个ASCII码=1个字节
UTF-8编码:
1个英文字符=1个字节
英文标点=1个字节
1个中文汉字=3个字节
中文标点=3个字节
Unicode编码:
1个英文字符=2个字符
英文标点=2个字节
1个中文汉字=2个字节
中文标点=2个字节
bit表示1位
Byte表示一个字节 1B=8b
1024B=1kB
1024KB=1M
1024M=1G
整型拓展
十进制,八进制,十六进制表示:
十进制整数,如:99,-99
八进制整数,要求以0开头,如:015
十六进制整数:要求0x或0X开头,如:0x99
浮点型拓展
【金融面试问:银行金融业务用什么类型表示?】
浮点类型float,double的数据不适合在不容许舍入误差的金融计算领域。
如果需要进行不产生舍入误差的精确数字计算,需要BigDecimal类。
public static void main(String[] args) {
float f = 0.1f;
double d = 1.0 / 10;
System.out.println(f == d);
float d1 = 12312312313f;
float d2 = d1 + 1;
if (d1 == d2){
System.out.println("d1==d2");
}else {
System.out.println("d1!=d2");
}
}
主要原因:
浮点数能够精确表示的数是有限的,因而也是离散的。浮点数一般都存在舍入误差,很多数字无法精确表示,其结果只能是接近,但不等于;
最好完全避免使用浮点数比较!
字符型拓展
char类型用来表示在Unicode编码表中的字符。
【字符转int】
public static void main(String[] args) {
char c1 = 'a';
char c2 = '中';
System.out.println(c1);
System.out.println((int) c1);
System.out.println(c2);
System.out.println((int) c2);
}
Unicode通常用’u0000’到’uFFFF’之间的十六进制值来表示
Java常用的转义字符
\b | 退格 | \u0008 |
---|---|---|
\n | 换行 | \u000a |
\r | 回车 | \u000d |
\t | tab键 | \u0009 |
" | 双引号 | \u0022 |
’ | 单引号 | \u0027 |
\ | 反斜杠 | \u0050 |
布尔型拓展
boolean类型(一位,不是一个字节),就是0和1
boolean类型有两个值,true和false,不可以0或非0的整数代替true和false,这点和C语言不同。
类型转换
由于Java是强类型语言,所以要进行有些运算的时候,需要用到类型转换。
整型、常量、字符型数据可以混合运算。
运算中,不同类型的数据先转换为同一类型,然后进行运算。
转换从低级到高级
低---------------------------------->高级
byte,short,char->int->long->float->double
数据类型转换必须满足如下规则:
- 不能对boolean类型进行类型转换。
- 不能把对象类型转换成不相关类的对象。
- 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
- 转换过程中可能导致溢出或损失精度。例如:
public static void main(String[] args) {
int i = 128;
byte b = (byte)i;
System.out.println(b);
}
因为byte类型是8位,最大值为127,所以当int强制类型转换为byte类型时值为128时候就会导致溢出。
- 浮点型到整数的转换是通过舍弃小数得到的,而不是四舍五入,例如:
public static void main(String[] args) {
System.out.println((int) 23.7 == 23);
System.out.println((int)-45.89f == -45);
}
自动类型转换
自动类型转换:容量小的数据类型可以自动转换为容量大的数据类型。
例如:short数据类型的位数为16位,就可以自动转换位数为32的int类型,同样float数据类型的位数为32位,可以自动转换为64位的double类型。
强制类型转换
强制类型转换有可能造成精度降低或溢出。
强制类型转换的语法格式:(type)var。条件是转换的数据类型必须是兼容的。
常见错误和问题
- 操作比较大的数时,要留意是否溢出,尤其是整数操作时;
public static void main(String[] args) {
int money = 10_0000_0000;//JDK7新特性,不会打印下划线方便查看特别大的数字。
int year = 20;
int total = money * year;
long total1 = money * year;
long total2 = money * (long)year;
System.out.println(total);
System.out.println(total1);
System.out.println(total2);
}
- L和l的问题:
不要命名名字为l的变量;
long类型使用大写L不要用小写。(因为小写像1);
变量,常量
变量
Java是一种强类型语言,每个变量都必须声明其类型。
Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。
public static void main(String[] args) {
int a,b,c;
int d = 1,e = 2,f = 3;
byte z = 22;
String s = "jiang";
double pi = 3.14159;
char x = 'x';
}
注意事项:
- 每个变量都有类型,类型可以是基本类型,也可以是引用类型;
- 变量名必须是合法的标识符。
- 变量声明是一条完整的语句,每个声明都必须已分号结束;
变量作用域
变量根据作用域可以划分为三种:
- 类变量(静态变量):独立于方法之外的变量,用static修饰。从属与类,生命周期伴随类始终。如果不初始化会自动化成该类的默认初始值;
- 实例变量(成员变量):独立于方法之外的变量。从属于对象,生命周期伴随对象始终。如果不初始化会自动化成该类型的默认初始值。
- 局部变量:类的方法中的变量。生命周期是从声明位置开始到“}”结束。在使用前必须声明和初始化。
public class JavaSETest06 {
static int all = 0;//类变量
String str = "hello world";//实例变量
public void fun(){
int i = 10;//局部变量
}
}
常量
常量:初始化后不能在改变的值!
final double PI = 3.14;
变量的命名规范
- 所有变量、方法、类名:见名知意
- 类成员变量:首字母小写和驼峰原则:myValue
- 局部变量:首之母小写和驼峰原则
- 常量:大写字母和下划线:MAX_VALUE
- 类名:首字母大写和驼峰原则:MyTest
- 方法名:首字母小写和驼峰原则:funGood
运算符
Java语言支持的运算符:
- 算数运算符:+,-,*,/,%,++,–
- 赋值运算符:=
- 关系运算符:>,<,>=,<=,==,!=
- 逻辑运算符:&&,||,!
- 位运算符:&,|,^,~,>>,<<,>>>
- 条件运算符:?
- 扩展运算符:+=,-=,*=,/=
二元运算符
整数运算
public static void main(String[] args) {
long a = 123123123132123L;
int b = 123;
short c = 10;
byte d = 1;
System.out.println(a+b+c+d);//long类型
System.out.println(b+c+d);//int类型
System.out.println(c+d);//int类型
}
浮点数运算
public static void main(String[] args) {
float a = 3.14F;
double b = 3.33333;
float c = 7.777F;
System.out.println(a+b);//double类型
System.out.println(b+c);//double类型
System.out.println(a+c);//float类型
}
关系运算符
取模运算
负数%负数 = 负数;
负数%正数 = 负数;
正数%负数 = 正数;
public static void main(String[] args) {
System.out.println(9 % 4);//1
System.out.println(-9 % -4);//-1
System.out.println(-10 % 4);//-2
System.out.println(9 % -4);//1
}
一元运算符
自增(++)自减(–)运算符是一种特殊的算术运算符,在算术运算中需要两个数来进行运算。而自增自减运算符是一个操作数,分为前缀和后缀两种。
public static void main(String[] args) {
int a = 3;
int b = a++;//执行完后,b=3。先给b赋值,在自增。
int c = ++a;//执行完后,c=5.先自增,在给b赋值。
}
逻辑运算符
public static void main(String[] args) {
boolean a = true;
boolean b = false;
System.out.println(a && b);//a和b都为true是才为true
System.out.println(a || b);//a和b只要有一个为true就为true
System.out.println(!(a && b));//如果结果为true则变为false
}
逻辑与和逻辑或采用短路的方式。
逻辑与只要有一个false,就直接false。
逻辑或只要有一个true,就直接true。
位运算
【面试题:int a = 2*8如何运算效率快?】
public static void main(String[] args) {
System.out.println(2 << 3);
}
拓展运算符
字符串连接符
“+”运算符两侧的操作中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接。
public static void main(String[] args) {
String s1 = "Hello World";
String s2 = 1 + "";//转换成String
//int
int c = 12;
System.out.println("c=" + c);
}
三目条件运算符
public static void main(String[] args) {
int score = 80;
String type = score < 60 ? "不及格" : "及格";
System.out.println("typr=" + type);
}