好文档 - 专业文书写作范文服务资料分享网站

Java学习笔记(必看经典)

天下 分享 时间: 加入收藏 我要投稿 点赞

注意:接口因对不同的事件监听器对其处理可能不同,所以只能建立监听的功能,而无法实现处理。

下面程序建立监听功能:

//监听器接口要定义监听器所具备的功能,定义方法 {

void WhatIdoWhenGirlHappy(EmotionEvent e); void WhatIdoWhenGirlSad(EmotionEvent e); }

注意查看参考书:事件的设置模式,如何实现授权模型。

事件模式的实现步骤:

开发事件对象(事件发送者)——接口——接口实现类——设置监听对象 一定要理解透彻Gril.java程序。

重点:学会处理对一个事件源有多个事件的监听器(在发送消息时监听器收到消息的排名不分先后)。 事件监听的响应顺序是不分先后的,不是谁先注册谁就先响应。 事件监听由两个部分组成(接口和接口的实现类)。

事件源 事件对象 事件监听

gril EmotinEvent EmotionListener(接口)、Boy(接口的实现类) 鼠标事件:MouseEvent,接口:MouseListener。 P235 ActionEvent。

注意在写程序的时候:import java.awt.*;以及import java.awt.event.*注意两者的不同。

在生成一个窗体的时候,点击窗体的右上角关闭按钮激发窗体事件的方法:窗体Frame为事件源,WindowsListener接口调用Windowsclosing()。

为了配合后面的实现,我们必须将WindowsListener所有的方法都实现,除了Windowsclosing方法,其余的方法均为空实现。

(练习:写一个带button窗体,点关闭按钮退出。)

上面程序中实现了许多不必要的实现类,虽然是空实现。

为了避免上面那些无用的实现,可以利用WindowEvent的一个WindowEvent类,还是利用windowsListener。还有WindowAdapter类,它已经实现了WindowsListener。它给出的全部都是空实现,那就可以只写想要实现的类,去覆盖其中的类,就不用写空实现。 注意:监听过多,会抛tooManyListener例外。

12.06

Module 10

Canvas组件:画布,可以实现动画操作。 TextArea:文本域。

在单行文本域中回车会激发ActionEvent。 用CheckBoxGroup实现单选框功能。

Java中,单选框和复选框都是使用CheckBox实现。 菜单:new MenuBar(),MenuBar表示菜单条。

菜单中的每一项为MenuItem,一般级联菜单不应该超过三级。 练习:

设计一个计算器:注意设置一个boolean值(append)来判断输入数字是位于第一个数的后面还是属于输入的第二个数。

设置一个变量来存放“+”,点完运算符后,将append设置为false。 String number1

达内java学习笔记

21

Char operator 存放运算符。

Module 11 Swing

AWT是Java最早出现的图形界面,但很快就被Swing所取代。 Swing才是一种真正的图形开发。

AWT在不同平台所出现的界面可能有所不同:因为每个OS都有自己的UI组件库,java调用不同系统的UI。

注意AWT为重量级组件,相当消耗资源,且不同系统的组件可能不同。因为这个问题使得AWT开发的软件难以作到跨平台。 更为要命的是:不同OS的组件库都存在BUG。必须多种平台进行测试,并且AWT的组件库并不丰富。 为解决以上问题,SUN和IBM以及NETSCAPE联合开发出JAVA基础类包Swing:注意JAVA的基础类以Swing为核心。

注意引用:javax.swing.*;javax表示JAVA的扩展。

我们在学习JDBC的时候会过度到J2EE。

在Swing的组件中,基本上都是在AWT组件的名称前面加“J”。 一般情况下,除了Choise等组件:

import javax.swing.*;好要加上:import java.awt.*以及import java.awt.event.*。

Swing与AWT的最大区别是Swing为JAVA自身的组件。已经不是对等实体,与底层的OS无关。 (JBUILDER就是使用Swing写的)

Swing与AWT在事件模型处理上是一致的。 Jframe实际上是一堆窗体的叠加。 Swing比AWT更加复杂且灵活。

在JDK1.4中,给JFRAME添加Button不可用jf.add(b)。而是使用jf.getContentPane().add(b)。 content是先申请面板。不过在JDK1.5中可以使用add.。 Jpanel支持双缓冲技术。 在Jbutton中可以添加图标。

JscrollPane可以管理比屏幕还要大的组件。

TextArea只有装入JscrollPane中才能实现滚动条。 JeditorPane用于显示浏览器。

注意:Tabbed Panel与Border的比较。 进度条:ProgressBar。

JcomboBox:下拉菜单:在AWT中同类组件是choice。 JlistPanel:选择列表 BorderPanel:设置边框

JsplitPanel:可将容器分为两个部分,其中一个部分有Jtree。 TextBox:也是一种新的容器,可以设置组件的间距。 TextFileChoose:文件选择器。 ColorChoose:颜色选择器 Module 12 Applet Applet为Panel的子类

Applet是java的自动执行方式(这是它的优势,主要用于HTML)。 工作四种语法:init(),start(),stop(),destory()。 Swing中有一个Japplet,如使用Swing组件。 Applet消亡的原因:

①java为安全起见对Applet有所限制:Applet不允许访问本地文件信息、敏感信息,不能执行本地指令(比如FORMAT),不能访问初原服务器之外的其他服务器。

达内java学习笔记

22

② IE不支持新版本的Applet。 Applet的优势:

网络传输,自动下载。

Application的优势:没有执行限制。

WebStart:可在网络传输,并且在本地无限制。因此前景光明。

练习:

使用Swing实现一个界面,分为上下两个部分,南边为JtextField组件,可编辑,上面为JtextArea组件,不可编辑,在JtextField组件输入字符,按回车,就可以将内容输入到JtextArea组件。(AREA区域可以滚动)

12.07

多线程

进程:任务

任务并发执行是一个宏观概念,微观上是串行的。

进程的调度是有OS负责的(有的系统为独占式,有的系统为共享式,根据重要性,进程有优先级)。

由OS将时间分为若干个时间片。 JAVA在语言级支持多线程。 分配时间的仍然是OS。 参看P377

线程由两种实现方式: 第一种方式:

class MyThread extends Thread{ public void run(){

需要进行执行的代码,如循环。

} }

public class TestThread{ main(){

Thread t1=new Mythread(); T1.start();

} }

只有等到所有的线程全部结束之后,进程才退出。

第二种方式:

Class MyThread implements Runnable{

Public void run(){

Runnable target=new MyThread(); Thread t3=new Thread(target); Thread.start();//启动线程 }

}

P384:通过接口实现继承

达内java学习笔记

23

练习:写两个线程:

① 输入200个“###”②输入200个“***”

下面为线程中的7中非常重要的状态:(有的书上也只有认为前五种状态:而将“锁池”和“等待队列”都看成是“阻塞”状态的特殊情况:这种认识也是正确的,但是将“锁池”和“等待队列”单独分离出来有利于对程序的理解)

阻塞

DEAD ① ⑴ 初始 ② ⑵ ③ ⑶ run()结束 Start() OS分配CPU 运行 可运行

CPU时间片结束 yield() o.wait() 等待锁标记

锁池 等待队列

notify() 注意:图中标记依次为

①输入完毕;②wake up③t1退出

⑴如等待输入(输入设备进行处理,而CUP不处理),则放入阻塞,直到输入完毕。 ⑵线程休眠sleep()

⑶t1.join()指停止main(),然后在某段时间内将t1加入运行队列,直到t1退出,main()才结束。 特别注意:①②③与⑴⑵⑶是一一对应的。

进程的休眠:Thread sleep(1000);//括号中以毫秒为单位

当main()运行完毕,即使在结束时时间片还没有用完,CPU也放弃此时间片,继续运行其他程序。 Try{Thread.sleep(1000);}

Catch(Exception e){e.printStackTrace(e);}

T1.join()表示运行线程放弃执行权,进入阻塞状态。 当t1结束时,main()可以重新进入运行状态。 T1.join实际上是把并发的线程编程并行运行。

线程的优先级:1-10,越大优先级越高,优先级越高被OS选中的可能性就越大。(不建议使用,因为不同操作系统的优先级并不相同,使得程序不具备跨平台性,这种优先级只是粗略地划分)。 注:程序的跨平台性:除了能够运行,还必须保证运行的结果。

一个使用yield()就马上交出执行权,回到可运行状态,等待OS的再次调用。

下午:

程序员需要关注的线程同步和互斥的问题。

多线程的并发一般不是程序员决定,而是由容器决定。 多线程出现故障的原因:

两个线程同时访问一个数据资源(临界资源),形成数据发生不一致和不完整。 数据的不一致往往是因为一个线程中的两个关联的操作只完成了一步。

避免以上的问题可采用对数据进行加锁的方法

达内java学习笔记

24

每个对象除了属性和方法,都有一个monitor(互斥锁标记),用来将这个对象交给一个线程,只有拿到monitor的线程才能够访问这个对象。

Synchronized:这个修饰词可以用来修饰方法和代码块

Object obj;

Obj.setValue(123);

Synchronized用来修饰方法,表示当某个线程调用这个方法之后,其他的事件不能再调用这个方法。只有拿到obj标记的线程才能够执行代码块。 注意:Synchronized一定使用在一个方法中。

锁标记是对象的概念,加锁是对对象加锁,目的是在线程之间进行协调。

当用Synchronized修饰某个方法的时候,表示该方法都对当前对象加锁。 给方法加Synchronized和用Synchronized修饰对象的效果是一致的。

一个线程可以拿到多个锁标记,一个对象最多只能将monitor给一个线程。

Synchronized是以牺牲程序运行的效率为代价的,因此应该尽量控制互斥代码块的范围。

方法的Synchronized特性本身不会被继承,只能覆盖。

线程因为未拿到锁标记而发生的阻塞不同于前面五个基本状态中的阻塞,称为锁池。 每个对象都有自己的一个锁池的空间,用于放置等待运行的线程。 这些线程中哪个线程拿到锁标记由系统决定。

锁标记如果过多,就会出现线程等待其他线程释放锁标记,而又都不释放自己的锁标记供其他线程运行的状况。就是死锁。

死锁的问题通过线程间的通信的方式进行解决。 线程间通信机制实际上也就是协调机制。

线程间通信使用的空间称之为对象的等待队列,则个队列也是属于对象的空间的。

Object类中又一个wait(),在运行状态中,线程调用wait(),此时表示着线程将释放自己所有的锁标记,同时进入这个对象的等待队列。

等待队列的状态也是阻塞状态,只不过线程释放自己的锁标记。 Notify()

如果一个线程调用对象的notify(),就是通知对象等待队列的一个线程出列。进入锁池。如果使用notifyall()则通知等待队列中所有的线程出列。

注意:只能对加锁的资源进行wait()和notify()。

释放锁标记只有在Synchronized代码结束或者调用wait()。 注意锁标记是自己不会自动释放,必须有通知。

注意在程序中判定一个条件是否成立时要注意使用WHILE要比使用IF要严密。 WHILE会放置程序饶过判断条件而造成越界。 补充知识: suspend()是将一个运行时状态进入阻塞状态(注意不释放锁标记)。恢复状态的时候用resume()。Stop()指释放全部。

这几个方法上都有Deprecated标志,说明这个方法不推荐使用。

一般来说,主方法main()结束的时候线程结束,可是也可能出现需要中断线程的情况。对于多线程一般每个线程都是一个循环,如果中断线程我们必须想办法使其退出。

达内java学习笔记

25

Java学习笔记(必看经典)

注意:接口因对不同的事件监听器对其处理可能不同,所以只能建立监听的功能,而无法实现处理。下面程序建立监听功能://监听器接口要定义监听器所具备的功能,定义方法{voidWhatIdoWhenGirlHappy(EmotionEvente);voidWhatIdoWhenGirlSad(EmotionEvente
推荐度:
点击下载文档文档为doc格式
16ar19qpyw5s23r4ajhb
领取福利

微信扫码领取福利

微信扫码分享