Java程序设计备忘
本文最后更新于 2023年3月3日 下午
学习 Java 程序设计时提炼的备忘,供大家学习
Java 程序设计备忘
Java 的运行原理和跨平台
- 编译型语言:把做好的源程序全部编译成二进制代码的可运行程序。然后,可直接运行这个程序。
(经过一次编译之后,可以由操作系统直接执行)
- 解释型语言:把做好的源程序翻译一句,然后执行一句,直至结束。
(Java 代码编译后不能直接运行,它是解释运行在 JVM 上的)
Java 的语言的特点
-
Java 是纯面向对象的语言
-
平台无关性
借助Java虚拟机,可以做到一次编译,到处运行
-
Java 提供了丰富的内置的类库
-
Java 语言提供了 Web 应用开发的支持
-
Java 语言具有良好的安全性和健壮性
-
程序严谨整洁
-
Java 的强类型机制,垃圾回收器,异常处理,安全检查机制使得java语言编写的程序有更好的健壮性和鲁棒性
面向对象
三种典型
-
封装:把客观事物封装成抽象的类。隐藏属性和方法的实现细节,仅对外公开接口
-
继承:子类可以使用父类的所有功能,并且对这些功能进行扩展。继承的过程,就是从一般到特殊的过程
-
多态:接口的多种不同的实现方式即为多态。同一操作作用于不同的对象,产生不同的执行结果。在运行时,通过指向基类的指针或引用(Java 只能是引用)来调用派生类中的虚函数来实现多态
对比面向过程
面向对象更加封闭也更安全,思维方式也更加贴近现实生活。
Java的基本数据类型
- 位数确定,不因为操作系统不同而不同
- 所有基本类型的关键词都是小写
基本类型 | 大小(bits) | 范围 |
---|---|---|
char | 16 | |
byte | 8 | |
short | 16 | |
int | 32 | |
long | 64 | |
float | 32 | - |
double | 64 | - |
判断对象相等
-
=:
-
java 中的基本数据类型判断是否相等,直接使用“==”就行了,相等返回 true,否则,返回 false
-
对象的==表示引用变量指向的内存是否相同
假设有两个引用对象 obj1、obj2。
obj1==obj2
判断是 obj1、obj2 这两个引用变量是否相等,即它们所指向的对象是否为同一个对象- 对象判等,需要重写 equal 函数
-
-
equals()
:
-
先用“==”判断是否相等
-
判断
equals()
方法的参数是否为 null:-
如果为 null,则返回 false;因为当前对象不可能为 null,如果为 null,则不能调用其
equals()
方法,否则抛java.lang.NullPointerException
异常。 -
当参数不为 null,则如果两个对象的运行时类(通过
getClass()
获取)不相等,返回 false,否则继续判断。
-
-
判断类的成员是否对应相等。
- 实例
1 |
|
-
Java字符串判断相等
- 字符串相等用
equals()
方法
实例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public class StringEquals {
public static void main(String[] argv) {
String s1=new String("Hello");
String s2=new String("Hello");
if(s1==s2) {
System.out.println("== true");
}
else{
System.out.println("== false");
}
if(s1.equals(s2)) {
System.out.println("equals true");
}
}
}
输出结果:
== false
equals true - 字符串相等用
初始化
-
显式静态:
Java允许多个静态初始化动作组织称一个特殊的“静态语句”-
和其他静态初始化动作一样,该段代码仅执行一次
-
首次生成这个类的一个对象或者首次访问那个类的静态数据成员(即便从未生成过那个类的对象)时
-
加上static关键字
- static修饰的语句或变量的特点有:
1. 随着类的加载而加载
2. 优先于对象存在
3. 为所有的对象共享
4. 可以使用类名调用,即类方法
- static修饰的语句或变量的特点有:
-
-
非静态实例的初始化:
- 实例初始化的语句在构造函数之前执行
-
总结:
拿单个的类来讲,执行顺序是 静态初始化块 -> 初始化块 -> 构造器
我们知道,当子类继承父类时,执行顺序是先执行父类,再执行子类。根据上述的顺序,我们可以得到如下的执行顺序:
1. 父类静态初始化块
2. 子类静态初始化块
3. 父类初始化块
4. 父类构造器
5. 子类初始化块
6. 子类构造器
- 实例:
1 |
|
继承
- 继承使用
extends
关键字 - 被继承的类称为父(超类),新类叫做子类
- 使用继承时,子类会得到父类所有的域和方法
- 继承并不是复制基类的接口
- 使用
super
表示父类
组合与继承
- 组合关系(本质是“has-a”关系)
组合其实是使用程序的代码,而非使用其形式 - 继承关系(本质是“is-a”关系)
继承保留原有代码的结构基石,在上面进行特性化补充
多态
向上转型
新类和基类的关系可以用“新类是现有类的一种类型”概括
可以将子类的对象赋值给父类的引用,称为向上转型
网络
网络编程的实质就是设备(例如计算机)之间的数据传输
网络中包含的设备有:计算机、路由器、交换机等等
网络是分层的
七层参考模型和协议对应的关系
网络层 ----- IP(网络之间的互联协议)
传输层 ----- TCP(传输控制协议)、UDP(用户数据报协议)
应用层 ----- Telnet(Internet远程登录服务的标准协议和主要方式)、FTP(文本传输协议)、HTTP(超文本传送协议)
OSI参考模型 | TCP/IP |
---|---|
应用层 | |
表示层 | 应用层 |
会话层 | |
传输层 | 传输层 |
网络层 | 网络层 |
数据链路层 | 数据链路层 |
物理层 | 物理层 |
构造函数调用的优先级
-
调用静态对象的构造函数
-
调用基类的构造函数
-
构造层次结构的根,然后一层层的,直到最上层
-
如果构造函数内部存在覆盖的方法,则调用覆盖后的方法
-
按照声明的顺序调用成员的构造函数
-
调用子类的构造函数
抽象类
和接口区别
-
抽象类中可以有非抽象方法,接口中则不能有非抽象方法。
-
接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法。
-
抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是
public static final
类型的。 -
接口可以省略
abstract
关键字,抽象类不能。 -
一个类只能继承一个抽象类,而一个类却可以实现多个接口。
异常类
创建自定义异常
关键是继承和抛出操作
实例
1 |
|
throw:就是自己处理一个异常,有两种方式要么是自己捕获异常 try...catch
代码块,要么是抛出一个异常(throws 异常
)
throws
在方法后边声明异常,其实就是自己不想对异常做出任何的处理,告诉别人自己可能出现的异常,交给别人处理,然别人处理
多线程
进程和线程的区别
-
线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位
-
一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线
-
进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见
-
调度和切换:线程上下文切换比进程上下文切换要快得多
-
线程也叫“轻量级进程”
Java实现多线程的方法
- 继承 Thread 类,重写该类的
run()
方法
1 |
|
Runnable
实现接口,重写run()
方法
1 |
|
synchronized
关键字可防止代码的关键代码段一次被多个线程执行。如果应用于静态方法,那么,当该方法一次由一个线程执行时,整个类将被锁定。
标识符
- public protected friendly private
作用域 | 当前类 | 同一package | 子孙类 | 其他package |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
friendly | √ | √ | × | × |
private | √ | × | × | × |
默认的是 friendly
-
在一个
*.java
的文件中,只能有一个public class
的声明,但是允许有多个class
的声明;public class
类名必须与文件名一致- 不管有没有出现异常,
finally
中的语句块都会执行,finally
语句通常用来释放资源,关闭数据库,
关闭文件等操作 - 当
try
和catch
中出现return
时finally
仍然会执行 finally
是在return
后面的表达式之后执行的。此时并没有将值返回,而是将数据保存在局部变量中,待finally
中语句执行完成后返回- 任何执行
try
或者catch
中的return
语句之前,都会先执行finally
语句,但是return
表达式的值会被计算出来,但是不会返回。如果finally
语句存在的话。如果finally
中有return
语句,那么finally
中的return
是一定会被return
的
- 不管有没有出现异常,