持之以恒
分类: Java
2008-02-08 15:55:18
1.JAVA的特点是:
简单性、面向对象、分布式、平台无关、可移植、多线程、动态性等。
①Java是平台无关的语言是指用Java写的应用程序不用修改就可在不同的软硬件平台上运行。平台无关有两种:源代码级和目标代码级。C和C++具有一定程度的源代码级平台无关,表明用C或C++写的应用程序不用修改只需重新编译就可以在不同平台上运行。Java主要靠Java虚拟机(JVM)在目标码级实现平台无关性。JVM是一种抽象机器,它附着在具体操作系统之上,本身具有一套虚机器指令,并有自己的栈、寄存器组等。但JVM通常是在软件上而不是在硬件上实现。
②Java支持客户机/服务器计算模式,因此,它支持这两种分布性(数据分布和操作分布)。对于前者,Java提供了一个叫作URL的对象,利用这个对象,你可以打开并访问 具有相同URL地址上的对象,访问方式与访问本地文件系统相同。对于后者,Java的applet小程序可以从服务器下载到客户端,即部分计算在客户端进行,提高系统执行效率。
③多线程: Java提供了一个类Thread,由它负责启动运行,终止线程,并可检查线程状态。Java的线程还包括一组同步原语。这些原语负责对线程实行并发控制。利用Java的多线程编程接口,开发人员可以方便得写出支持多线程的应用程序,提高程序执行效率
④Java可以写两种类型的程序:小程序(又叫Java Applet)和应用程序(Java Application)。小程序是嵌入在HTML文档中的Java程序;而Java应用程序是从命令行运行的程序。
1.Java区别大小写
2.文件名必须与Public class 后的类名相同(包括相同的大小写),并使用java作为扩展名。
3.类由类声明和类体组成,而类体又由成员变量和成员方法组成
4.类声明由四部分组成:类修饰符、类关键字class、声明父类、实现接口,其一般形式如下: [public][abstract|final] class 类名 [extends 父类名] [implements 接口列表]
A.类修饰符:
public:这个public关键字声明了类可以在其他类中使用。缺省时,该类只能被同一个包中的其他类使用
abstract:声明这个类为抽象类,即这个类不能被实例化。
final:声明该类不能被继承,即不能有子类。也就是说,不能用它通过扩展的办法来创建新类。
B.声明父类:
extends为声明该类的父类,这表明该类是其父类的子类。一个子类可以从它的父类继承变量和方法。extends只能实现单继承。
C.实现接口:
在类声明中使用关键字implements实现接口,当要实现有多个接口时,各接口名以逗号分隔,其形式为:implements 接口1,接口2,···,···
接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。一个类可以实现多个接口,以某种程度实现“多继承”。
JAVA使用JDBC连接数据库JDBC(Java DataBase Connectivity的缩写),意思是Java程序连接数据库的应用程序接口(API).JDBC由一群类和接口组成,通过调用这些类和接口所提供的成员方法,我们可以连接各种不同的数据库,进而使用标准的SQL命令对数据库进行查询、插入、删除、更新等操作。JDBC的基本结构由Java程序、JDBC管理器、驱动程序和数据库四部分组成.
Java应用程序根据JDBC方法实现对数据库的访问和操作。完成的主要任务有:请求与数据库建立连接;向数据库发送SQL请求;查询结果;处理错误;控制传输、提交及关闭连接等操作。
JDBC编程要点
(1)引用java.sql包:import java.sql.*;
(2)使用Class.forName( )方法加载相应数据库的JDBC驱动程序:
class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
(3)定义JDBC的URL对象String
conURL="jdbc:odbc:TestDB";其中TestDB是我们设置的数据源。
(4) 连接数据库.Connection
s=DriverManager.getConnection(conURL);
(5) 使用SQL语句对数据库进行操作。
(6) 解除Java与数据库的连接并关闭数据库.s.close( );
例子:
import java.sql.*; //引入java.sql包
public class c1{
public static void
main(String[ ] args) {
String JDriver =
"sun.jdbc.odbc.JdbcOdbcDriver";
//声明JDBC驱动程序对象
String
conURL="jdbc:odbc:TestDB"; //定义JDBC的URL对象
try {
Class.forName(JDriver); //加载JDBC-ODBC桥驱动程序
}
catch(java.lang.ClassNotFoundException e) {
System.out.println("ForName :" + e.getMessage( ));
}
try {
Connection
con=DriverManager.getConnection(conURL);
//连接数据库URL
Statement
s=con.createStatement( ); //建立Statement类对象
String query =
"create table student ( "
+ "id char(10),"
+ "name char(15),"
+ "score integer"
+ ")"; //创建一个含有三个字段的学生表student
s.executeUpdate(query); //执行SQL命令
s.close(
); //释放Statement所连接的数据库及JDBC资源
con.close(
); //关闭与数据库的连线
}
catch(SQLException e){ System.out.println("SQLException: "
+e.getMessage( )); }
}
}
在Java中,网络类都在 java.net 类库中
套接字是用于建立两个不同程序之间通过网络进行通信的信道。
建立套接字Socket的方法
D:在服务器端:ServerSocket类的accept( )方法使服务器处于阻塞状态,等待用户请求。
Socket主要方法:
2.实例:
客户机:
import java.io.*;
import java.net.*;
class C
{ public
static void main(String[] args)
{ try{ Socket socket=new
Socket("127.0.0.1",6565);
DataOutputStream
out=new DataOutputStream(socket.getOutputStream());
out.writeUTF("我是客户机");
DataInputStream in=new
DataInputStream(socket.getInputStream());
String s=in.readUTF();
System.out.println("客户机收到:"+s);
}catch(Exception
e){}
}
}
服务器:
import java.io.*;
import java.net.*;
class S
{ public
static void main(String[] args)
{try{ServerSocket
s_socket=new ServerSocket(6565);
Socket socket=s_socket.accept();
DataInputStream in=new
DataInputStream(socket.getInputStream());
String s=in.readUTF();
System.out.println("服务器收到:"+s);
DataOutputStream out=new
DataOutputStream(socket.getOutputStream());
out.writeUTF("我是服务器");
}catch(Exception e){}
}
}
将服务器写成多线程的,不同的线程为不同的客户服务.main()只负责循环等待.线程负责网络连接,接收客户输入的信息
A.public class mythread implements Runnable(通过Runnable接口)
B.Thread public class mythread extends Thread(.继承类)
C.上述两种方法中都可用类Thread产生线程的对象
Thread newthread;
D.创建并启动线程newthread=new Thread(this);newthread.start();
E. run方法是运行线程的主体,启动线程时,由java直接调用 public void run()
F.sleep方法的作用,暂停线程的执行,让其它线程得到机会,sleep要丢出异常,必须抓住异常
Try{sleep(100)}catch(InterruptedException
e){}
synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如:public synchronized
void accessVal(int newVal);synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得 该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变 量的方法均被声明为 synchronized)。
1. 实现线程有两种方法:
实现Ruannable接口
继承Thread类
2. 在小应用中通常在start中创建线程
3 .当新线程被启动时,java调用该线程的run方法,它是Thread的核心.
4. 线程由四个状态:新生,运行,暂停,死亡
5. 两个或多个线程竞争资源时,需要用同步的方法协调资源.
6. 多个线程执行时,要用到同步方法,即使用synchronized的关键字设定同步区
7. wait和notify起协调作用
8.守护线程是为其它线程提供服务的线程,是一个独立的线程,它的run()方法是一个无限循环.守护线程与其它线程的区别是,如果守护线程是唯一运行着的线程,程序会自动退出
import java.awt.Event;
JAVA中在类Event中,定义了所有的事件处理方法, 处理事件的核心是重写处理事件的方法
public void actionPerformed(ActionEvent evt)
设计处理事件的类时,就要实现这个接口。其一般形式如下:
class
ClassName implements
ActionListener
{ btn.addActionListener(this);
public abstract void
actionPerformed(ActionEvent e){ }
}
通过实现ActionListener接口,使得监视器能知道事件的发生。在Java 中,要求产生事件的组件向它的监视器注册,这样,事件源与监视器就建立了一个对应关系。建立对应关系的语句如下:对象名.addActionListener(ClassName);其中,对象是事件源,ClassName是监视器。
例如:btn.addActionListener(this);这条语句的意思是:按钮对象(事件源)btn向它的监视器(当前类)注册,也就是产生事件的事件源对象向监视器注册.
AWT明确区分语义事件和地层事件.语义事件是用于表达用户动作(如”点击按钮”)的事件;因此,ActionEvent是语义事件.底层事件是使这些成为可能的事件.它包括鼠标按下、一系列鼠标移动弹起事件.类似地,调整滚动条是个语义事件;而拖动鼠标则是个底层事件.
事件处理程序的编写
事件处理程序的编写步骤:
1.首先:定义一个实现了相应事件监听接口的类,如:
class
KeyHandler implements KeyListener{ }
2.其次:为组件注册监听器对象,如:btn.addKeyListener(new KeyHandler());
3.使用类本身实现监听接口,例如使用类本身监听KeyEvent事件:
public class KeyTest implements KeyListener{
public KeyTest(){
Button btn = new Button(“Rec”) //init
btn.addKeyListener(this);//add listener
}
//事件处理代码
}
4.定义专门的外部类实现监听接口
public class KeyTest{
public KeyTest(){
Button btn = new Button(“Rec”) ;//init
btn.addKeyListener(new KeyHandler()); //add listener
}
}
class KeyHandler implements KeyListener{//事件处理代码}
例如(.使用类本身实现监听接口):
import java.awt.*;
import
java.awt.event.*;
class MyWindow extends
Frame implements ActionListener
{ TextField
text1,text2,text3;
MyWindow()
{
setLayout(new FlowLayout());
add(text1);add(text2);add(text3);
text1.addActionListener(this);
text2.addActionListener(this);
setBounds(100,100,150,150);
setVisible(true);validate();
}
public void actionPerformed(ActionEvent e)
{ if(e.getSource()==text1)
{
String word=text1.getText();
if(word.equals("boy"))
{ text3.setText("男孩");
}
else if
(word.equals("girl"))
{ text3.setText("女孩");
}
else if (word.equals("sun"))
{ text3.setText("太阳");
}
else
{
text3.setText("没有该单词");
}
}
else if(e.getSource()==text2)
{
String word=text2.getText();
if(word.equals("男孩"))
{
text3.setText("boy");
}
else if (word.equals("女孩"))
{ text3.setText("girl");
}
else if (word.equals("太阳"))
{
text3.setText("sun");
}
else
{
text3.setText("没有该单词");
}
}
}}
public class Example7_3
{ public static void main(String args[])
{
MyWindow win=new MyWindow();
主要是消费电子和嵌入式设备领域
CLDC包含了一个基本的 J2ME 运行环境,其中包括虚拟机和核心的 java 类库。CLDC 的核心是虚拟机和核心类库。虚拟机运行在设备的操作系统之上,对下层的硬件提供必要的兼容和支持;核心类库提供操作系统所需的最小的软件需求。
J2ME体系结构――Configuration和Profiles
Configuration的分类是根据计算能力的不同来划分的,同类设备的计算能力相近。Configuration 是一个规范,定义了这类设备的共同Java平台,定义与设备无关的Java虚拟机和核心库,是平台相容性的基础。Profile的分类是根据设备功能划分
的,同类功能的设备其他各种硬件条件和需求也相近。Profile是一组API,在某一Configuration的基础上扩展了针对设备特定功能的 API,使得标准能够完全适应特殊的设备,彻底发挥设备的功能。
针对这两大类设备的平台规范就是Configuration。第一类设备的Configuration称为 CLDC(Connected, Limited Device Configuration),第二类称为CDC(Connected Device Configuration)。
J2ME 体系的一般结构是:由Configuration定义的Java虚拟机运行于设备的宿主操作系统之上,构成整个平台的基础。Configuration提
供了基本的语言特性,Profile提供针对设备的特殊功能API和扩展类库。应用程序的运行环境需要一个Configuration和至少一个 Profile,多个Profile可以共存,也可以叠加。
我们用两个具体设备的实现作为例子说 明。在一个运行Palm OS的PDA上,Configuration采用CLDC,虚拟机采用KVM(虚拟机和Configuration是紧密相连的,KVM只是CLDC定义 的一个参考实现(reference
implementation),并不是唯一的选择),然后采用PDA Profile的Profile。在另一个运行Symbian的智能手机上,则可以采用KVM,CLDC,MIDP。