1. Java 语言基本概述
Java 是一种广泛使用的编程语言,由 James Gosling 在 Sun Microsystems(现在是 Oracle Corporation 的一部分)于 1995 年发表。Java 是一种静态类型的、类基础的、并发性的、面向对象的编程语言。Java 广泛应用于企业级应用、Web 应用、移动应用(Android)、桌面应用、嵌入式系统和大数据等领域。
1.1 安装 Java JDK 环境
首先确定你需要的 JDK 版本。Oracle 提供了多个版本的 JDK,包括最新的版本和旧版本。常见的选择有Oracle JDK 和 OpenJDK。
访问下载页面:访问 Oracle 官方网站
设置环境变量:为了在命令行中方便地运行 Java 程序,你应该设置 JAVA_HOME
环境变量,指向 JDK 的安装路径,并将 JDK 的 bin
目录添加到 PATH
环境变量。
验证安装测试:在命令行中运行 java -version
和 javac -version
,来验证安装并检查 JDK 版本。
1.2 Java 开发工具
Java 环境包包含内置开发工具在 bin 目录下面
Java 内置常用开发工具
开发工具 | 具体文件 | 详细介绍 |
---|---|---|
Java 编译器 | Javac.exe | 将- Java 源代码文件(.java)转换成字节码文件 (.class)。 |
Java 解释器 | Java.exe | 用来执行 javac 编译成的字节码。 |
Java Applet 浏览器 | appletviewer.exe | 执行 HTML 文件上的 Java 小程序的 Java 浏览器。 |
Java 文档生成器 | javadoc.exe | 会使用 Java 源文件代码生成一组 HTML 格式的相关文件。 |
Java 调试器 | jdb.exe | 一个除错器,为 java 程序提供一个命令行调试环境,以便于对 java 解释的类进行除错。 |
Java 反汇编器 | javap.exe | 反汇编一个 Java 字节代码文件,返回类的相关成员。 |
1.3 JDK 和 JRE 区别
JRE 的地位就像一台计算机一样,编写的 Java 程序必须要JRE才能运行。只要安装了 JRE,就可以正确运行 Java 应用程序。而 JDK 是用于开发 Java 程序的工具包,其中包含了 JRE。
1.4 javac 编译字节码文件
javac 是 Java 编译器命令,用于将 Java 源代码文件编译成字节码文件。编译后,将在同一目录下生成一个以 .class 为后缀的字节码文件,其文件名与源代码文件名相同。这个字节码文件可以在 Java 虚拟机上运行。
javac FileName.java
其中 FileName.java 是要编译的 Java 源代码文件的文件名。请注意,使用 javac 编译 Java 源代码文件需要安装 Java Development Kit(JDK)并配置相应的环境变量。如果未正确配置环境变量,则可能无法在命令行中正确识别 javac 命令。
1.5 Java 基本数据类型
Java 是双类型的系统,也就是基本数据类型和对象数据类型,简称基本类型和对象。 其中 Java 中有 8 个预定义的基本类型。
byte, short, int, long, float, double, boolean, char
基本数据类型内存占用
1.6 Java Scanner 控制台
在 Java 中 Scanner 类是一个用于获取用户输入的类。它通常用于读取键盘输入操作,从控制台窗口的命令行读取输入数据,或者从文件或字符串中读取输入数据。
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
System.out.println(i);
1.7 Java 查询包顺序
使用其他类的规则
使用同一个包中的类时,不需要导包。
使用java.lang包中的类时,不需要导包。
其他情况都需要导包。
如果同时使用两个包中的同名类,需要用全类名。
2. 常用引用数据类型
2.1 StringBuilder 创建字符串
StringBuilder是Java中的一个类,它用于创建可变字符串。与String类不同,StringBuilder类的对象可以修改。这使得StringBuilder在需要频繁修改字符串时更加高效。
StringBuilder sb = new StringBuilder();
sb.append("Hello").append(" ").append("World!");
System.out.println(sb.toString());
sb.delete(5, 10); # 删除从第 5 个位置开始,到第 10 个位置结束的字符
System.out.println(sb.toString());
sb.replace(2, 5, "Java");
System.out.println(sb.toString());
2.2 ArrayList 创建集合
我们创建的是 ArrayList 的对象,而 ArrayList 是 java 已经写好的一个类这个类在底层做了一些处理
打印对象不是地址值,而是集合中存储数据内容在展示的时候会拿 [] 把所有的数据进行包裹。
3. Class 面向对象
Java 是一种完全面向对象的编程语言。这意味着在 Java 中,一切都是对象,这包括我们所编写的类、接口、方法,甚至基本数据类型。这种全盘面向对象的特性使得 Java 非常适合构建复杂、可重用的软件架构。
3.1 OOP 面向对象编程
OOP 是面向对象编程(Object-Oriented Programming)的缩写。它是一种编程范式,将程序看作是一系列对象的集合,这些对象之间通过消息传递进行通信和协作。
在 OOP 中,对象是类的实例,类是对象的蓝图或模板,定义了对象的基本结构和行为。类中的属性定义了对象的状态,而方法则定义了对象的行为。通过封装、继承、多态和抽象等特性,OOP 提供了构建复杂、可维护的软件系统的强大工具。
特性 | 名称 | 详细说明 |
---|---|---|
封装性 | Encapsulation | 在面向对象编程中,对象的状态(数据元素)和行为(方法)被捆绑在一起,称为封装。这意味着一个对象的状态不能直接访问,只能通过对象的方法来间接访问。这种封装方式提供了更好的数据隐藏和安全性。 |
继承性 | Inheritance | 继承是面向对象编程的另一个重要特性。它允许我们创建一个新的类(称为子类或派生类),该类继承了另一个类(称为父类或基类)的属性和方法。子类可以重写父类的方法,也可以添加新的方法。这种特性使得代码重用和抽象变得更加容易。 |
多态性 | Polymorphism | 多态是指一个接口或超类可以引用多种实际类型的实例。在运行时,具体引用哪种类型的实例由对象实例决定,而不是由代码决定。这可以提高代码的灵活性和可扩展性。 |
抽象性 | Abstraction | 抽象是指只展现对象行为特性的接口。在 Java 中,我们可以通过抽象类或接口来实现抽象。抽象可以使得程序更加灵活,更容易适应变化。 |
3.2 Java class 类构造函数
构造方法的作用?
创造对象的时候,由虚拟机自动调用,给成员变量进行初始化的。无参数构造方法初始化的对象时,成员变量的数据均采用默认值。有参数构造方法在初始化对象的时候,同时可以为对象进行赋值。
构造方法有哪些注意事项?
任何类定义出来,默认就自带了无参数构造器,写不写都有。一旦定义了有参数构造器,无参数构造器就没有了,此时就需要自己写无参数构造器了。建议在任何时候都手动写上空参和带全部参数的构造方法。
3.3 static 静态变量
在Java中,静态变量(static variable)是类变量的一种,它们属于类本身,而不是类的具体实例。静态变量在类中使用static关键字进行声明。静态变量是随着类的加载而加载的,优先于对象出现的。
静态变量特点
静态变量不依赖于任何对象实例,因此它们在类被加载时就已经分配了内存空间。
静态变量在所有实例中共享,即如果一个实例改变了静态变量的值,那么这个改变会影响所有其他实例。
静态变量可以通过类名直接访问,而不需要创建类的实例。
静态变量在声明时必须进行初始化,否则编译器会报错。
Java 静态成员方法
在Java中,静态成员方法是一种属于类本身的方法,而不是类的实例。你可以通过类名直接访问静态方法,不需要创建类的实例。
注意,静态方法只能直接访问静态成员(变量和方法)。他们不能直接访问非静态成员,因为非静态成员需要类的实例来访问。如果你尝试在静态方法中访问非静态成员,编译器会报错。
3.4 Java vtable 虚方法表
虚方法表(Virtual Method Table,简称vtable)是Java虚拟机(JVM)实现动态派发的重要机制。在Java中,当一个类继承另一个类时,子类会继承父类中的所有非私有方法。然而,在运行时,JVM需要根据实际的对象类型来动态地调用相应的方法。这就是虚方法表发挥作用的地方。
虚方法表是一个表格,其中存储了对象类型所对应的方法的引用。当调用一个对象的方法时,JVM会通过查找该对象的虚方法表来确定要执行的方法。具体来说,JVM会根据对象的实际类型来确定应该查找哪个虚方法表,并在该表中查找对应的方法。
虚方法表的实现机制是Java虚拟机在运行时动态派发的基础。通过使用虚方法表,JVM可以实现动态派发,即在运行时根据实际的对象类型来选择要执行的方法。这种机制可以提高代码的灵活性和可维护性,因为可以根据需要动态地改变对象的行为。
3.5 Java 子类方法重写
方法名、参数列表必须与父类中被重写的方法相同。
返回类型必须与父类中被重写方法的返回类型相同或是其子类型。
访问权限不能比父类中被重写方法的访问权限更低。例如,如果父类的方法是public的,那么子类重写该方法时只能使用public访问权限,不能使用protected或private访问权限。
重写方法不能抛出比被重写方法更宽泛的异常类型。如果被重写方法没有声明任何异常,那么重写方法也不能抛出异常;如果被重写方法声明了某些异常,那么重写方法可以不声明这些异常,或者声明相同的异常或其子类异常,但不能声明更宽泛的异常。
3.6 class 继承特性概述
子类能继承父类哪些内容?
3.7 class 类访问权限
在Java中,有三个关键字可以用来定义类的访问权限,分别是private
,protected
和public
。
访问权限 | 详细说明 |
---|---|
private | 如果一个类的成员被声明为private ,那么这个成员只能被其本身访问,其他任何类都无法直接访问这个成员。 |
protected | 如果一个类的成员被声明为protected ,那么这个成员可以被其本身、同一包下的其他类以及其子类访问。 |
public | 如果一个类的成员被声明为public ,那么这个成员可以被任何其他类访问。 |
这些访问权限关键字决定了其他类如何访问一个类的成员。通过合理使用这些关键字,可以有效地控制程序的访问权限,保证程序的安全性和稳定性。
3.8 class 多态特性概述
Java 多态(Polymorphism)是面向对象编程的四大基本特性之一,其他三个为封装(Encapsulation)、继承(Inheritance)和抽象(Abstraction)。Java 多态是指父类引用指向子类对象。具体来说,如果一个父类引用变量被用来引用子类对象,那么该变量就可以调用子类中重写(Override)的父类方法,以及继承的父类方法。
Java 多态实现方式
方法重写(Override):子类重写父类中的方法,实现自己的行为。
接口实现(Implement):子类实现一个接口,并重写接口中的方法,实现自己的行为。
类型转换:将父类对象强制转换为子类对象,然后调用子类中的方法。
继承和多态性结合使用:子类继承父类并重写其方法,同时将子类对象赋值给父类引用变量,实现多态性。
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
System.out.println(dog.name);
dog.show();
}
}
class Animal{
public String name = "动物";
public void show() {
System.out.println("动物 - show");
}
}
class Dog extends Animal{
public String name = "狗狗";
public void show() {
System.out.println("狗狗 - show");
}
}
调用成员变量:编译看左边,运行也看左边。
编译看左边就是 javac 编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有编译失败。运行也看左边就是 java 运行代码的时候,实际获取的就是左边父类中成员变量的值。
调用成员方法:编译看左边,运行看右边。
编译看左边就是 javac 编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功,如果没有编译失败。运行看右边就是 java 运行代码的时候,实际上运行的是子类中的方法。
Polymorphism 多态的弊端是什么?
不能调用子类的特有功能报错的原因是当调用成员方法的时候,编译看左边,运行看右边。那么在编译的时候会先检查左边的父类中有没有这个方法,如果没有直接报错。
4. File 文件读写操作
4.1 Java File 读写文件
try {
File file = new File("input.txt");
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = reader.readLine();
while (line != null) {
System.out.println(line);
line = reader.readLine();
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
FileWriter writer = new FileWriter("output.txt");
writer.write("Hello World!");
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
5. 常用 API 概述
5.1 Runtime 运行时环境
6. Java 进阶知识点
6.1 Java 反射机制
获取 class 对象的 3 种方式(字节码文件对象)
1. class.forName("全类名");
2.类名.class
3.对象.getclass( );