Java 三大技术平台
- Java SE:标准版,Java 核心和基础
- Java EE:企业版,企业级开发的解决方案
- Java ME:应用版,移动设备应用的解决方案
注:只需学习Java SE (基础)和 Java EE(进阶)
JDK 的组成
- JVM:Java 虚拟机,真正运行Java程序的地方
- 核心类库:Java内部自带的程序,供程序员在程序中调用
- JRE = JVM + 核心类库。JRE:Java 的运行环境
Java 的跨平台
- 编写好的Java程序,可以在安装了 JVM 的不同系统上运行
IDEA 管理Java程序的结构
idea开发Java程序的步骤:
第一步 创建工程 new Project(空工程)
第二步 创建模块 new Module
第三步 创建包 new Package
第四步 创建类
Java 的基础概念
字面量
关键字
关键字是java内部的,不能用作 类名、变量名,否则会报错!
标识符
- 我们写程序时起的名字,如类名、变量名都是标识符。
- 标识符的要求:由数字、字母、下划线(_)和美元符($) 组成
- 不能以数字开头、不能用关键字、且区分大小写
基本数据类型
- 自动类型转换:类型范围小的变量,可以直接赋值给类型范围大的变量。
byte a = 12;
int b = a;
System.out.println(b); // 12
- 强制类型转换:强行将类型范围大的变量、数据赋值给类型范围小的变量。
int a = 20;
byte b = (byte)a;
System.out.println(b); // 20
int i = 1500;
byte j = (byte)i;
System.out.println(j); // -36
注意事项: |
---|
强制类型转换可能造成数据(丢失)溢出; |
浮点型强转成整型,直接丢掉小数部分,保留整数部分返回 |
引用数据类型
引用数据类型:指存储对象地址的数据类型。与基本数据类型不同,引用数据类型指向内存中的对象,而不是直接存储值。
类 Class |
接口 Interface - 接口内定义了一组方法,但没有实现它们。一个类可以实现多个接口,从而有多种行为。 - 例如:`MyClass implements MyInterface` 其中`MyClass`实现了`MyInterface`接口。 |
数组 Array - 数组是一种容器对象,用于存储同种类型的数据。 |
枚举 Enum - 枚举是特殊的数据类型,它允许变量成为一组预定义的常量。 - 枚举有助于减少代码中的错误,因为只能从一组固定的值中选择。 |
字符串 String - String 属于java.lang包的一部分。 - String对象不可变,一旦创建就不能更改内容。 例如:String Aj = "Hello, World!"; |
注解 Annotation - 注解是元数据,提供有关程序代码的信息,但它们本身不包含任何业务逻辑。 - 注解用于声明(如类、方法、变量等)或包。例如,@Override用于标记一个方法是否重写父类的方法。 |
泛型 Generics - 泛型允许你定义类、接口和方法时使用类型参数,这样就可以在调用这些类、接口和方法时指定具体的类型。 - 虽然泛型本身不是一种数据类型,但它极大地影响了引用类型的使用方式。例如,`List<String>`表示一个存储字符串对象的列表。 |
内部类 Inner Class - 内部类是定义在另一个类里面的类。它提供了更好的封装,并可以直接访问外部类的所有成员(包括私有成员)。 - 内部类分为成员内部类、局部内部类、匿名内部类、静态嵌套类 |
抽象类 Abstract Class - 抽象类不能被实例化,用于被其他类继承。它可以包含抽象方法(没有具体实现的方法)和具体方法(有具体实现的方法) - 例如,你可以定义一个抽象类Animal,其中包含抽象方法make(),然后让具体的子类如Dog或Cat去实现这个方法。 |
记录 Record(自Java 14作为预览特性,Java 16正式支持): - 记录是一种特殊的类,旨在简化创建不可变数据载体对象的任务。记录自动提供全参构造器、访问器方法、`equals`、`hashCode`以及`toString`方法的实现。 - 例如:`record Person(String name, int age) {}` |
引用类型的共同点:都存储在堆内存中,并且可以通过引用来访问。
运算符
// 三元运算符:条件表达式?值1:值2;
// 执行流程:计算表达式的值,如果值为true,返回值1;如果为false,返回值2。
public class YunSuanFu {
public static void main(String[] args) {
sanYuan();
sanYuan2(50); // 输出不及格
sanYuan2(60); // 输出及格
sanYuan2(70); // 输出及格
}
// 三元运算符
// 语法: 条件表达式 ? 表达式1 : 表达式2;
// 如果条件表达式为true, 则执行表达式1, 否则执行表达式2
public static void sanYuan() {
int a = 1;
int b = 2;
int c = a > b ? a : b;
System.out.println("最大值是:" + c); // 最大值是:2
}
public static void sanYuan2(int score) {
String str= score >= 60 ? "及格" : "挂科";
System.out.println("考试结果是:" + str);
}
}
流程控制
分支结构 if
循环结构 for
循环结构 while
什么时候用for,什么时候用while?
- 功能完全一样,for能解决的while也能解决,反之也是。
- 使用规范:知道循环几次,使用for。不知道循环几次,建议用while
循环结构 do-while
do-while循环的特点: 先执行后判断(至少会执行一次)
break : 跳出并结束当前所在循环的执行。
continue: 用于跳出当前循环的当次执行,直接进入循环的下一次执行。
数组Array
- 数组是一个容器,用来存储同种类型的数据。
- 数组属于引用数据类型,数组变量名中存储的是数组在内存中的地址信息
静态初始化数组:定义数组时为数组元素赋值。
// 定义数组的完整格式
int[] arr1 = new int[]{20, 10, 80, 60, 90};
// 定义数组的简化格式
int[] arr1 = {20, 10, 80, 60, 90};
// “数据类型[] 数组名”也可写成 “数据类型 数组名[] ”。
int arr1[] = new int[]{20, 10, 80, 60, 90}; // 完整定义格式
int arr1[] = {20, 10, 80, 60, 90}; // 简化定义格式
范例:
// 定义一个字符串数组arr2
String[] arr2 = {"牛二", "西门", "全蛋"};
// 定义一个double浮点型数组arr3
double[] arr1 = {20, 10.2, 80.0, 0.1, 0};
动态初始化数组:只确定数组的类型和存储数据的容量。不事先存入数据
// 语法:数据类型[]数组名 = new 数据类型[长度]
// 动态初始化定义数组arr1,并设置数组长度为9(最多存储9个double型数据)
// 但并不是说数组内是空的,而是指arr1数组内存储的是9个double型数据0.0
// 即arr1 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
double[] arr1 = new double[9];
动态初始化数组的默认值规则:
二维数组
集合
集合:长度可变,可以存储不同数据类型的数组
集合位于 java.util 包,使用集合的时候,必须导入 java.util 包
Collection 接口:
注意:在开发中,很少直接用 Collection 接口,而是使用其子接口,Collection 接口的子接口主要是:List、Set、Queue、SortedSet。
Collection 的子接口 - List
List 的子接口 - ArrayList
API(应用程序编程接口):Java写好的程序,程序员可以直接拿来调用。
List 的子接口 - LinkedList