Java基础复习
1、什么是JVM?
JVM是Java虚拟机,Java编译器首先将Java代码编译为字节码,然后字节码转换为本地机器码(计算机可以直接执行的指令集)。
2、什么是JRE?
JRE(Java运行时环境)是一个软件包,提供Java类库,Java虚拟机(JVM)和运行Java应用程序所需的其他组件。
3、JDK是什么?
JDK(Java开发工具包)是使用Java开发应用程序所需的软件开发工具包。
JVM、JRE、JDK之间关系
4、Java方法重载
两个或多个方法的参数不同(不同数量的参数,不同类型的参数或者两者都不同),这样做是为了方便程序员来定义行为相同但参数不同的函数,有助于提高程序的可读性。
5、Java中的可变参数(varargs)
解决创建Java方法时,但是不确定方法将接收多少个参数。Varargs是变量参数的缩写。在Java中,方法的参数可以接受任意数量的值。可以接收可变数量的值的该参数称为varargs。
6、Java语言支持的变量类型
- 类变量:独立于方法之外的变量,用static修饰。
- 示例变量:独立于方法之外的变量,不过没有static修饰。
局部变量:类方法中的变量。
7、Java输入和输出
- System.out.println(); 在引号内打印字符串,类似于print()方法。然后光标移动到下一行的开头。
- System.out.print(); 在括号内打印字符串。
- System.out.printf(); 提供字符串格式化(类似于C++编程中printf)。
8、Java类和对象
Java是一种面向对象的编程语言。它基于对象的概念。
这些对象具有两个特征:状态、行为
面向对象(OOP)编程的原理:
- 封装:是指将字段和方法绑定在单个类中。将类中的类似字段和方法绑定在一起有助于隐藏数据。
- 继承:在Java中,我们使用extends关键字从类继承。例如,我们从Animal类继承了Dog类。Animal是超类(父类或基类),而Dog是子类(或派生类)。子类继承超类的字段和方法。
- 多态:是指同一实体(方法,运算符或对象)在不同情况下的行为会有所不同。
- 运行时多态:在Java中,可以通过方法重写来实现运行时多态。假设在父类及其子类中创建了相同的方法。在这种情况下,将要调用的方法取决于调用该方法的对象。
- 编译时多态:可以通过Java中的方法重载和运算符重载来实现编译时多态。
- 方法重载:在Java类中,如果参数不同,则可以使用相同的名称创建方法。
- 运算符重载:Java中的某些运算符对不同的操作数的行为由所不同。
9、Java类与对象
在用Java创建对象之前,需要定义一个类。
举个形象的例子:我们可以将类视为房子的草图(原型)。它包含有关门、窗户等各种详细信息。基于这些描述,我们可以建造房屋。房子就是对象。
由于可以用相同的描述制作许多房屋,因此我们可以根据一个类创建多个对象。
类中可以有各种各样的变量和方法,这些都是类的成员。
对象是类的实例。例如,我们定义Animal是一个类,那么Cat、Dog等都可以视为Animal类的对象。
10、Java数组(Arrays)
数组是相似类型数据的集合。它是一个容器,用于保存单一类型的数据(值)。
int[] name = new int[5];
int[][] a = new int[3][4];
11、Java中的方法
在计算机编程中,函数是执行特定任务的代码块。在面向对象编程中,该方法是用于函数的术语。方法绑定到类,并且它们定义类的行为。
Java方法的类型有两种:标准库方法、用户定义的方法
12、Java构造函数
在Java中,每个类都有它的构造函数,当类的对象被创建时(实例化),该构造函数将被自动调用。构造函数类似于方法,但实际上不是方法。
一个Java方法和Java构造函数通过其名称和返回类型进行区分。构造函数与类的构造函数同名,并且不返回任何值。
构造函数分为无参构造和带参构造。
13、Java访问控制修饰符
Java中,可以使用访问控制符类保护类、变量、方法和构造方法的访问。
- default(即什么都不写):在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
- private:在同一类内可见。使用对象:变量、方法。不能修饰类(外部类)。
- public:对所有类可见。使用对象:类、接口、变量、方法。
- protected:对同一包内的类和所有子类可见。使用对象:变量、方法。不能修饰类(外部类)。
14、Java中this关键字
在Java中,this关键字用于引用方法或构造函数中的当前对象。
this与getters和setters:
在setter方法中分配值,在getter方法中访问值。
15、Java中final关键字
在Java中,final关键字用于表示常量。它可以与变量,方法和类一起使用。任何实体(变量、方法或类)一旦被声明final后,只能分配一次。也就是说,final变量不能用另一个值重新初始化。final方法不能被重写。final类不能被继承。
16、Java中instanceof关键字
instanceofs关键字是二进制运算符。它用于检查对象是否是特定类的实例。
result = objectName instanceof className;
17、Java中super关键字
Java中super关键字在子类中用于访问父类成员(属性、构造函数和方法)。
super关键字的使用:
- 调用子类中重写的父类的方法。
- 如果超类(superclass)和子类(subclass)都有同名的属性,则访问超类的属性(字段)。
- 从子类构造函数显式地调用超类无参数化构造函数或参数化构造函数。
18、Java抽象类和抽象方法
Java抽象类:抽象类是无法实例化的类(我们无法创建抽象类的对象)。在Java中使用abstract关键字声明一个抽象类。虽然不能实例化抽象类,但是我们可以从中创建子类。我们可以创建子类的对象来访问抽象类的成员。
在Java中,必须在子类中重写超类的抽象方法。这是因为子类继承了超类的抽象方法。子类包含抽象方法,需要重写这些方法,注意:如果子类也被声明为抽象,则不需要强制重写抽象方法。
- 要使用sbstract关键字来创建抽象类和方法
- 抽象方法没有任何实现(方法体),需要继承的子类实现
- 包含抽象方法的类也应该是抽象的
- 抽象类不能实例化
- 为了实现抽象类的功能,需要从其继承子类并创建该子类的对象
- 子类必须重写抽象类的所有抽象方法,但是,如果子类也是抽象类则不必强制重写抽象方法。
- 可以使用抽象类的引用来访问抽象类的静态属性和方法。
19、Java中为什么要使用抽象类?
抽象是面向对象编程的重要概念。抽象表示仅显示所需的信息,而隐藏所有不必要的细节。这使得我们能够通过使用更简单、更高级的想法省略或隐藏细节来管理复杂性。
20、Java接口(Interface)
在Java中,接口类似于抽象类。但是接口没有任何非抽象方法。像抽象类一样,我们无法创建接口的对象。但是,我们可以在其他类中实现接口。在Java中,我们使用implement关键字来实现接口。
21、为什么要使用接口呢?
- 接口提供了类(实现它)必须遵循的规范,至于如何在这个规范下实现方法,由接口实现类来完成。
- 与抽象类相似,接口可以帮助我们实现Java抽象。
- 接口还可以在Java中实现多重继承。如果子类是从两个或多个类继承的,则它是多重继承。
Java中无法通过继承来实现多重继承。但是一个类可以实现多个接口。
接口中也存在默认方法,这种方法在接口中直接实现了,实现类中可以不必重写这个方法,也可以重写此方法进行方法重载。这样就避免了接口被多个类所继承而造成的后期修改繁琐问题。
与类相似,接口可以继承其他接口,extends关键字被用于继承接口。
22、Java嵌套和内部类
Java创建两种类型的嵌套类:
- 非静态嵌套类(内部类)
非静态嵌套类是一个类中嵌套着另一个类。它有权访问封装类(外部类)的成员。它通常被称为inner class(内部类)。
嵌套类的实例化的步骤也是显而易见的:先创建外部类的对象,再使用外部类创建内部类的对象。
- 静态嵌套类
在Java中,我们可以在一个类中嵌套另一个静态类。这种类称为静态嵌套类(static nested class)。与内部类不同,静态嵌套类无法访问外部类的成员变量。这是因为静态嵌套类不需要创建外部类的实例。
例如:
//创建外部类的对象
Animal animal = new Animal();
//非静态类的对象创建
Animal.Reptile reptile = animal.new Reptile();
reptile.displayInfo();
//静态嵌套类的对象创建
Animal.Mammal mammal = new Animal.Mammal();
mammal.displayInfo();
- Java将内部类视为类的常规成员。就像在类中声明的方法和变量一样。
- 由于内部类是外部类的成员,所以可以将任何访问修饰符(如:private、protected)应用到内部类。
- 由于嵌套类的其封闭的外部类的成员,因此可以使用(.)表示法访问嵌套类及其成员。
- 使用嵌套的类提供更好的封装。
- 非静态嵌套类(内部类)可以访问/封闭类的其他成员,即使它们被声明为私有的也是如此。
- 只能在不同的类中嵌套静态类,反之不行。
23、Java匿名类
在Java中,一个类可以包含另一个称为嵌套类的类。可以不提供任何名称的情况下创建嵌套类。没有任何名称的嵌套类称为匿名类。
通俗来讲就是在一个类的方法中实例化另一个类并重写这个类中的方法(形成了匿名类和类中的方法)。然后可以同个实例化主类并调用方法,来实现这个嵌套类的调用,即调用匿名类的方法。这种方式对接口同样适用。
其优点是在匿名类中,只要需要就创建对象,从而执行某些特定任务。
Object = new Example() {
public void display() {
System.out.println("匿名类重写display()方法。");
}
};
24、Java单例模式
Singleton(单例)是一种设计模式,而不是Java特有的功能。它确保只创建一个类的实例。
Java中的单例模式实现:
- 创建一个private的构造函数,该构造函数限制在类之外创建对象
- 创建一个引用单例对象的private属性。
- 创建一个public static方法,该方法允许我们创建和访问我们创建的对象。在方法内部,我们将创建一个条件来限制我们创建多个对象。
class SingletonExample {
//引用对象的私有字段
private static SingletonExample singleObject;
private SingletonExample() {
//SingletonExample类的构造函数
}
public static SingletonExample getInstance() {
//编写仅允许我们创建一个对象的代码
//根据需要访问对象
}
}
25、Java枚举(Enum)
在Java中,枚举是一种具有固定的可能值集的类型。使用enum关键字来声明枚举。使用枚举使代码更加直观,提供了编译时类型的安全性。
26、Java反射(Reflection)
在Java中,反射允许我们在运行时检查和操作类、接口、构造函数、方法和字段。Java中有一个名为Class的类,该类在运行时保留有关对象和类的所有信息,Class对象描述了特定类的属性,该对象用于执行反射。
27、Java包(package)
为了更好地组织类,Java提供了包机制,用于区别类名的命名空间。包的作用:
- 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
- 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当相同时调用两个不同包中相同类名的类时,应该加上包名加以区别。
- 包限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
28、Java注解(Annotations)
Java注解是我们程序源代码的元数据(有关数据的数据)。它们向编译器提供关于程序的附加信息,但不是程序本身的一部分。这些注解不会影响已编译程序的执行。
29、Java断言(Assert)
Java中的断言通过测试我们认为是正确的代码来帮助检测错误。
断言的有点:
- 快速高效地检测和纠正错误。
- 断言检查仅在开发和测试期间进行。它们会在运行时自动在生产代码中删除。
- 它有助于删除样板代码并使代码更具可读性。
- 重构和优化代码,以增强其正确运行的信心。
30、Java集合框架
Java集合框架提供了一组接口和类,以实现各种数据结构和算法。例如:集合框架的LinkedList类提供了双向链接列表数据结构的实现。
集合框架的接口:
- List接口
List接口是一个有序的集合,它允许我们像数组一样添加和删除元素。
List接口实现类:
- 数组列表(ArrayList类)
- 链表(LinkedList类)
- 向量(vector类)
- 堆栈(Stack类)
- Set接口
Set接口允许我们将元素存储在不同的集合中,它不能有重复的元素。
Set接口的实现类:
-
- HashSet
- LinkedHashSet
- EnumSet
- TreeSet
- Queue接口
先进先出方式存储和访问元素。
实现类:
-
- ArrayDeque
- LinkedList
- PriorityQueue
- Java Map接口
Map接口允许元素以键值对的形式存储。键是唯一的名称,可用于访问Map中的特定元素。
Map实现类:
-
- HashMap
- EnumMap
- LinkedHashMap
- WeakHashMap
- TreeMap
- Java Iterator接口
Java集合框架的Interator接口允许我们访问集合的元素。它有一个子接口Listlterator。所有Java集合都包含一个iterator()方法,此方法返回用户迭代集合元素的迭代器实例。
- Java ListIterator接口
该接口提供了访问列表元素的功能。它是双向的,可以在两个方向上迭代列表的元素。
31、Java I/O类
- FileInputStream
- ByteArrayInputStream
- ObjectInputStream
- ObjectOutputStream将Java对象转换为响应的流。这称为序列化。这些转换后的流可以存储在文件中,也可以通过网络传输。如果读取这些对象,则将使用ObjectInputStream,它将把流转换回响应的对象。这称为反序列化。
- FileOutputStream
- ByteArrayOutputStream
- ObjectOutputStream
32、Java Reader类
- BufferedReader
- 内部维护一个8192个字符的缓冲器,从而减少I/O次数。
- InputStreamReader
- InputStreamReader类与其他输入流一起使用。是字节流和字符流之间的桥梁。因为InputStreamReader从输入流中读取作为字符的字节。
- FileReader
- StringReader
33、Java Writer类
- BufferedWriter
- OutputStreamWriter
- FileWriter
- StringWriter
34、Java Scanner类
用于从不同的源(例如:输入流、用户、文件等)读取输入数据。
35、Lambda表达式
Lambda表达式本质上是一个匿名或未命名的方法。lambda表达式不能单独执行。它用于实现功能接口定义的方法。
(parameter list) -> lambda body
36、Java泛型
泛型有助于创建可与不同类型的对象(数据)一起使用的类、接口和方法。从而可以重用代码。泛型不适用于基本类型(int、float、char等)。
例如:ArrayList<T> list = new ArrayList<>();其中T是一个泛指。
有界类型:<T extends A>这表示T的类型只能是A的子级数据类型。
Java泛型的优点:
- 代码可以复用。
- 编译时类型检查。
- 泛型与集合一起使用。
37、Java序列化
Java提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。
整个过程多是Java虚拟机独立,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。
类ObjectInputStream和ObjectOutputStream是最高层次的数据流,他们包含反序列化和序列化对象的方法。
38、Java多线程编程
一个线程的神明周期:
- 新建状态:
使用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态知道程序start()这个线程。
- 就绪状态
当线程对象调用了start()方法之后,该线程就进入就绪态。就绪态的线程处于就绪队列中,要等待JVM里线程调度器的调度。
- 运行状态
如果就绪状态的线程获取CPU资源,就可以执行run(),此时线程就处于运行状态。处于运行态。
- 阻塞状态
如果一个线程执行了sleep、suspend等方法,失去所占用的资源之后,该线程就从运行态进入阻塞态。在睡眠时间已到或者获得设备资源后就重新进入就绪态。
- 死亡状态
运行的终止状态。
Java提供了三种创建线程的方法:
- 通过实现Runnable接口。
- 通过继承Thread类本身。
- 通过Callable和Future创建线程。
采用实现Runnable、Callable接口的方式创建多线程时,线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。
使用继承Thread类的方式创建多线程时,编写简单,如果需要访问当前线程,则不需要使用Thread。currentThread()方法,直接使用this即可获得当前线程。
欢迎转载,转载时请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.