JavaSE
环境配置
Java语言介绍
Java 诞生于SUN(Stanford University Network),09年SUN 被Oracle(甲骨文)收购。
Java 之父詹姆斯.高斯林(James Gosling)。
JavaSE
允许您在桌面和服务器上开发和部署Java应用程序
JavaEE
是为开发企业环境下的应用程序提供的一套解决方案,主要针对于Web应用程序开发。
JavaME
为互联网上的嵌入式和移动端设备上运行的应用提供一个健壮、灵活的环境:微控制器、网关、传感器、移动电话、等等。
字节
字节:计算机中存储数据的最小计量单位,用byte或者B表示。
计算器中最小的存储单元是二进制,因为计算机上任何能看到的东西都是由CPU通过二进制转来的。1Byte = 8bite
1024Byte = 1kByte
Java 环境
JVM
JVM Java虚拟机:运行Java程序的
跨平台:一次编写导出运行
JDK和JRE
- JDK(Java Develop Kit):Java开发工具包。
- JRE (Java Runtime Environment):Java运行环境,包含了JVM 以及后面开发用到的核心类库
- JDK、JRE、JVM的关系:JDK 包含了JRE,JRE包含了JVM,所以我们只需安装JDK。
JDK 安装
开发
开发步骤
- 编写:创建一个.java文件
- 编译:javac java文件名
- 运行:java class 文件
javac Demo.java
java Demo
public class Demo{
public static void main(String[] args){
System.out.println("hello world");
}
}
字符编码问题
- 编码:保存数据的过程就是编码的过程
- 解码:读取数据的过程就是解码的过程
- 注意
编码和解码遵守的编码规范必须是一样的
常见的两个编码规范
GBK:专门为我们中文所设计的编码
ANSI 代表的是GBK
一个中文汉字在GBK中占用2Byte
UTF-8:一个中文汉字在UTF-8中占用3Byte
变量 数据类型转换 运算符
常量
- 概述:在代码运行过程中,值不会发生改变的数据
- 分类
- 整数常量-所有整数
- 小数常量-所有小数
- 字符常量-char
- 字符串常量-String
- 布尔常量 -true,false
- 空常量-null 数据不存在
public class Constant{
public static void main(String[] args){
System.out.println(1);
System.out.println(2);
System.out.println(1.01);
System.out.println(false);
System.out.println("alex");
System.out.println('A');
System.out.println(1+2);
// Tab 与 空格 的区别
// 报错,四个空格
System.out.println(' ');
// tab键算一个字符
System.out.println(' ');
// 空常量
// 报错 不能直接使用
System.out.println(null)
}
}
常量运算符
public static Contant{
public static void main(String[] args){
System.out.println(1 + 3);
System.out.println(2 * 2);
System.out.println(10 - 5);
System.out.println(10 / 2);
}
}
变量
数据类型 | 关键字 | 内存占用 | 取值范围 |
---|---|---|---|
字节型 | byte | 1 字节 | -128 至 127 |
短整型 | short | 2字节 | -32768至32767 |
整型 | int | 4字节 | |
长整型 | long | 8字节 | |
单精度浮点数 | float | 4字节 | |
双精度浮点数 | double | 8字节 | |
字符型 | char | 2字节 | |
布尔类型 | boolean | 1字节 | true、false |
- 基本数据类型 4类型8种
- 整型:byte、short、int、long
- 浮点型:float、double
- 字符型:char
- 布尔型:boolean
- 引用数据类型:类、数组、接口、枚举、注解
定义变量
- 数据类型 变量名 = 值;
- 数据类型 变量名;变量名= 值;
- 数据类型 变量名1,变量名2,变量名3;
public class Demo{
// 定义一个整数
int a = 10;
String str = "alex";
int i , j k ;
i = 0;
j= 1;
k= 2;
int a = 1 ,b =2,c=3;
}
先看=右边的,再看=左边的,将右边的数据赋值给左边的变量,右边的如果有运算,先将等号右边的运算结构给左边
- 注意
- 字符串不属于基本数据类型,属于引用数据类型,String
public class Var{
public static void main(String[] args){
byte b = 100;
short s = 1000;
int i = 99;
// 值的后面加一个L
long l = 100000000L;
// float 值后加一个F
float f = 2.5F;
double d = 2.5;
char c = 'A';
boolean bt = true;
boolean bf = false;
String str = "my name is alex";
}
}
变量运算
public class Var {
public static void main(String[] args){
int a = 1;
int b = 2;
int sum = a + b;
}
}
转义字符
- 将普通字符转为具有特殊含义的字符
- 将具有特殊含义的字符转为普通字符
public class Var {
public static void main(String[] args){
// \n : 换行符
system.out.print("春眠不觉晓\n");
// \t:制表符
system.out.print("hello \t word");
// String 表示一个路径,
// 在Java中两个 \\ 表示一个 \
System.out.print("D:\\code\\alive")
}
}
float 和 double 区别
- float 的小数位只有
23
位 二进制,能表示的最大十进制为2
的23
次方(8388608),是7
位数,所以float型表示的小数,小数位能表示7
位; - double的小数位只有52位二进制,能表示的最大十进制为(4 502 599 627 370 496),是16位数,所以double型的小数,小数位能表示出16位。
- 所以不要直接使用float或者double直接参与运算,会造成精度损失。
public class var{
public static void main(String[] args){
float c = 10;
float d = 3;
// 3.3333333
float e = c/d;
double a = 10;
double b = 3 ;
// 3.3333333333333335
double res = a/b;
// 精度损失
float x = 3.55F;
float y = 2.12F;
// 1.4300001
float f = x -y;
}
}
标识符
- 类 方法名 变量取名;
- 注意:
1. 标识符可以包含 英文字母、数字、$和_ ;
2. 标识符不能以数字开头;
3. 标识符不能是关键字;
数据类型转换
- = 左右两边的类型不一致
- 不同类型的数据做运算
- 分类
- 自动类型转换:
将取值范围小的数据类型赋值给取值范围大的数据类型->
小转大;
取值范围小的数据类型和取值范围大的数据类型做运算->
小转大; - 强制类型转换
当将取值范围大的数据类型赋值给取值范围小的数据类型->
需要强转; - 基本类型中按照取值范围从小到大排序
byte,short,char->
int->
long->
float->
double
- 自动类型转换:
public class Demo{
public static void main(String[] args){
// 自动类型转换
long a = 100;
}
}
强制类型转换
- 将取值范围大的数据类型赋值给取值范围小的数据类型
取值范围小的数据类型 变量名 = 取值范围大的数据类型->
需要强转 - 取值范围小的数据类型 变量名 = (取值范围小的数据类型)取值范围大的数据类型
public class {
public static void main(String[] args){
/**
= 右边的是小数,小数默认的数据类型是double
= 左边的变量是float类型
所以会报错
**/
float a = 2.5;
float b = 2.5F;
// 结果为:2 //精度损失
int i = (int)2.9;
// 数据溢出 结果为:1410065408;
int j = (int) 10000000000L;
}
}
- 注意:
- 强转会出现精度损失、数据溢出;
- byte,short 定义的时候,如果=右边是整数常量,如果不超过byte,short的范围,不需要我们自己强转,jvm自动转型;
- byte,short如果=右边有变量参与,byte和short自动提升为int,然后结果再次赋值给byte或者short变量;
- char 类型数据如果参与运算,会自动提升为int型,如果char类型的字符提升为int型会去ASCII码表中查询对应的int值
- 如果ASCII中没有对应的int值,会去Unicode(万国码)查询;
public class {
public static void main(){
// jvm 强转int
byte a = 10;
byte b = 10;
// 有变量参与
b = (int)(b + 1);
char c = 'A';
// 结果为95
System.out.print(c+0);
//
System.out.print('中'+0);
// byte 的取值范围是 -128 至 127;
byte d = (byte)200;
// -56
System.out.print(d);
byte e = (byte)128;
// -128
System.out.print(e)
}
}
进制转换
IDEA
运算符
流程控制
数组
数组的定义
数组是个容器,数组本身是引用数据类型;
存储多个数据
特点:
既可以存储基本类型数据,也可以存储引用数据类型;
定义数组大小,长度为多长,最多能存储多少数组;
定义:
- 动态初始化:
数据类型[] 变量名 = new 数据类型[长度];
数据类型 变量名[] = new 数据类型[长度];- 静态初始化:
数据类型[] 变量名 = {…};
package alive.array;
/**
* @Author zyj
* @Date 2024/08/17 22:13
* @Description 数组定义
*/
public class Arr {
public static void main(String[] args) {
// 动态初始化
int[] arr1 = new int[3];
String arr2[] = new String[3];
// 静态初始化
int[] arr3 = {1, 2, 3, 4, 5, 6};
String arr4[] = {"1", "2", "3"};
}
};
数组操作
获取数组长度
arr.length;
存储元素
格式:数组名【索引】 = 值;
获取元素
格式:数组名【索引值】
细节说明:
- 直接输入数组名,会输出一个地址值
- 地址值:数组在内存中的一个唯一标识,通过这个唯一标识能够在内存中找到这个数组,从而操作这个数组
- 如果数组中没有存数据,直接获取也能获取出来一些元素(元素的默认值)
整数:0
小数:0.0
字符:“\u0000”->
对应的int 0
布尔:false
引用:null
遍历数组
package alive.array;
/**
* @Author zyj
* @Date 2024/08/17 22:13
* @Description
*/
public class Arr {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
for (int i : arr) {
System.out.println(i);
}
}
}
数组异常
- ArrayIndexOutOfBoundsException
数组越界
- NullPinterException
空指针异常
内存图
Java 中内存分为5块
- 栈(Stack)
主要运行方法,方法的运行都会进栈内存运行,运行完毕后,需要 “t弹栈”,为了腾出空间 - 堆(Heap)
保存的是对象、数组、new 都会在堆内存中开辟空间,并为这个空间分配一个地址值
堆内存中的数据都是由默认值的
整数:0
小数:0.0
字符:‘\u0000’
布尔:false
引用:null - 方法区(Method Area)
代码的“预备区”,记录类的信息,以及方法的信息
方法区中主要保存class文件以及其中的信息
代码运行之前,需要先进内存(方法区) - 本地方法栈(Native Method Stack)
本地方法对Java功能的扩充
有很多功能,Java语言实现不了,所以就需要依靠本地方法完成(C语言编写) - 寄存器(PC register)
数组内存图
二维数组
动态初始化
数据类型【】【】 数组名 = new 数据类型【m】【n】
m:二维数组的长度
n:二维数组中每一个一维数组的长度;
静态初始化
数据类型【】【】 数组名 = new 数据类型【】【】{{…}}
简化:数据类型【】【】 数组名 = {{…}}
package alive.array;
/**
* @Author zyj
* @Date 2024/08/17 22:13
* @Description
*/
public class Arr {
public static void main(String[] args) {
int [][] arr = {{1,2,3,4},{5,6,7,8},{9}};
}
}