📄 day11.txt
字号:
CoreJava(day11) 2007-12-17 -- 李艳
复习:
AWT,Swing是写用户图形界面的,但实际开发中90%都是用JSP写的。但Swing可以帮助我们理解OOAD的概念
我们在这个地方讲了两个模式:模式就是A情况下使用B。
1、观察者模式
当A发生变化,需要B处理时,可以考虑是否使用。
Observer-----B(处理者)
Observable---A
2、适配器模式
概念:
类:描述现实事物(抽象描述)
对象:类的个体
实例:new过的对象(实例化)
属性:描述这个类的(有用)特征
方法:行为(大多会操作属性)
构造:目标是构造对象
面向对象的三大特性:
封装:private 属性,set时限定,构造时要调用方法,内部类中也要调用set方法。好处是保证了属性的有效、安全。
封装的体现:集合
继承:类extends类(是的关系)单继承,
类implements接口(是的关系)多继承。
接口extends 接口(是的关系)多继承。
好处:
1、代码复用
2、可维护性、可扩展
3、支持多态
多态:
1、数字多态
2、方法多态(重写、重载)
重写:首先要有继承关系,父类方法不满足子类时需要重写,
条件:相同的方法名,参数表,返回类型,访问权限不能更小,异常不能抛更大,final的不能重写,静态的方法只能用静态去重写。对抽象方法重写--我们也叫实现
重载:同一类中(方法重载可以包括继承的方法),方法名同名,不同参数表,返回类型无关但最好相同。重载方便调用。
3、参数多态(重要使用)
4、类多态(接口)
好处:
1、参数传递更加灵活、方便
2、多种设计模式依赖多态
3、面向接口编程依赖多态
4、多态是由具体到抽象的一个手段
多态的体现:集合、接口
this:代表本类。
用法:
this.; 本类方法、属性(重名时)
thsi(); 本类构造器第一行。调用本类其它构造器
super:代表父类,(包括父类的父类)
用法:
super();用在本类构造器第一行,表示调用父类构造器
先父后子,先this后super,先语句块后构造器,静态语句块 > 普通语句块
static:静态,类共享
final:不可改变,不能继承,例System,Math.
final的属性不能二次赋值
abstract:用于声明抽象类、抽象方法,可放在接口中。
接口中的属性都是public static final
接口中的方法都是public abstract
父类方法-->子类重写:调用重写后的方法。
在没有super时,有相同方法时只会调子类的方法,加super时相当于没有多态了。
类库:Object:clone,equals,hashCode,toString,finalize
String:字符串,不可改变
indexOf,subString,split,matches,replaceAll
StringBuffer:
StringBuilder:
封装类:转换用.TYPE(简单类型的类对象)
集合:对象集(可扩容),保存下多个对象。
数组:包含简单类型
Set:add,remove,Iterator(或for--each),
List:add,remove,get(或for--each,或Iterator)
反射:
Class-->类对象
Field-->属性
Method--->方法
Constructor-->构造
作用:动态的生成对象,动态的执行方法
大数值:java.Math.BigDecimal
参数必须用String类型,商业开发需要精确计算时必须使用这个
新课:
线程:
进程的概念:
进程是指在同一个操作系统(OS)中执行的子程序。
多进程:同一个操作系统中执行的多个并行的子程序。
线程:同一进程中执行的子程序流。
多线程:同一个进程中执行的多个并行的子程序流。
多进程的好处:提高CPU的使用率。
多线程的好处:提高CPU的使用率。
时间片方式(主流):全称叫CPU时间片,指的是CPU的一段执行时间,时间片分配给进程/线程,时间很短但能做很多事情。
有时间片的会抢占CPU,进程与进程抢,线程与线程抢。时间片用完了会再分。不管如何抢占,CPU的使用率也不会调到100%
并发是针对的时间段。严格来说在一个时间点是无并发的。人所感受到的都是时间段
线程与进程:
多进程是独立的堆空间,独立的栈空间。进程与进程是互不影响的
多线程是栈空间独立,堆空间共享。线程与线程是可以影响的。
线程是由进程内部的一些顺序执行的代码组成的。
没有进程不会有线程。一个进程可以有多个线程,有一个主线程,其它线程做为附加线程。
JAVA中如何调用进程:(课堂代码:TestWinPro.java , TestLinPro.java)
进程与操作系统相关,不能跨平台。JAVA中不推荐调进程。
与进程相关的两个类:都在java.lang包中
Runtime类(运行环境): exec()调用本地程序。
Process:进程类,是exec()的返回类型。
Runtime.getRuntime();返回与当前 Java 应用程序相关的运行时对象。
线程模型:
虚拟CPU(CPU时间片):Thead
代码和数据由Runnable提供,run()运行代码,数据是子类属性
写线程的方法:(课堂代码:TestThread.java,TestRunnable.java)
1、继承Thread 类:
1、extends Thead
2、重写run()方法
3、new 本类.start();
好处:编写简单,可读性好
2、实现Runnable接口
1、implements Runnable
2、重写run()方法
3、new 本类,new Thread(本类对象)
4、Thread对象.start();
好处:保留了类继承,代码和逻辑分离,便于实现多线程。
run()和start()是不一样的:
run()叫线程体方法,自身其实就是普通方法,run()不会启动线程
start()叫线程启动的方法,向线程调度来说明当前线程ready(准备好了)。而不是正在执行的状态。
优先级:1--10,1最小,10最大,在某些操作系统中优先级会失效的。
小优先级代表时间片小。
守护线程依赖于其它线程
join使自身加入主线程
线程中几个重要的方法: (课堂代码:TestDaemon.java,TestSleep.java,TestJoin.java)
Thread.currentThread()取当前线程(实现接口方式有时用这个)
sleep():暂停线程,本线程不会抢,除非sleep运行完,这个是静态方法。自己让出CPU,其它的来抢。
yield():暂停线程,给本类或>=本类优先级的。只给优先级高的让,一般优先级低的抢不到
join():让本线程加入主线程。在线程内部、程序依然是顺序执行的,乱序体现在不同线程。
tj.start();
tj.join();要按这个顺序执行,若把join放在前面是无意义的。
setDaemon(true)后台/守护线程
线程状态图:
▲ 初始状态 ▲阻塞状态 ▲终止状态
\ / ┍ 1等待输入 ┓
\ /sleep时间到 \ 2sleep /
\start / \ 3join /stop
\ / \ /
┙ ┕ \ /
▲ 可运行状态 _ _ _ OS选中 _ _ _\ ▲运行状态
(只缺CPU) \ CPU到期或调用yield
┍ / \
\ / \wait
\ Synchronized/ \
\ / \
\ / \
\ / \
\ ┕ ┙
▲ 锁池状态 <------ ▲等待队列
notify/notifyall
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -