目录
Java的概述
Java是一种高级计算机语言,是由Sun公司在1995被重命名为Java,最初的名字是OAK。
Java是支持跨平台和完成面向对象的程序设计语言。
Java的语言特点
①简单性 ②面向对象 ③安全性 ④跨平台性 ⑤支持多线程 ⑥分布式
JDK和JRE
●JDK(Java Development kit):是一套Java开发环境,它包含了Java编译器,Java调试等工具。
●JRE(Java Rutime Environment):Java程序的运行环境。
Java注释
●单行注释 ( 符号“//”)
int a = 2; //定义一个整形变量
●多行注释 (符号以 “/*”开头,“*/”结尾)
/*
int a = 1;
int b = 2;
*/
●文档注释 (符号以“/**”开头,“*/”结尾)
int a,b,c;
/**
hello
*/
Java标识符
组成:Java中的标识符可以由任意顺序的字母、下划线(_)、美元符号($)、数字组成;
注意:标识符不能以数字开头,也不能是Java中的关键字,true、false和null虽然不是关键字,但具有特殊意义,也不可作为标识符使用。
Java常见关键字
int | this | abstract | for | continue | new |
public | finally | boolean | return | float | if |
switch | default | private | protected | throw | throws |
long | short | assert | goto | package | synchronized |
do | double | implements | byte | else | import |
case | enum | instanceof | transient | catch | extends |
try | char | final | interface | static | void |
class | strictfp | volatile | const | native | while |
super |
注意:所有关键字是小写
变量的数据类型(两种)
①基本数据类型
●数值型(可以分为整数类型和浮点类型)
1.整数类型:byte、int、long、short
2.浮点类型:float、double
●字符型(char)
●布尔型(boolean)
②引用数据类型
●接口、类、枚举等引用数据类型
各数据类型的内存空间
知识点:一个字节等于8位内存空间
数据类型 | 内存空间 | 取值范围 |
byte | 8位 | -128~127 |
short | 16位 | -32768~32767 |
int | 32位 | -2的31次方~2的31次方减1 |
long | 64位 | -2的63次方~2的63次方减1 |
数据类型 | 内存空间 | 取值范围 |
float | 32位(4个字节) | 1.4E-45~3.4028235E38 |
double | 64位(8个字节) | 4.9E~1.7976931348623157E308 |
字符型(char):占用16位(两个字节)的内存空间。
Java运算符
①算术运算符
+(加号)、-(减号)、*(乘号)、/(除号)、%(取模;即取余数的意思)、++(自增)、--(自减)
②赋值运算符
=(赋值)、+=(加等于)、-=(减等于)、*=(乘等于)、/=(除等于)、%=(取余等于)
③比较运算符
>(大于)、<(小于)、==(比较左边是否等于右边,判断等于)、>=(大于等于)、<=(小于等于)、!=(不等于)
④逻辑运算符
&(与)、|(或)、!(非)、^(异或)、&&(短路与)、||(短路或)
知识点:&(与)和&&(短路与)的区别:
&(与):与&&不同,&不会跳过执行第二个操作数,无论第一个操作数的值如何,都会对第二个操作数进行求值
&&(短路与): 当使用&&时,如果第一个操作数为假(false),则不会执行第二个操作数,因为整个表达式已经为假,这被称为“短路”特性。这意味着,如果第一个条件不满足,程序将不会执行后续的条件判断或语句。
while循环语句与do…while循环语句的区别
①while
循环语句:
●while
循环先进行条件判断,如果条件为假,则一次循环都不执行;
●可能会出现零次循环的情况;
●循环体执行与条件判断是分离的,即先判断条件,再执行循环体。
②do…while循环
●do...while
循环先执行一次循环体,再进行条件判断;
●至少会执行一次循环体;
●循环体执行与条件判断是在一起的,即先执行循环体,再判断条件。
Java中的方法
方法(Method):是一段可重复调用的代码块,用于执行特定的任务或操作。方法封装了一系列的语句,可以接收输入参数并返回一个值。它是面向对象编程的核心概念之一。
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,...){
执行语句
...
return 返回值;
}
Java中的重载和重写
重载:同一个作用域内方法名想同,参数个数或参数类型不同的方法。
重写:指的是子类重新编写父类中的方法,方法名、返回类型和参数列表都必须相同
区别: 重载是在同一个类中定义多个同名方法,根据不同的参数列表进行区分;而重写是子类重新定义父类的方法,方法名、返回类型和参数列表必须相同,实现了多态性的特性。重载提供了更灵活的方法调用方式,而重写则是实现多态性的重要手段。
Java中的封装、继承,多态
封装(Encapsulation):
①:封装是指将数据和方法打包到一个单一的单元(类)中,并对外部隐藏对象的工作方式。这意味着一个类的内部实现细节对外部是不可见的,只有通过类提供的公共接口(方法)才能与对象进行交互。
②:在Java中,封装可以通过访问修饰符(public、private、protected)来实现。通常,类的成员变量被声明为私有(private),并通过公共(public)方法来访问和修改这些变量。
继承(Inheritance):
①:继承是指一个类(子类)可以继承另一个类(父类)的属性和方法。子类可以拥有父类的所有属性和方法,并且可以在其基础上进行扩展或修改。
②:继承在Java中通过使用关键字extends来实现,子类可以继承父类的非私有成员(字段和方法)。Java中只支持单继承,即一个类只能继承自一个父类,但可以通过接口实现多继承。
多态(Polymorphism):
①:多态是指同一类型的对象在不同情况下表现出不同的行为。在Java中,多态有两种形式:编译时多态(静态多态)和运行时多态(动态多态)。
②:编译时多态是通过方法重载(Overloading)实现的,即同一个方法名但参数列表不同,编译器根据参数类型来决定调用哪个方法。
③:运行时多态是通过方法重写(Overriding)和对象的绑定实现的。当子类重写了父类的方法时,可以在运行时根据对象的类型来确定调用哪个方法,实现了多态性。
数组的遍历
含义:依次访问数组中的每个元素
java中的四种访问控制权限
public(公共的):
①:公共的访问权限,被声明为public的类、接口、变量或方法可以在任何地方被访问,无访问限制。
②:public修饰的成员可以被同一类、同一包以及不同包中的其他类访问。
private(私有的):
①:私有的访问权限,被声明为private的类、接口、变量或方法只能在定义它们的类内部访问。
②:private修饰的成员只能被同一类中的其他成员访问,对外部是不可见的。
protected(受保护的):
①:受保护的访问权限,被声明为protected的类、接口、变量或方法可以在同一包内以及该类的子类中被访问。
②:protected修饰的成员对于同一包中的其他类是可见的,同时也对于子类是可见的。
default(默认的):
①:默认的访问权限,没有指定访问修饰符时,默认为default访问权限(也被称为包级访问权限)。
②:默认访问权限限制了同一个包中的类可以访问该成员,但对于不同包中的类是不可见的。
java中的成员变量和局部变量
成员变量:定义在类中的变量。
局部变量:定义在方法中的变量。
什么是引用数据类型
含义:内存空间可以同时被多个栈引用。
Java中的构造方法
特点:
①:对象创建和初始化: 构造方法在对象创建时被调用,用于初始化对象的状态、属性和数据成员。
②:与类同名: 构造方法的名称必须与类名完全相同,且大小写也要一致。
③:无返回类型: 构造方法没有返回类型(包括void),因为构造方法的主要目的是创建新的对象,而不是返回值。
④:可以重载: 类可以定义多个构造方法,只要它们的参数列表不同,即构成方法重载。
⑤:默认构造方法: 如果没有显式定义任何构造方法,Java会提供一个默认的无参构造方法(没有任何参数),用于创建对象。
this关键字
作用:
①:可以使用this关键字调用本类中的属性。
②:可以使用this关键字调用成员方法。
③:可以使用this关键字调用本类的构造方法。
注意事项:
①:当在构造方法中使用this()调用其他构造方法时,它必须是构造方法的第一条语句,且只能在构造方法内部使用。
②:不能在一个类的两个构造方法中使用this互相调用。
super关键字
作用:可以在子类中调用父类的普通属性、方法和构造方法。
①: 子类可以使用super关键字来引用父类的成员变量和成员方法,以及调用父类的构造方法。这可以解决子类中与父类同名的成员变量或方法的调用冲突问题。
②:子类的构造方法可以使用super关键字来调用父类的构造方法。这样可以在子类的构造方法中先调用父类的构造方法,执行父类的初始化操作,然后再执行子类自己的初始化操作。
final关键字
作用:
①: 如果一个类被声明为final,则表示该类不能被继承。
②: 如果一个方法被声明为final,则表示该方法不能被子类重写(覆盖)。
③: 如果一个变量被声明为final,则表示该变量的值只能被赋值一次,之后不能再修改。这样可以创建一个常量,其值在初始化后不能被更改(常量不可修改)。
Object类
含义:通常称为超类,是所以类的父类,每个类都直接或者间接继承Object类。
Java中的内部类
4种内部类:成员内部类、局部内部类、静态内部类、匿名内部类。
Throwable的两个直接子类
Error类(错误类)和Exception类(异常类)
Java中的异常类
- 编译时异常(Checked Exception):继承自Exception的异常类,表示程序中可能出现的可预测的非致命性异常情况。这些异常必须在代码中进行处理,要么通过捕获并处理异常,要么通过在方法上声明并抛出异常。
- 运行时异常(Unchecked Exception):继承自RuntimeException的异常类,表示程序中可能出现的非预期的异常情况。这些异常通常是由程序错误或错误的使用方式引起的,不需要在代码中显式地捕获或声明。但是,也可以捕获并处理这些异常,以提高程序的健壮性。
Java中封装字符串的类
3个:String类、StringBuffer类、StringBuilder类
- String类: String类是不可变的,一旦创建了字符串对象,其值就不可修改。当对字符串进行拼接、替换等操作时,实际上是创建了一个新的String对象,原对象并不会改变。这种不可变性使得String对象具有线程安全性,并且可以被多个线程共享而不需要额外的同步。
-
StringBuffer和StringBuilder类: StringBuffer和StringBuilder是可变的字符串类,可以通过添加、删除、插入等操作修改字符串内容。
-
StringBuffer是线程安全的,可以在多线程环境中使用,
-
StringBuilder则不是线程安全的,适用于单线程环境。
-
StringBuffer和StringBuilder在使用上基本一致,提供了相似的方法,如拼接、插入、删除等。其中,StringBuffer类的方法都是同步的(线程安全),而StringBuilder类的方法则是非同步的。
Random类
作用:在指定的取值范围内随机产生数字。
Java中的包装类
- Byte: 包装byte类型的数据。
- Short: 包装short类型的数据。
- Integer: 包装int类型的数据。
- Long: 包装long类型的数据。
- Float: 包装float类型的数据。
- Double: 包装double类型的数据。
- Character: 包装char类型的数据。
- Boolean: 包装boolean类型的数据。
Pattern类
作用:用于创建正则表达式。
Java中的集合
- 集合类都位于Java.util包中
- 单列集合(Collection):
- List接口: 继承自Collection接口,表示有序的集合,可以有重复元素。常用的实现类有ArrayList、LinkedList(集合内部维护了一个双向循环链表)、Vector等。
特点:(元素有序,可重复)
-
Set接口: 继承自Collection接口,表示不允许重复元素的集合。常用的实现类有HashSet、LinkedHashSet、TreeSet等。
特点:(元素无序,不可重复)
2. 双列集合(Map):
不属于Collection接口的一部分,表示键值对的映射关系。常用的实现类有HashMap、LinkedHashMap、TreeMap等。
特点:(元素的键值是无序,不可重复的)
Properties集合
作用:用来存储字符串类型的键和值。
Java中的泛型
Java的泛型使用尖括号<>
来指定类型参数,在使用泛型的类、接口或方法中,将具体的类型传递给类型参数。例如<T>
java中的I/O流
- InputStream和OutputStream: 是所有字节输入输出流的基本类。用于处理二进制数据。
- FileInputStream和FileOutputStream: 用于读写文件的字节流类。
- Reader和Writer: 是所有字符输入输出流的基本类。用于处理字符数据。
- FileReader和FileWriter: 用于读写文件的字符流类。
- BufferedInputStream和BufferedOutputStream: 提供缓冲功能的字节流。
- BufferedReader和BufferedWriter: 提供缓冲功能的字符流。
- DataInputStream和DataOutputStream: 用于读写基本数据类型的字节流。
- ObjectInputStream和ObjectOutputStream: 用于读写Java对象的字节流。
多线程实现方式
- 继承java.lang包下的Thread类。
- 实现java.lang.Runnable接口。
线程的生命周期
- 新建状态(New): 当线程对象被创建但还未调用start()方法时,线程处于新建状态。此时线程还没有被启动,处于不可运行状态。
- 就绪状态(Runnable): 当调用了start()方法后,线程进入可运行状态。在可运行状态下,线程可以被线程调度器(Scheduler)选中执行,并不意味着线程一定在运行中,可能在等待CPU资源。
- 运行状态(Running): 线程被选中执行并开始运行时,处于运行状态。此时线程正在执行其任务代码。
- 阻塞状态(Blocked): 当线程试图获取一个锁时,如果锁已经被其他线程占用,线程会进入阻塞状态。只有当获取到所需的锁时,线程才能进入可运行状态。
- 死亡状态(Terminated): 线程执行完其任务代码或者因异常退出后,线程进入死亡状态。处于死亡状态的线程不可再次启动或执行。
setPriority方法
作用:设置线程的优先级。
线程的休眠、插队、让步
- sleep()方法:用于线程休眠。
- join()方法:用于线程插队。
- yield()方法:用于线程让步。
死锁现象
含义:指两个或多个线程互相持有对方所需要的资源,并且都在等待对方释放资源,导致所有线程都无法继续执行的情况。
Java中的JDBC
含义:JDBC(Java Database Connectivity)是一种用于连接和访问数据库的Java API。它提供了一种标准的方式,使Java应用程序能够与各种关系型数据库(如MySQL、Oracle、SQL Server等)进行交互。
- 加载数据库驱动程序: 在使用JDBC之前,需要通过Class.forName()方法加载并注册相应数据库的驱动程序。
- 建立数据库连接: 使用DriverManager.getConnection()方法创建一个与数据库的连接,并提供数据库的URL、用户名和密码等连接信息。
- 创建Statement或PreparedStatement对象: 通过连接对象,可以创建Statement或PreparedStatemnt对象,用于执行SQL语句。
- 执行SQL语句: 使用Statement或PreparedStatement对象的executeQuery()、executeUpdate()或execute()方法执行SQL语句。
- 处理结果集: 如果执行的是查询语句,可以通过ResultSet对象获取返回的结果集,并根据需要进行处理。
- 释放资源: 在使用完JDBC对象之后,需要手动关闭ResultSet、Statement、PreparedStatement和Connection等对象,以释放关联的数据库资源。
Java中的GUI
GUI(Graphical User Interface):图形用户界面。
GUI主要类位于:java.awt(简称AWT)和javax.swing(简称Swing)包中
Swing组件的所以类都继承于Container类。
Swing的顶级容器
- JFrame: JFrame是Swing中最常用的顶级容器之一,表示一个具有标题栏和边框的窗口。它可以包含其他Swing组件,并提供了许多方法来管理窗口的外观和行为,例如设置标题、大小、关闭操作等。
- JDialog: JDialog是一个模态或非模态对话框,通常用于显示警告、提示或用户输入等信息。与JFrame类似,JDialog也提供了一系列方法来管理对话框的外观和行为。
- JApplet: JApplet是用于创建Java Applet的顶级容器,通常用于在web浏览器中展示Java应用程序。与JFrame类似,JApplet也提供了一些方法来管理Applet的外观和行为。
Java中的布局管理器
- FlowLayout(流式布局): FlowLayout按照添加组件的顺序在容器中从左到右排列组件,当一行空间不足时会自动换行。适用于需要按照顺序排列组件的情况。
- BorderLayout(边界布局): BorderLayout将容器分为东、西、南、北和中间五个区域,每个区域只能包含一个组件。适用于需要在容器的不同位置放置不同类型组件的情况。
- GridLayout(网格布局): GridLayout将容器划分为行和列,并将组件按照指定的行数和列数均匀排列。适用于需要将组件按照网格形式排列的情况。
- GridBagLayout(网格包布局): GridBagLayout是一种灵活的布局管理器,可以实现各种复杂的布局。通过GridBagConstraints类来指定每个组件的布局信息,如位置、大小、对齐方式等。
- BoxLayout(盒子布局): BoxLayout沿着容器的一个方向(水平或垂直)依次排列组件,可以嵌套使用以实现复杂的布局。适用于需要按照一定方向排列组件的情况。
Swing常用事件
窗体事件(WindowEvent)、鼠标事件(MouseEvent)、键盘事件(KeyEvent)、动作事件(ActionEvent)。
Java中的面板组件
面板:
- JPanel: 面板组件,用于组织和管理其他组件。
- JScrollPane: 滚动面板组件,用于容纳大量组件并提供滚动功能
组件:
- JButton: 按钮组件,用于触发某种操作或事件。
- JLabel: 标签组件,用于显示文本或图像。
- JTextField: 文本框组件,允许用户输入单行文本。
- JTextArea: 文本区组件,允许用户输入多行文本。
- JCheckBox: 复选框组件,允许用户选择或取消选择一个或多个选项。
- JComboBox: 下拉列表框组件,允许用户从预定义的选项列表中选择一个。(分为可编辑和不可编辑两种形式)
- JRadioButton: 单选按钮组件,允许用户从多个选项中选择一个。
网络通信协议
- TCP/IP(传输控制协议/因特网互联协议)
- UDP(用户数据报协议)
- ICMP(控制报文协议)
java中的抽象类
- 使用abstract关键字声明: 声明一个抽象类时需要使用关键字abstract。
- 不能被实例化: 抽象类不能直接创建对象实例。如果尝试实例化一个抽象类,会导致编译错误。
- 可以包含抽象方法: 抽象方法是在抽象类中声明但没有实现的方法。子类必须实现(覆盖)这些抽象方法,除非子类自己也是抽象类。
- 可以包含具体方法: 抽象类可以包含具体的方法(即有方法体的方法)。子类可以继承并重用这些具体方法。
- 用于实现类的继承和多态: 抽象类通常用于定义一组相关的类的通用行为,并在其子类中实现特定行为。通过继承抽象类,子类可以共享和扩展抽象类的功能,从而实现代码的重用和灵活性。
java中的接口
- 使用interface关键字声明: 在Java中,使用关键字interface来声明接口。
- 属于纯抽象类: 接口是完全抽象的,它不能包含任何的具体实现。它只定义了方法的签名(方法名、参数列表和返回类型),没有方法体。
- 通过实现来使用接口: 类可以通过关键字implements来实现(implement)接口,并提供接口中定义的所有方法的实现。一个类可以实现多个接口,但只能扩展(extend)一个类。
- 多态性: 通过使用接口,可以实现多态性。一个类可以实现多个接口,从而可以在不同的上下文中使用不同的实现。
- 用于解释和扩展: 接口有助于将方法和实现分离,使代码更加灵活和可扩展。接口可以被其他代码引用,而不需要依赖具体的实现类。