复习:
- JAVA的跨平台:JVM是跨平台的前提,针对不同操作系统,有不同的JVM,JAVA语言是跨平台的但是JVM不是
- JAVA的技术结构:JAVASE,JAVAEE,JAVAME
- 入门程序:JAVA程序必须放在JAVA文件(后缀名是.java);一个JAVA文件中可以存放多个JAVA类,但只能有一个是公共类,用public修饰,要求java文件名和类名一致,每个java类在编译完成之后都会产生一个class文件
- 编译:javac -d 存放位置 要编译的java文件
- java命令,用于运行:java 包名.类名
- 关键字:java中有特殊含义的单词,一共有53个关键字(2个保留字,goto,const),所有的关键字都是小写的。
- 标识符:在java中自定义的名称----字母数字下划线 , 数 字 不 能 开 头 , 字 母 常 见 语 言 基 本 字 符 , 尽 量 避 免 使 用 ,数字不能开头,字母常见语言基本字符,尽量避免使用 ,数字不能开头,字母常见语言基本字符,尽量避免使用,大小写敏感,见名知意
注释
代码中用于解释说明的文字:注释
注释格式:
- 单行注释: //注释文字
- 多行注释:/*
注释文字,多行注释
*/ - 文档注释:/*文档中的注释文字/ ------- 可以提取出来形成文档
可以提取出来形成文档:javadoc HelloWorld.java
字面量:
整数常量:所有整数
小数常量:所有小数(带小数点就算)
字符常量:一个字母,数字,符号用单引号标识起来,‘a’,‘9’,’ ',只有一对单引号不可以
字符串常量:将一个或者多个字符用""标识起来,字符串常量,允许只有一对双引号
布尔常量:true和false,判断条件成立/不成立,表示逻辑值
空常量:null
进制
二进制:0b(0B)作为开头,0b1010,0B1010
八进制:要求以0作为开头,05表示八进制5,
十进制:没有指明默认十进制
十六进制:0-9,a,b,c,d,e,f(大小写不区分),要求以**0x(0X)**作为开头
小数:3.28
分成两部分:
整数部分单算:3–0b11
小数部分:0.28–0.282 = 0.56
0.562 = 1.12
0.122 = 0.24
0.242 = 0.48
0.482 = 0.96
0.962 = 1.92
0.92*2 = 1.84
3 = 0b11.0100011……
绝大部分小数不能精确表示
用于记录数据的容器:变量
需要规定数据的存储类型
定义变量:变量名,类型,数据(3要素)
变量定义:数据类型 变量名 = 数据;
int i = 5;
数据类型:整数,i变量名,5整数
JAVA中也允许先声明之后再赋值
eg: 定义三个整数:
int a;
int b;
int c;
int a,b,c;
double d;
无论是,还是;都是英文格式状态下的
变量必须先定义后使用
变量必须先有值后使用
变量在哪定义就在哪儿使用,以{}为准!
以二进制形式来存储数据,每一位二进制在内存中称为一位(bit)
简写为b,一字节=8位,1Byte = 8 bit 1B=8b
KB,MB,GB,TB
1024B = 1KB -> MB ->GB -> TB
100M: 100Mb = 12.5MB
3GB流量:3GB = 3000MB(通讯行业中认为1GB = 1000MB)通用惯例
基本数据类型&引用数据类型
java中提供的8种基本数据类型:
数值型:
1. 整数型:
byte – 字节型 – 一个字节 – -128~127
byte b1 = 25; (√)
byte b2 = 128; (×)
short – 短整型 – 2个字节 – -32768~32767
int – 整型 – 4个字节 – -231~231-1 默认为int类
long – 长整型 – 8个字节 – -263~263-1 – 需要在结尾添加一个l/L,long l = 2L, (建议用大写L)
public class TypeDemo{
public static void main(String[] args){
int i = 1_245_317_645 // 可以用_进行分位
System.out.println(i);
}
}
2.浮点型:
float – 单精度浮点 – 4个字节 – -1038~1038 – 需要在结尾添加f/F作为表示
double – 双精度浮点 – 8个字节 – -10308~10308 – java中默认为双精度double 类型
float f1 = 1.2f;
float f2 = 1.2F;
double d1 = 1.2;
//有时候会出现这种情况:
double d2 = 1.2d;
double d3 = 1.2D;
double d = 4e4;//若为16进制需要0x4e4,这里4e4表示4*10^4,表示科学计数法,也有大写写法4E4
double d = 0x5p3; //p表示十六进制的科学记数法 xpy表示x*2^y
char – 字符型 – 2个字节来存储 – 0~65535,共65536个字符
char c1 = 'a';
char c2 = '4';
char c3 = '\u20ac'; // 以utf-16格式存储。
字符在存储过程中需要按某种规则转化为数字,这种转化规则称之为编码,记录编码行程的表格形式称之为码表。
eg:
ACSII (0-127)
ISO-8859-1 ---- 西欧码表 ---- 1个字节存储1个字符 ‘a’
规定所有码表必须兼容西欧码表:无论那张码表,前256个字符是一样的而且钱256个字符永远只占1B;
gb2312 ---- 国标码 ---- gbk(兼容gb2312) ---- 2个字节1个字符 65536种字符,只能表示绝大部分的常见的简体汉字,以及部分繁体汉字。
unicode编码体系:
万国码体系 ---- 收录了常见语言的常见字符。
utf-8 ---- 3个字节1个字符 ---- 常见
utf-16 ---- 规定用2个字节存储1个字符 ---- JAVA中 char 字符默认编码为utf-16
eg:‘a’: 西欧码表:1B ---- GBK:1B ---- utf-8:1B ---- utf-16:1B
转义字符:
制表符:’\t’
换行符:’\r’(回车键光标挪到起点) ‘\n’(换行光标挪到下一行)
反斜杠:’\’ 表示一个
单引号:’’’,单引号里面’
双引号:’"’,单引号里面"
回车换行区别:当代没有区别,打字机中有区别。
布尔型:
boolean ---- 布尔型 ---- true/false ---- 内存大小与JDK有关
java中的引用数据类型:数组[],类class,接口interface
数据类型的转换:
1. 自动类型转换/隐式转换
规律一:小的类型可以自动转化为大的类型
byte < short < int < long
float < double
byte b = 3;
int i = b;
/*
byte:占1个字节
int:占4个字节
转化一定没有问题
*/
int i = 7; long l = i;
float f = 3.57f; double d = f;
//byte 1B, short 2B, int 4B, long 8B, float 4B, double 8B, char 2B, bool;
long l = 10; // java 中整数默认为int,10为int类型,int一定可以自动转化为long类型
//一个整数在int的范围内,赋值给long类型可以不加l
long l = 23456782; //正确
long l = 3348723982; //错误,超过了int 范围
long l = 3348723982L; //正确
规律二:整数可以自动转化为小数(但可能产生精度损失)
int i = 123456789;
float f = i;
// 正确,但是会输出精度损失,例如:1.23456792E8
float f = 500; //正确,500是整数,默认为int,可以直接赋值给浮点类型f
float f = 400L; //正确
规律三:字符类型可以自动转化为整数
char c = 'd';
int i = c;
//没有问题
short s = 'a';
System.out.println(s);
char c = 97;
System.out.println(c);
//没有问题
short s = 'a';//a是一个字面量,确定的量,代码在编译的时候可以确定'a'的值是否在short的取值范围内,所以允许转化
char c = 97;//97是一个字面量,代码在编译的时候可以确定97的值是否在char的取值范围内,所以允许转化
char c = 'a';
short s = c;//c不是一个字面量,并不是一个确定的量,是一个变量,可能允许的范围在s允许的范围以外。在编译期间只能确定c是一个char类型的值,而不能确定具体指,在编译期间比对两个类型能否完全转化,发现char与short取值范围不完全重合,所以认为c会有超过short类型值得风险,因此不允许转化。
System.out.println(s);
//有问题!同理,char c = s;也会报错。
short 类型 2B char 类型 2B
short:-32768~32767
char:0~65535
并不是包含关系或完全重合。
无精度损失:
char -> int
byte -> short -> int -> long
float -> double
有精度损失:
long ->float
2. 强制类型转换/显示转换
int i = 5;
byte b = (byte)i; //表示将变量i强制转换为byte类型之后再赋值给变量b
System.out.println(b);
//正确,输出5
int i = 300;
byte b = (byte)i;
System.out.println(b);
/*编译通过,输出44
300 = 0b 00000000 00000000 00000001 00101100
0b00101100 = 4 + 8 + 32 = 44*/
大类型可以强制转化为小类型,但是转化时由于字节的损失所以数据可能不准确。
JAVA在CMD下中文报错信息出现乱码解决方案:
https://blog.csdn.net/qq_43710979/article/details/100784050
开始-> 右键计算机 ->属性 -> 高级系统设置 ->环境变量 -> 系统变量的部分点击新建
输入变量名:“JAVA_TOOL_OPTIONS”
输出变量值:"-Dfile.encoding=UTF-8"
public class OperatorDemo{
public static void main(String[] args){
//这片代码没问题,输出7
int i = 3;
int j = 4;
int k = i + j;
System.out.println(k);
//这段代码有问题,提示如下:
byte i = 3;
byte j = 4;
byte k = i + j;
System.out.println(k);
}
}
从int转换到byte可能会有损失
1. byte short char 在参与运算时会自动提升为int
//正确代码:
public class OperatorDemo{
public static void main(String[] args){
/*想要byte i + byte j = byte k;
自动提升为int i + int j = byte k;
因此报错,所以需要强制类型转换*/
byte i = 3;
byte j = 4;
byte k = (byte)(i + j);
System.out.println(k);
}
}
同理,以下代码也需要强制转换
public class OperatorDemo{
public static void main(String[] args){
byte i = 3;
i = i + 4
System.out.println(i);
//编译报错
}
}
public class OperatorDemo{
public static void main(String[] args){
int i = 3 + 5;
System.out.println(i);
//打印输出8,并不报错
}
}
public class OperatorDemo{
public static void main(String[] args){
byte i = 3 + 5;
System.out.println(i);
//打印输出8,也不报错,因为3和5是两个字面量
//两个字面量参与运算的时候,JAVA为了提高效率在编译的时候会进行自动的计算过程。
//编译完成后是 byte i = 3 + 5 ====== byte i = 8;
}
}
2. java 是一门强类型语言,同一类型运算完成后结果是同一类型
小类型与大类型同时运算的时候,结果一定是大类型!
int / double = double
public class OperatorDemo{
public static void main(String[] args){
int i = 4500;
i = i / 1000 * 1000;
System.out.println(i);
//输出4000
}
}
public class OperatorDemo{
public static void main(String[] args){
int i = 4500;
i = i / 1000.0 * 1000;
System.out.println(i);
//输出4500
}
}
3. JAVA中小数是浮点数,并不能精确存储
public class OperatorDemo{
public static void main(String[] args){
double d1 = 3.29;
double d2 = 2.98;
double d = d1 - d2;
System.out.println(d);
}
}
编译的时候检查的是语法,例如下面的代码:
public class OperatorDemo{
public static void main(String[] args){
System.out.println(3/0);
}
}
编译通过,但是运行会报错:
ArithmeticException
public class OperatorDemo{
public static void main(String[] args){
System.out.println(3.0/0);
}
}
非零小数除以整数零:得到infinity或 -infinity
3.0/0 3/0.0
0/0.0 0.0/0 0.0/0.0 --NaN
%取模运算(取余运算)
89 % 7 = 5
5 % 7 = 5
但是:
-89 % 7 = -5
-5 % 7 = -5
89 % -7 = 5
5 % -7 = 5
-89 % -7 = -5
-5 % -7 = -5
结果的符号和%左边数字有关:%左边为正,则结果为正
JAVA中还可以小数取余
3.2 % 2 = 1.2
5 % 1.4 = 0.8
5.2 % 1.7 = 0.1
自增++ / 自减–
public class OperatorDemo{
public static void main(String[] args){
int i = 5;
++i;//i++
System.out.println(i);//输出6
--i;//i--
System.out.println(i);//输出5
}
}
++在前:先自增再参与后续运算
++灾后:先取值再自增
int i = 5;
int j = ++i;//i先自增为6,再赋值给J
int i = 5;
int j = i++;//现将i的值(5)取值,i自增为6,然后将5赋值给j