面向对象的软件构造概述及Java语言基础(第一周)

软件构造基本流程与目标

软件开发过程模型

  • 瀑布模型
  • 增量模型
  • 原型过程
  • 敏捷开发
  • 测试驱动开发

软件构造目标

  • 可理解
  • 可维护
  • 可复用
  • 时空性能

面向对象的编程思想

  • 封装(Encapsulation):
    • 隐藏对象的属性和实现细节,仅对外公开访问方法;
    • 增强安全性和简化编程
  • 继承(Inheritance)
    • 子类继承父类的特征和行为
    • 实现代码的复用
  • 多态(Polymorphism)
    • 同一个行为具有多个不同表现形态的能力(“一个接口,多个方法”)
    • 提高了程序的扩展性和可维护性
  • 面向对象优点:模块化、自然性、并发性、重用性

Java语言的特征

  • 面向对象
  • ......

Java语言的相关语法

标识符、关键字、分隔符、注释

  • 标识符可由英文字母、数字、下划线、美元符号$组合而成,长度不受限制。
  • 标识符必须以英文字母、下划线、美元符号$开头,不能以数字开头。
  • 分号 ; 、大括号{} 、括号()、[]
  • 注释:\\ 、/**/、/** */

Java数字类型、常量与变量

  • 基本数据类型一共有八种:byte、short、int、long、float、 double、char和boolean
    • 栈内存,直接地址
    • 自动转换与强转
  • 引用数据类型class 、interface、[]
    • 堆内存,(指针)引用
  • 常量
    • 直接常量
    • 符号常量:final修饰
  • 可以直接类.出来

控制流程

  • 条件、循环、跳转

输入与输出(IO)

- System.in、System.out
- println输出后换行而print不换行

数组

  • 数组集合都会检查是否越界

异常机制

try
catch
finally
throws
throw
throws用于方法头,表示的只是异常的申明,而throw用于方法内部,抛出的是异常对象。
throws可以一次性抛出多个异常,而throw只能一个。

Java虚拟机与垃圾回收

  • JVM

类与对象、接口与继承(第二周)

类、对象、继承

  • 类是静态的,类的存在、语义和关系在程序设计时(执行前)就已经定义好了。
  • 对象是动态的,对象在程序执行时可以被创建,修改,删除。
  • 关键字相关自行回忆,构造方法
  • 权限控制相关:private 、protected、public

继承

  • extends
  • 子类不能直接继承父类的构造方法,需利用super关键字
  • 子类能复用父类的属性和方法,子类能增加一些新的属性与方法

抽象类与接口

抽象类

  • abstrct class
  • 抽象类是不能实例化的
  • 作用:
    • 抽象方法实际上相当于定义了“规范”
    • 只能被继承,保证子类实现其定义的抽象方法
    • 可用于实现多态
  • 继承单个 extends

接口

  • interface
  • 比抽象类还要抽象:没有字段,所有方法都是抽象方法
  • 实现多个 implements

有了抽象类,为什么还需要接口?

  • 抽象类解决不了多继承的问题
  • 要实现的方法不是当前类的必要方法
  • 例如“会唱歌” 不是Person类的必要方法,如果设置成抽象方法会浪费资源
  • 为不同类型的多个类实现同样的方法
  • 例如:Person、鸟类、收音机、手机都能“唱歌”

多态

重写(override)

抽象类与抽象方法(abstrct)

接口(interface)

多继承

内部类

接口

超类与supper关键字

Object超类

  • equals方法:比较两个对象是否相等

强制转换不会改变对象本身:强制转换只是改变了引用的类型,不会改变实际指向的对象。

  • super关键字
    • 显式调用父类构造方法
    • 访问父类成员方法和变量

异常的继承框架

  • 异常是一种class,因此它本身带有类型信息。
  • 三种类型的异常:
    • 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
    • 运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
    • 错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

关键字

  • this

  • super

    • 子类使用super语句来继承父类的构造方法
  • 关键词 super, this

    • 相同:
      • 指向对象实例:都指向一个对象实例,不能在 static 上下文(静态方法、静态块)中使用。
      • 调用构造器:都可用于构造方法中,调用其他构造器 (this(...) 调用本类,super(...) 调用父类)。
    • ==不同:==
      • 指代对象: 当前类实例 (自己) V.S. 父类部分实例 (父类)
      • 存在前提: 任何对象都存在 V.S. 必须存在继承关系
      • 主要用途:解决成员与局部变量同名冲突 V.S. 调用父类构造器
  • static

    • 使用static声明的方法,不能访问非static的操作(属性或方法)
    • 非static声明的方法,可以访问static声明的属性或方法
    • 原因 :
      • 如果一个类中的属性和方法都是非static类型的,一定要有实例化对象才可以调用
      • Static声明的属性或方法可以通过类名访问,可以在没有实例化对象的情况下调用
    • 静态属性
      • 是类的字段,不属于任何一个对象实例
      • 静态属性被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化
      • 非静态属性是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响
    • 静态块
      • 可以置于类中的任何地方,类中可以有多个static块
      • 在类被加载的时候执行且仅会被执行一次,按照static块的顺序来执行每个 static块
      • 一般用来初始化静态属性和调用静态方法

==设计模式(第三周)==

  • 这部分十分重要必考

面向对象的设计原则

  • 单一职责原则
  • 开闭原则
  • 里氏代换原则
  • 依赖倒置原则

设计模式

各种设计模式,优点缺点、UML图绘制

单例模式

  • 私有构造方法
  • getInstance()静态方法创建唯一实例
  • 实现
    1. 懒汉式:synchronized

    2. 饿汉式:内部立即加载对象

  • 目的:只希望有一个对象,全局访问,但不使用全局变量
  • 优点:
    • 对唯一的实例受控访问
    • 在内存中只有一个实例,减少内存开销,避免频繁创建销毁对象,提升性能
    • 避免对共享资源的占用
    • 允许可变数量的实例
    • 可以全局访问
比较项 饿汉式(Eager Singleton) 懒汉式(Lazy Singleton)
实例创建时机 类加载时立即创建实例 第一次使用时才创建实例
是否支持延迟加载 不支持 支持
线程安全性 天然线程安全 需通过同步(如 synchronized、双重检查锁)保证线程安全
实现复杂度 实现简单,无额外同步逻辑 实现复杂度较高,根据写法可能存在线程安全隐患
性能表现 调用实例方法时性能稳定,无锁开销 首次创建实例可能有锁竞争开销
资源利用率 可能浪费资源(未使用也创建) 更高,只在需要时创建
适用场景 实例轻量、必定使用的对象,如工具类 创建成本高、占用资源多、使用频率低的对象
缺点风险 启动时加载慢;占资源 若同步不当会出现并发问题;代码复杂
总结

简单工厂模式

工厂模式

  • 工厂方法
    • 定义了一个创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
  • 工厂类(创建者类)
  • 产品类

抽象工厂模式

策略模式

迭代模式

数据访问对象(DAO)模式

MVC模式

  • Model 模型
  • Vew 视图
  • Controller 控制器

生产者消费者设计模式

观察者模式

模板模式

单元测试及代码质量保障(第三周)

各种测试的设计方法与分类

白盒测试

逻辑覆盖方法
  • 语句覆盖(最弱)
  • 判定覆盖
  • 条件覆盖
  • 判定条件覆盖
  • 条件组合覆盖
  • 路径覆盖(最强)

黑盒测试

  • 等价类划分
  • 边界值分析
  • 场景法

单元测试和JUint

集合、流与输入输出、Swing介绍(第四周)

集合与数组

集合类(Map、Set、List)

  • List接口
  • ArrayList
  • 没有实现Collection的是Map
  • LinkedList
  • Set集合
    • HahSet
  • HashMap<k,v>
    • put(k,v)
    • contains
    • get(k)
    • 泛型不支持基本类型

策略模式

优点
  • 提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活 (算法独立,可以任意扩展)。
  • 它把采取哪一种算法或采取哪一种行为的逻辑与算法本身分离,避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
  • 遵守大部分设计原则,高内聚、低偶合。
缺点
  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
  • 由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。

总结

迭代器模式

总结

流的定义与特点

  • 字节流
  • 字符流
  • 节点流
  • 处理流

输入输出流

Java流框架

操作文件

  • Path和Files类封装了在用户机器上处理文件系统所需的所有功能。

对象输入/输出流与序列化

数据访问对象模式

优缺点
  • 数据访问对象模式优点:
    • 隔离数据层:由于新增了DAO层,不会影响到服务或者实体对象与数据库交互,发生错误会在该层进行异常抛出。
  • 缺点:
    • 代码量增加:增加一层,代码量增加(不过该缺点实际中可忽略)

Swing相关

组件

容器

  • 容器是一种可以包含组件的特殊组件。Swing中有两大类容器。
  • 一类是重量级容器,或者称为顶层容器,它们不继承于Jcomponent, 包括JFrame,JApplet,Jdialog. 它们的最大特点是不能被别的容器包含,只能作为界面程序的最顶层容器来包含其它组件。
  • 第二类容器是轻量级容器 , 或者称为中间层容器 , 它们继承于 JComponent,包括JPanel,JScrollPane等。中间层容器用来将若干个相关联的组件放在一起。由于中间层容器继承于JComponent,因此它们本身也是组件,它们可以(也必须)包含在其它的容器中。

多线程与同步(第五周)

线程的特点

  • 用户线程
  • 守护线程
    • setDaemon(true)

创建线程

  • 两种方式
    • 建立 Thread 类的子类
    • 实现 Runnable 接口better
  • 调用 start 方法
    • 启动线程,将引发调用 run 方法;
    • start方法将立即返回;
    • 新线程将并发运行。
  • 注意:不能直接调用 run 方法
    • 直接调用 run 方法只会执行同一个线程中的任务, 而不会启动新线程。
  • 线程类Thread类提供
    • start(),run(),sleep(),join()
  • Object类:wait(),notify(),notifyAll()

中断、计时器

生产者消费者模式

泛型与反射、网络编程(第七周)

泛型

写法 正确含义
<?> 无界通配符:表示“任意类型”
<? extends T> 上界通配符:某类型 T 的子类
<? super T> 下界通配符:某类型 T 的父类

通配符

反射

用法 示例
通过 .class Class<?> c = String.class;
通过对象获取 Class<?> c = obj.getClass();
通过类名加载 Class<?> c = Class.forName("java.lang.String");
功能 常用 API
获取所有构造器(含私有) getDeclaredConstructors()
获取公共构造器 getConstructors()
获取指定构造器 getDeclaredConstructor(Class... parameterTypes)
允许访问私有构造器 setAccessible(true)
创建实例 newInstance(Object... initargs)
功能 常用 API
获取所有方法(含私有) getDeclaredMethods()
获取公共方法 getMethods()
获取指定方法 getDeclaredMethod(String name, Class... parameterTypes)
改变访问权限 setAccessible(true)
调用方法 invoke(Object obj, Object... args)
功能 常用 API
获取全部字段(含私有) getDeclaredFields()
获取公共字段 getFields()
获取指定字段 getDeclaredField(String name)
改变访问权限 setAccessible(true)
读取字段值 get(Object obj)
修改字段值 set(Object obj, Object value)
  • 获取 Class 对象
  • 获取 Constructor / Field / Method
  • 调用 setAccessible(true) 绕过权限
  • 使用 newInstance / get / set / invoke 执行

网络编程

观察者模式

  • 目标
  • 观察者

什么时候用

  • 一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两个方面封装在独立的对象中使它们可以各自独立地改变和复用
  • 一个对象的改变将导致一个或多个其他对象发生改变,且并不知道具体有多少对象将发生改变,也不知道这些对象是谁
  • 需要在系统中创建一个触发链

优缺点

  • 观察者模式
  • 优点
    • 可以实现表示层和数据逻辑层的分离
    • 在观察目标和观察者之间建立一个抽象的耦合
    • 支持广播通信,简化了一对多系统设计的难度
    • 符合开原则,增加闭新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便观察者模式
  • 缺点
    • 将所有的观察者都通知到会花费很多时间
    • 如果存在循环依赖时可能导致系统崩溃
    • 没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而只是知道观察目标发生了变化

常考知识点

单例模式

目的

  • 希望只有一个全局可控可访问实例,但又不使用全局变量,也不传递其引用。

优点

饿汉式实现及其优缺点

public class Singleton{
	private static Singleton segleton = new Singleton();
	private Singleton(){};
	public static Singleton getInstance(){
		return segleton;
	}
}

反射

  • OB.class
    obj.getDeclaredConstructors()
    constructor.setAccessible(true)
    (OB) constructor.newInstance();
    
    

策略模式

目的

  • 存在多种算法相似的情况下,避免使用多个if-else带来的复杂与难以维护

优缺点

  • 多个算法可以相互替换
  • 避免使用过多ifelse
  • 解耦拓展性良好
  • 策略类变多
  • 策略类暴露

具体实现

多态

  • 一个接口,不同效果

工厂模式

类图

优缺点

与简单工厂模式的区别

观察者模式

类图

优缺点

  • 表示应用层和数据逻辑层分离
  • 在观察目标与观察者之间建立一个抽象的耦合
  • 支持广播通信
  • 符合开闭原则
  • 通知较慢
  • 循环依赖会崩溃
  • 观察者只知道所观察的对象发生了变化,不知到是怎样发生变化的。

生产者消费者模式

优缺点

  • 并行
  • 解耦

四个问题

抽象类与接口的异同

MVC模式

定义

  • module 模型
  • view 视图
  • controller 控制器

Swing

其他小知识点

super与this

Runnable接口与Tread类

  • Runnable更常用,其优势在于:
  • 任务与运行机制解耦,降低开销;
  • 更容易实现多线程资源共享
  • 避免由于单继承局限所带来的影响

白盒测试、黑盒测试

  • 白盒
    • 语句覆盖最拉
    • 路径覆盖最全
  • 黑盒
    • 等价类划分
    • 边界值分析
    • 场景法

ArrayList与LinkedList

集合(Set,List,Map)

泛型通配符

面向对象的三大特性

模式的分类(创建、结构、行为)

流的继承根节点四个与分类

千里之行,始于足下