Java语言基础
Java语言基础
一、变量的声明、赋值和应用
声明:
数据类型 变量名;
int money;//开辟整数变量空间
赋值
变量名 = 值;
money = 100;
注意:Java是强类型语言,
变量的类型
必须与数据的类型
一致。
1、变量的三种定义方式
先声明,再赋值(常用)
数据类型 变量名;
变量名 = 值;
1
2int money;
money = 100;声明并赋值(常用)
数据类型 变量名 = 值;
1
int money = 200;
多个同类型变量的声明与赋值
数据类型 变量名1,变量名2,变量名3 = 值3,变量名4 = 值4;
1
int a,b,c=100,d=200;
2、数据类型
- java中的变量具有严格的数据类型区分(强类型语言)
- 在java语言中,任何一个值都有与其对应类型的变量。
注意:Java是强类型语言,变量的类型必须与数据的类型一致。
3、基本数据类型
整数:
注意:
int
为整数值的默认类型,如需为long
类型赋值较大整数时,需在值后面追加L
,否则默认为int
类型,如果超过int
的最大值则会报错。通常L
为大写,小写l
容易被误看为数字1
。
1 | public class Test{ |
运行结果:
1 | public class Test{ |
运行结果:
- 浮点数(小数):
注意:与
整数
类似,double
为浮点数的默认类型,如需为float类型赋值时,需在值后面追加F
,通常也书写为大写。
1 | public class Test2{ |
运行结果:
1 | public class Test2{ |
运行结果:
科学计数法:
浮点数值采用科学计数法表示:
2E3
等价于2*10^3
结果为2000.0
;3E5
等价于3*10^5
结果300000.0
。
1 | public class Test3{ |
运行结果:
布尔:
1 | public class Test3{ |
运行结果:
Java中的
boolean
不能参与算术运算。
字符:
前置知识1:
ASCII(American Standard Code for Informatica Interchange)美国信息交换标准代码
基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言
ASCII是最通用的信息交换标准,为英文字符设定了统一并且唯一的二进制编码。
前置知识2:
Unicode(万国码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。
它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求,(其中包括了ASCCII)。
部分字符编码:
Unicode中每个字符都对应一个二进制整数,可以使用多种方式赋值。
- 字符赋值:
char c1='A';
(通过''
描述为字符赋值) - 整数赋值:
char c2=65;
(通过十进制数65在字符集中对应的字符赋值) - 进制赋值:
char c3='\u0041';
(通过十六进制数41在字符集中所对应的字符赋值)
案例1:
1
2
3
4
5
6
7
8
9
10public class Test4{
public static void main(String[] args){
char c = 'a';
System.out.println(c);
int a = c;
System.out.println(a);
long b = a;
System.out.println(b);
}
}运行结果:
案例2:
1
2
3
4
5
6
7
8
9
10public class Test5{
public static void main(String[] args){
char c1 = 'a';//字符赋值
System.out.println(c1);
char c2 = 97 ;//整数赋值
System.out.println(c2);
char c3 = '\u0061';//进制赋值 61十进制是97
System.out.println(c3);
}
}运行结果:
后置知识–转义字符:
案例1:在程序中输出一个单引号字符。
1
2
3
4
5public class Test6{
public static void main(String[] args){
char c = ''';//编译错误
}
}运行结果:
为了解决这个问题,java采用了转义字符来表示字符和一些特殊符号。
案例2:解决方案-使用转义字符
1
2
3
4
5
6
7public class Test6{
public static void main(String[] args){
//char c = ''';//编译错误
char c1 = '\'';
System.out.println(c1);
}
}运行结果:编译运行成功
案例3:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public class Test6{
public static void main(String[] args){
//char c = ''';//编译错误
char c1 = '\'';
System.out.println(c1);
}
}
class Test7{
public static void main(String[] args){
System.out.println('\"');//双引号字符
System.out.println("\"");//双引号字符串
System.out.println('\\');//反斜杠字符
System.out.println("\\");//反斜杠字符串
System.out.println("\u0041");//输出字符串a
System.out.println("u0041");//输出字符串u0041
System.out.println("Hello\tworld!");//在Hello与world!之间使用制表位
}
}运行结果:
4、引用数据类型
字符串
类型 取值范围 字符编码 String 任何双引号“”之间的字面值 Unicode字符序列 - String类型的字面取值:
String str1 = "你好";
String str2 = "Hello";
String str3 = "Java PHP Python C C++ C# HTML";
案例1:
1
2
3
4
5
6
7public class TestString{
public static void main(String[] args){
String s1 = "Hello";
System.out.println(s1);
System.out.println("你好");
}
}运行结果:
- String类型的字面取值:
5、类型转换
自动类型转换
- 两种类型相互兼容
- 目标类型
大于
源类型(等号=
左边类型大于
右边类型)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34public class TestAutoConvert{
public static void main(String[] args){
//整数->整数
short s = 123;
int i = s;//将原类型short值存入到目标类型int变量中(自动类型转换)
System.out.println(i);
byte b = 50;
short s2 = b;//自动类型转换,byte类型自动转换为short类型
System.out.println(s2);
//小数->小数
float f = 100.2F;
double d = f;//自动类型转换,float转换为double类型。
System.out.println(d);
//整数->小数
int i2 = 98;
double d2 = i2;
System.out.println(d2);
//字符->整数
char c1 = 'a';
int i3 = c1;
System.out.println(i3);
//字符->小数
char c2 = 'a';
double d3 = c2;
System.out.println(d3);
//boolean类型无法与任何类型进行自动类型转换
}
}运行结果:
问题:为什么
byte
(1字节)不能自动类型转换为char
(2字节).1
2
3byte b4 = 65;
char c2 = b4;
System.out.println(c2);在强制类型转换案例6中做了解释。
运行结果:
强制类型转换
- 两种类型相互兼容
- 目标类型
小于
源类型
1
2
3
4
5
6
7
8public class Test5{
public static void main(String[] args){
short s = 123;
//byte b = s;//自动转化失败,编译错误
byte c = (byte)s;//需要用强制类型转换
System.out.println(c);
}
}运行结果:
案例1:长度足够,数据完整,输出正常。
1 | public class TestForceConvert{ |
运行结果:
分析:
强制类型转换将short
转换为byte
,short
占用2字节,而byte
占用1字节,于是将上图中高位进行截断,也就是红线左侧部分舍去,将绿色框框内的二进制赋值给byte
类型变量中。而short
类型的实际值126
没有超过byte
类型变量的取值范围,所以数据是完整的,输出正常。
案例2:长度不够,数据不完整,输出不正常。
1 | public class TestForceConvert{ |
运行结果:输出结果为1
分析:
byte
类型只能存1字节数据,于是short
类型中高位的数据被截断,仅仅只有绿色框中的数据被存入byte
类型变量中,而short
类型中的高位恰好存储有数据,于是byte
中存入的数据不完整,造成了输出不正常,byte
类型变量存入的二进制数据为0000 0001
,转成十进制正好为1
。
案例3:高位截断造成符号位改变。
1 | public class TestForceConvert{ |
运行结果:
分析:
short
类型大小2字节,最高位第16位代表符号位,而byte
类型大小1字节,最高位第8位代表符号位,而short
类型大小1字节,最高位第8位为符号位,short变量130的二进制第8位为1,高位截断,仅仅将绿色框框的值给了byte
类型变量,于是byte
类型变量第8位为1,所以为负数-126
。
案例4:小数强制类型转换为整数
直接去掉小数部分,保留整数部分。
1 | public class TestForceConvert{ |
运行结果:
案例5:字符转换为整数自动类型转换,整数强制类型转换为字符。
1 | public class TestForceConvert{ |
运行结果:
案例6:字符与整数转换的注意事项。
char类型是Unicode编码,取值范围是0~65535
,要大于0,如果要保证正常显示字符,赋给插入类型的整数变量需要大于等于0。如果小于0输入的全为?
号。
1 | public class TestForceConvert{ |
运行结果:
从案例6中可以看出,char的取值范围为0~65535,这就可以解释为什么
char c = 65;
是可以自动类型转换,而int/byte/short num=65;char c=num;
会报错,必须手动进行强制类型转换才行,这是因为char
类型与int/byte/short
类型的取值范围不兼容,虽然说byte
大小1字节比char
2字节小,但是int/byte/short
的取值返回都包括负数,而char
类型不能为取值范围没有负数,这个就是自动类型转换的两个条件1. 两个类型要兼容 2.目标类型大于源类型 中的两个类型不兼容,因为取值返回不一致。
特别地,boolean
取值true
与false
,不可与其他类型转换。
二、运算符与表达式
1、算术运算符
案例1 :
1 | class Test{ |
运行结果:
如果都为整数相除为3,其中有一个为小数则计算结果为小数,这与后面要讲的自动类型提升有关。
案例2:一元运算符
1 | public class Test6{ |
运行结果:
如果仅仅执行
++
或--
,++i
与i++
或--i
与i--
没有区别。如下示例:
1 | class Test1{ |
运行结果:
2、赋值运算符
1 | public class Test2{ |
运行结果:
3、关系运算符
1 | public class Test3{ |
运行结果:
4、逻辑运算符
1 | public class Test4{ |
运行结果:
5、三元运算符
1 | public class Test7{ |
运行结果:
6、表达式
使用运算符连接的变量或字面值,并可以得到一个最终结果。
例如:
7、自动类型提升
- 进行算数运算时:
- 两个操作数有一个为
double
,计算结果提升为double
- 如果操作数没有
double
,有一个为float
,计算结果提升为float
- 如果操作数没有
float
,有一个为long
,计算结果提升为long
- 如果操作数没有
long
,有一个为int
,计算结果提升为int
- 如果操作数中没有
int
,均为short
或byte
,或一个short
与一个byte
,计算结果仍旧提升为int
,这是因为short
与byte
本身字节大小较小,相加很容易超过自身的范围。
- 两个操作数有一个为
- 特殊:任何类型与
String
相加(+),实则为拼接,其结果自动提升为String
8、与String拼接的类型提升
1 | public class Test1{ |
运行结果:
三、控制台输入
- 程序运行中,可在控制台(终端)手动录入数据,再让程序继续运行。
- 导包语法:
import 包名.类名;//将外部class文件的功能引入到自身文件中。
在
rt.jar/java/util/Scanner
下。
使用顺序:
导入
java.util.Scanner
声明
Scanner
类型变量使用Scanner类中对应的方法(区分类型):
.nextInt()
获取整数.nextDouble()
获取小数.next()
获取字符串.next().charAt(0)
获取单个字符(接受一个字符串,获取字符串的第0个字符。)注意:如果输入了不匹配的数据,则会产生
java.util.InputMismastchException
异常
案例1:如何使用?
1 | import java.util.Scanner;//1.引入外部文件 |
运行结果:
案例2:获取小数、字符串、字符
1 | class Test9{ |
运行结果: