Java学习

我们的目标:理解构建模块和构建软件系统的设计原则

文章目录


前言

软件设计方案的目标

逻辑或功能正确:遵守规范的实现
健壮性:能够处理异常事件
灵活性:能够适应规范中的变更
可重用性:能够在另一个应用程序中重用
效率:满足速度和存储要求
可伸缩性:能够作为应用程序大版本的基础
安全:应用程序安全性的考虑级别


一.Object-oriented programming(Java视角的面向对象) − 2-8

2-4 Introduce to Java

在这里插入图片描述

1)语言与库 − 微内核,通过库扩展

2)第一个Java程序

− 代码结构:Main函数的返回值、参数、静态成员方法
class HelloWorld {
public static void main(String[] args) { S
ystem.out.println(“Hello world!”);
} }
− 开发:JRE vs JDK,环境配置,命令行编译、运行、调试
JDK是Java的开发工具,它不仅提供了Java程序运行所需的JRE,还提供了一系列的编译,运行等工具,如javac,java,javaw等。
JRE只是Java程序的运行环境,它最核心的内容就是JVM(Java虚拟机)及核心类库

JDK工具:
javac: the Java compiler编译器
java: the Java interpreter解释器
jar: Java Archive utility 文件格式以流行的 ZIP 文件格式
javadoc: create documentation from code从代码创建文档
jdb: Java debugger (command line)调试器

− 部署:Jar的打包、运行
文件格式以流行的 ZIP 文件格式

3)The type system

− 基础数据类型、对象引用类型
在这里插入图片描述

− 自动封装与解封(autoboxing, unboxing)
模糊但不消除区别
There be dragons!(小心)

− Enum types
编译时类型安全
多种enum类型可以共享名称
可以添加或重新排序,而不破坏现有的用途
提供了高质量的对象方法
快速集合(EnumSet, EnumMap)
可以遍历枚举中的所有常量

4)Quick ‘n’ dirty I/O (输入输出流)

− Output(System.out)
在这里插入图片描述
− Scanner
在这里插入图片描述
JVM:Java Virtual Machine (java虚拟机)
CLR:Common Language Runtime(通用语言运行库)

功能:
安全让事情慢下来
-所有数组访问都需要边界检查
-许多I/O操作需要安全检查
在这里插入图片描述
总结:
一些简单的I/O技术将帮助您入门
Java非常适合大型程序;小的可能看起来有点冗长
两部分类型系统-原语和对象引用:单实现继承、多接口继承
一些简单的I/O技术将帮助您入门


5.Object-oriented-programming-in-java

1) 面向对象基础

− In Java, everything is an Object对象(基础数据类型除外)
在这里插入图片描述
答案:5

− 接口:定义而不实现
API的多种实现可以共存
多个类可以实现相同的API
他们的表现和行为可能不同
在Java中,API是由接口或类指定的
接口仅提供API
类提供API和实现
一个类可以实现多个接口

− 抽象类
使用了关键词abstract声明的类,属于一种不完整的方法,只含有一个声明,没有方法主体

2)信息隐藏

区分一个设计良好的模块和一个设计糟糕的模块的最重要的一个因素是它对其他模块隐藏内部数据和其他实现细节的程度

好处:
(解耦和) Decouplesthe classes that组成一个系统
加速系统开发
减轻维护负担
支持有效的性能调优
增加软件重用

− 自愿信息隐藏
通过接口隐藏信息
使用接口类型声明变量
客户端只能使用接口方法
不能从客户端代码访问的字段

− 强制信息隐藏
Private
package-private
Protected
public

− Package 使用方法,如何实现的动态链接
表示组成一个库的相关类的集合,这些类保存在同一个目录中
包名需要与存储源文件和类文件的目录名匹配

− Final
当关键字final出现在类声明的开头时,它意味着“没有人可以扩展这个类”
单个方法可以被设置为final,以防止被覆盖
final Object fun(){return fun;}; //wrong
final String fun(String s){return s+ " in Base";}//ok

−嵌套类的层次结构
在这里插入图片描述


6.Collection(集合类)

集合类层次结构
在这里插入图片描述
Array (数组)重点!
数组只有在java.lang.Object中定义的方法调用

myArray.length // yes 
myArray.length() // error

Creating an array:int carrot []= new int[100];
在这里插入图片描述
在这里插入图片描述
答案:453423423
在这里插入图片描述

答案:453453423

Arrays of Arrays
在这里插入图片描述


7.Memory and exception

1)Exceptions

− garbage collection 垃圾回收
•狭义与广义内存泄漏

成本和收益
•从程序员那里拿走了内存管理的任务
•可能需要更长时间运行
•垃圾收集器可能需要一些资源来运行自己

垃圾收集算法
•引用计数
•标记和清扫
•停止与复制

− Finalizers(终结器) 与析构函数不同
当没有对对象的进一步引用时,它的存储可以被垃圾收集器回收。

Throw throws try catch finally
在这里插入图片描述

TWR:声明了一个或多个资源的try语句块
在这里插入图片描述

2)反射(reflect) Class:可以使用反射来生成与操作对象

类型信息:Class
动态创建:NewInstance, setNameMethod.invoke


8.Testing and Object Methods in Java

1)指定用户行为– 契约

− 类的创建者和使用者
− JavaDOC(文档代码化工具)

2)正确性测试– Junit and friends

− 语义正确性
编译器确保类型是正确的(类型检查)
静态分析工具(如FindBugs)识别许多常见问题(bug模式)

− 形式化验证与悖论
用数学方法证明格式说明的正确性
正式证明一个实现的所有可能的执行都符合规范
手动工作;部分自动化;不会自动可决定的

− 人工测试与自动化测试
•执行特定输入的程序,检查输出的期望值
•建立测试基础设施
•定期执行测试

− Junit(单元测试)
•针对小单元的单元测试:方法、类、子系统
-系统中最小的可测试部分
-装配前对部件进行测试
-旨在捕获本地bug
•通常由开发人员编写
•许多小型、快速运行的独立测试
•很少依赖于其他系统部件或环境
•不足,但是个好的起点

•流行的Java单元测试框架
•使用方便
可用工具支持
•可作为设计机制

3)Overriding Object methods(遵循契约)

− Equals, hashCode,toString
− 如Equals:传递、自反、一致、对称等性质


二.Code-level design(代码级设计) − 9-10

9.Behavioral subtyping, design for reuse(行为子类型,设计复用)

1)行为子类型

子类可以通过继承父类获得父类的方法和字段
特点:
1.1子类型可以增加方法,但是不可删。
1.2子类型需要实现抽象方法。
1.3子类型不能具有更强的前置条件。
1.4子类型不能具有更弱的后置条件。
1.5参数类型逆变。
Java不支持这一条件,因为Java具有重载的技术,如果支持逆变,重载技术会很复杂。
1.6返回值、异常协变。
1.7不变量保持。

− 里氏替换:子类型必须在任何可以使用父类型的地方被替换

如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都替换成o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型。

− 约束:只能增强不能降低

正方形是不是长方形
在这里插入图片描述

2)面向复用的设计:

− 委托:经常通过组合结构,复用实现。
委托只是一个对象依赖于另一个对象的功能子集
明智的委托允许代码重用

− 委托与继承:复用接口
•优先 组合/委托
继承的好处:
– 继承违反了信息隐藏
– 委托支持信息隐藏


9.Invariants, immutability, and testing (约束、 不可变性、测试)

1)类约束与防御性复制

− Firstly, 安全的语言和健壮的程序(语言和系统层面)
− Secondly, 防御性拷贝(设计与开发阶段)
− Period例子:
• 成员变量实例
• 返回值
• 多线程
• 对象clone

2)不变性

− 构建一个不可变类的方法
• 不提供任何变量
• 确保没有方法可以被覆盖overridden
• 使所有字段为final
• 将所有字段设置为私有
• 确保任何可变组件的安全性(可变组件,如成员变量)

− 优点与缺点
简单
固有线程安全
可以自由分享
不需要防御性副本
优秀的构建块
缺:为每个不同的值单独的实例,浪费了内存

3)测试驱动开发

要求在编写某个功能的代码之前先编写测试代码,然后只编写使测试通过的功能代码,通过测试来推动整个开发的进行。这有助于编写简洁可用和高质量的代码,并加速开发过程。

Java中的编译强制规则:
子类型只能添加方法,不能移除方法
具体类必须实现所有未定义的方法
覆盖方法必须返回相同的类型或子类型
覆盖方法必须接受相同的参数类型
覆盖方法可能不会抛出额外的异常

子类型必须有:
相同或更强的不变量
所有方法的后置条件相同或更强
所有方法的先决条件相同或较弱


10 design patterns(设计模式)

1)设计模式(概念,组成) 构建型、结构型、行为型

– Strategy pattern(策略模式) 行为型
•问题:客户需要算法的不同变体
•解决方案:为算法创建一个接口,为算法的每个变体创建一个实现类
在这里插入图片描述
– Command pattern(命令模式)行为型
•问题:客户需要执行一些(可能是灵活的)操作,而不知道操作的细节
•解决方案:为操作创建一个接口,使用一个(或多个)类来实际执行操作
在这里插入图片描述

2)用于重用的设计模式

– Template method pattern(模板方法模式)
•问题:一个算法包括可定制的部件和不变的部分(部分可变)
•解决方案:在抽象类中实现算法的不变部分,使用抽象(未实现的)基元操作表示算法的可定制部分。
子类自定义基元操作

– Iterator pattern(迭代器模式) 结构型
•问题:客户端需要独立于容器类型的统一策略来访问容器中的所有元素
•解决方案:迭代的策略模式

– Decorator pattern (装饰模式)结构型
•问题:您需要对单个对象进行任意或动态组合的扩展。
•解决方案:实现一个公共接口作为您正在扩展的对象,添加功能,但将主要责任委托给底层对象。
在这里插入图片描述

3)设计目标和设计原则

• Low coupling(低耦合)
提高可理解性
降低更改成本
减轻重用
• Low representational gap(高表现力)
有助于理解设计和实现
促进从问题到解决方案的追溯
促进进化
• High cohesion(高内聚)
促进可理解性
促进重用
简化了维护

− 开闭原则(OCP)
软件实体(类、模块、函数)应该是可扩展的,但是不可修改的。
− 单一职责原则(SRP)
就一个类而言,应该仅有一个引起它变化的原因。软件设计真 正要做的许多内容,就是发现职责并把那些职责相互分离。
− 替换原则(LSP)
子类应当可以替换父类并出现在父类能够出现的任何地方。
− 接口隔离原则
客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上
− 迪米特法则(最少知道原则)
降低类之间的耦合,每个类尽量减少对其他类的依赖
− 合成复用方式
尽量使用对象组合、集合而不是继承关系达到软件复用的目的


三.Library and Framework(库与框架) − 11、12、14、15-16

11GUI

• 四种基本功能
−创建用户界面,给予行为,分组和安排,窗口管理器设施

• JAVA GUI编程
− 1. 声明控件
− 2. 实现事件处理程序
− 3. 将控件添加到容器中

• Java 事件模型
事件源:产生事件的地方(单击鼠标,按按钮,选择项目等产生动作的对象).事件–既其所产生的动作状态.
事件源产生一个事件,并把这个事件发送到一个或多个监听程序,监听程序只是等待这个事件并处理它,然后返回.既程序把事件的处理"委托"给一段"代码"
监听程序必须注册一个事件源,才能接收这个事件,这个过程是自动的.监听程序必须实现接收和处理这个事件的方法.

• 容器(布局)
布局管理器实现布局策略
控制、容器、组件

•自动位置控制。
•强制完成布局。
•其边缘周围的任何线条或插图(边框)的粗细。
•为ContainerEvents添加一个ContainerListener。
•添加、删除和检索任何控件的列表。
•大小(当前、首选、最小和最大)。
•要求键盘聚焦。
•一个paint()例程,将其渲染到屏幕上

细节
− 菜单
JMenuBar menuBar = new JMenuBar();
JMenu file = new JMenu(“文件(F)”);

− AWT vs Swing(JFC)
AWT:
优点:速度、Applet可移植性、外观和感觉更紧密地反应
Swing:
优点:可移植性、行为,特性更广泛、供应商支持
缺点:Applet可移植性不包括swing、性能慢,也更有bug

− Applet
•Applet是Panel的子类。
•JApplet是Applet的Swing子类。
JSP容器:tomcat?


12 JDBC、XML

• JDBC的框架

• JDBC程序的一般过程

第1步:注册驱动 (只做一次)
第2步:建立连接(Connection)
第3步:创建执行SQL的语句(Statement)
第4步:执行语句
第5步:处理执行结果(ResultSet)
第6步:释放资源

• 对象
− Connection Statement 部分资源对象接口

• 参数化查询
− 应用场景
− 使用方法

• 存储过程
• 结构和术语
− XML:元素(element)、文本(text)、属性(attribute)
− DTD:文件类型描述
− XML Schema
− JAXP: Java API for XML Processing
− SAX:simple API for XML
− XSLT:可扩展样式表语言转换

• Dom4j Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT
− Create,add,save

• Xpath XML路径语言 它是一种用来确定XML文档中某部分位置的语言
− 表达式
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集


14-1 类级重用

• 支持重用的语言机制

继承
子类型多态性(动态调度)
参数多态性(泛型)

•支持重用的设计原则

小接口
信息隐藏
低耦合
高内聚

•支持重用的设计模式

模板方法,装饰,策略,复合,适配器,…

14-2 大规模重用:库和框架

• Terminology (术语) and examples

Libarary:一组提供可重用功能的类和方法
Framework:可定制为应用程序的可重用框架代码
API:应用程序接口,库或框架的接口
Clinet:使用API的代码
plungin(插件, Extension point,protocol, callback(回调):定制框架的客户机代码
• 示例

• Whitebox(白盒) and blackbox(黑盒) frameworks

Whitebox:
子类化和重写方法
子类有main(),但把控制权给了框架
需要了解超类的实现
一次只接一个分机
编制在一起
常见模式:模板方法
“开发框架”

Blackbox:
组成;实现插件接口
插件加载机制加载插件并控制框架
只需要了解界面
同时多个插件
更多的模块化;可以单独部署(.jar, .dll,…)
常见模式:策略,观察者
“终端用户框架”

• Designing a framework(设计框架) 框架设计注意事项

• 原则:最大复用,最小可用(Maximizing reuse minimizes use)
– Domain engineering
– Key decision: 将公共部分与可变部分分开
– 编写插件不需要修改框架
– Use vs. Reuse
•大型富组件非常有用,但很少适合特定需求
•小的或极其通用的组件通常适合特定的需求,但提供的好处很少

• Implementation details(实现细节)
• 运行框架、加载插件的一般过程

•一些框架可以自己运行 例如,Eclipse
•其他框架必须被扩展才能运行 例如:Swing, JUnit, MapReduce, servlet


正则表达式

• 匹配

三种匹配操作:

  • find()寻找下一个匹配模式的序列。
  • matches()根据模式匹配所有的输入序列。
  • lookingAt()匹配部分或所有的输入序列,从开始到模式。

− 单字符匹配
在这里插入图片描述
− 特殊(预定义)字符
\d:数字 \s:空格 \w:abc

− 量词
greedy量词 搜索第一个匹配之前读完(或者说吃掉)整个输入字符串
reluctant量词 从输入字符串的开头开始,然后逐步地一次读取一个字符搜索匹配
possessive量词 总是读完整个输入字符串,尝试一次(而且只有一次)匹配

• Java 基本操作

Java Web 开发框架

• Static vs. Dynamic
普通旧静态页面
静态网页
•文件系统中存储的普通文件
• Webserver接受路径名
•返回对应文件的内容

动态内容
•CGI:简单的“修复”
•将请求转发给外部程序

− CGI • Servlets
CGI(Common Gateway Interface 公共网关接口)是HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上
Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面

− Get, post
GET方法 • 用来从服务器读取信息,比如从服务器读取文件、 表格、数据库查询结果等
POST方法 • 用来向服务器传送信息,比如把信用卡号、表格、 存储于数据库的数据等传送到服务器

• Java Server Pages (JSP)
普通的html标记符 + JSP标签 + 变量和方法的声明 + java程序片 + java表达式
− HTML 是用来描述网页的一种语言,它不是一种编程语言,而是一种标记语言
− 语法
− Servlet+JSP (MVC)

• Filter 过滤器
Filter能够在一个请求到达Servlet之前预处理用户请求,也可以在离开Servlet时处理 HTTP响应
在执行Servlet之间,首先执行Filter程序,并为之做一些预处理工作

• Listener
监听器
通过Listener 可以监听Web服务器中某一个执行动作,并根据其要求做出相应的响应


四. Concurrency(并发) − 13

13 concurrency(并发)

• 线程概念

− 进程与线程
进程与线程的重要区别在于线程不能够单独执行,它必须运行在处于活动状态的应用程序进程中,因此可以定义线程是程序内部的具有并发性的顺序代码流

− 创建新线程的两种方法
继承Thread类 :class MyThread extends Thread
实现Runnable接口 :class MyThread implements Runnable

− 线程的常用方法
**start()😗*在主线程(main方法)中调用的,调用 start()方法时JVM自动调用run()方法,执行run()方法中内容。
**run()😗*继承Thread类或实现implement接口重写的方法,此方法必须要实现,方法中是线程要执行的代码。
**sleep()😗*让该线程处于停止状态,等睡眠的时间一到该线程就处于就绪状态,可以重新被调用。
**yield()😗*线程处于暂停状态,让优先级高的线程运行,如果没有比该线程优先级高的线程则继续运行。
**join()😗*在一个线程中插入另一个线程,如在A线程中插入B线程时,我们可以在A线程中调用B.join(),等B线程运行完之后A线程继续运行。

• 四种类型的线程编程
− 不相关的线程
− 相关但无需同步的线程
− 互斥线程
− 相关通信且互斥线程

• 线程同步原理与方法
原理:
当一个线程访问临界区时,判断是否有其他线程进入临界区,如果没有它才可以进入临界区,如果已经有线程进入临界区它会被同步挂起,直到进入的线程离开

方法:synchronized关键字、Lock

• Thread Local Storage(线程本地存储)
能将数据和执行的特定的线程联系起来


总结

关于考试
• 看程序写结果: 25左右
• 简答题 :45左右
• 程序设计:30左右
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值