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
 18- public 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的
 
- 不管有没有出现异常,