1.8k likes | 2.02k Views
Java 的发展历史. 1 Java 的起源 Java 是 Sun 公司1995年正式推出的新一代面向对象程序设计语言, 特别适合于 Internet 应用程序开发, 具有平台无关性。 Java 来自于1991年 Sun 公司的一个叫 Green 的项目, 其原先的目的是为家用消费电子产品开发一个分布式代码系统, 可以把 E-mail 发给电冰箱、 电视机等家用电器, 对它们进行控制。开始, 准备采用 C++, 但 C++ 太复杂, 安全性差, 最后基于 C++ 开发了一种新的语言 Oak(Java 的前身), Oak 是一种用于网络的精巧而安全的语言。
E N D
Java的发展历史 1 Java的起源 Java是Sun公司1995年正式推出的新一代面向对象程序设计语言, 特别适合于Internet应用程序开发, 具有平台无关性。 Java来自于1991年Sun公司的一个叫Green的项目, 其原先的目的是为家用消费电子产品开发一个分布式代码系统, 可以把E-mail发给电冰箱、 电视机等家用电器, 对它们进行控制。开始, 准备采用C++, 但C++太复杂, 安全性差, 最后基于C++开发了一种新的语言Oak(Java的前身), Oak是一种用于网络的精巧而安全的语言。 1994年下半年, Internet的快速发展, 促进了Java语言研制的进展, Green项目组成员用Java编制了HotJava 浏览器, 触发了Java进军Internet,使得它逐渐成为Internet上受欢迎的开发与编程语言,现已发展成为一种重要的Internet平台。
3 Java语言的特点 • 简单易学: 1)风格类似于C++, 基本语法与C语言类似; 2)摒弃了C++中容易引发程序错误的地方, 如指针和内存管理; 3)提供了丰富的类库。 • 面向对象:支持静态和动态风格的代码继承及重用,是完全 面向对象的, 它不支持类似C语言那样的面向过程 的程序设计技术。 • 解释执行:Java解释器(运行系统)能直接运行目标代码指令。 • 平台无关:Java源程序被编译成一种高层次的与机器无关的 byte-code格式语言, 被设计在Java虚拟机上运行。
性能优异:Java可以在运行时直接将目标代码翻译成机器指令, Sun用直接解释器一秒钟内可调用300,000个过程, 翻译目标代码的速度与C/C++的性能没什么区别。 • 分布式:Java包括一个支持HTTP和FTP等基于TCP/IP协议的子库。因此, Java应用程序可凭借URL打开并访问网络上的对象, 其访问方式与访问本地文件系统几乎完全相同。 • 可移植:Java应用程序可以在配备了Java解释器和运行环境的任何计算机 系统上运行, 通过定义独立于平台的基本数据类型及其运算, Java数据得以在任何硬件平台上保持一致。 • 多线程:Java提供的多线程功能使得在一个程序里可同时执行多个小任务。 多线程带来的好处是可以有更好的 交互性能和实时控制性能。
健壮:Java致力于检查程序在编译和运行时的错误。 类型检查帮助检查出许多开发早期出现的错误。 Java自已操纵内存减少了内存出错的可能性。 Java还实现了真数组, 避免了覆盖数据的可能。 • 安全:Java的安全性可从两个方面得到保证。一方面, 在Java语言里, 象指针和释放内存等C++功能被删除, 避免了非法内存操作。 另一方面, 当Java用来创建浏览器时, 语言功能和一些浏览器本身提供的功能结合起来, 使它更安全。 • 动态:Java的动态特性是其面向对象设计方法的拓展, 它允许程序动态地装入运行过程中所需要的类。
4 与Java语言相关的应用 • Java Application ( Java应用程序): 用Java语言编写的通过独立的Java解释器来解释运行的桌面应用程序(类似于其它高级语言编制的应用程序)。 • Java Applet (Java小程序): 用Java语言编写的、嵌入在HTML编写的Web页面中的非独立程序,由Web浏览器内部包含的Java解释器来解释运行,是动态、安全、跨平台的网络应用程序。
JSP (JavaServer Pages, Java 服务器页): 是一种实现普通静态HTML和动态HTML混合编码的技术,是在Sun公司倡导及多个公司参与下共同建立的一种动态网页标准,实现了Web动态内容与其显示的分离,用于构建动态Web网站,JSP文件运行于服务器端,JSP的脚本语言是Java,其平台无关性使得JSP一次编写,各处运行。 • 最新应用——Java为用户推出了游戏、天气预报、地图等一系列紧俏时髦的应用,它能够帮助汽车司机避免交通阻塞,还能让公司对即将出行的销售人员进行跟踪。目前在移动通讯中被广泛使用,如手机抓捕图象、手机游戏等。
5 与Java相关的几个常见名词 • Java EE—— Java Platform, Enterprise Edition (Java 企业版) Java EE首先是一种构架,它包罗了Java的多种先进的技术,最合适使用MVC的方法来构建系统,其表现层使用JSP,控制层可以使用Servlet或Session Bean,用于实现业务逻辑,Entity Bean则对业务实体进行抽象。此外它还使用JAAS实现安全机制,JNDI用于查询资源,JDBC和JTA访问数据库和管理事务;JMS实现企业的消息处理;JavaMail实现与企业外界的联系。今年10月份将发布的最新版本为Java EE 5.0。
Java SE——Java Platform, Standard Edition (Java 标准版),是Java最核心的技术。 • Java ME——Java Platform, Micro Edition (Java 袖珍版), 是一个重要的用于无线方面的 Java 平台,它从可移植的、以网络为中心的 Java 虚拟机转变而来。 • JVM——Java Virtual Machine (Java虚拟机),它通过采用一种被称之为Java虚拟机的虚拟微处理器的规范,用软件在计算机芯片内模拟出一个假芯片,然后开始运行程序,为Java程序提供统一的脱离软、硬件平台的运行环境。
JDK——Java Development Kit (Java开发工具包),由Sun公司免费发行的,JDK有多个版本,大体经历过1.02、1.1.x、1.2、1.3、1.4、1.5几个系列。 • JSDK——Java Server Development Kit (Java服务器开发工具包),是JDK 的一个典型的扩展工具包。 • JDBC——Java DataBase Connectivity(Java数据库连接),是一种用于执行SQL语句的Java API(应用程序接口),可以为多种关系数据库提供统一访问,是由一组用Java语言编写的类和接口组成。
Applet——Java Applet 是用 Java 语言编写的、包含在网页里的“小 应用程序”,通常被放在 Web 服务器上。当有人上网浏览时,Applet 随网页一起 下载到客户端的浏览器中,并借助浏览器中的 Java 虚拟机(JVM)运行工作。 • Servlet——Servlet是用Java编写的Server端程序,它与协议和平台无关。Servlet运行于Java-enabled Web Server中。Java Servlet可以动态地扩展Server的能力,并采用请求-响应模式提供Web服务。 Servlet与Jsp之间的交互为开发Web服务提供了优秀的解决方案。
Swing与 AWT(抽象窗口工具包)——是Java设计 GUI (图形用户界面)的基础 。 AWT设计有严重缺陷,不能满足发展的需要。 Swing是在AWT基础上发展起来的,为Java GUI编程提供了强大丰富的API和灵活的结构设计,提供了替代AWT重量组件的轻量组件,Swing 中大部分是轻量级组件。Swing 几乎无所不能,不但有各式各样先进的组件,而且更为美观易用。二者最好不要混用。
EJB(Enterprise JavaBeans)—Java EE核心组件,EJB并不是一个产品。它是Java服务器端服务框架的规范,软件厂商根据它来实现EJB服务器。 Enterprise Bean 与 JavaBean 不同。JavaBean 是使用 java.beans 包开发的,它是 Java SE的一部分。JavaBean 是一台机器上同一个地址空间中运行的组件,是进程内组件。Enterprise Bean 是使用 javax.ejb 包开发的,它是标准 JDK 的扩展,是 Java EE 的一部分。Enterprise Bean 是在多台机器上跨几个地址空间运行的组件,是进程间组件。JavaBean 通常用作 GUI 窗口小部件,而 Enterprise Bean 则用作分布式商业对象。
JavaScript、VBScript 、 JScript辨异 • JavaScript是由Netscape公司发明的一种Web脚本编制语言(基本语法和C语言非常类似) ,最初叫作 LiveScript,可嵌入在HTML文件中,用来处理以客户端环境为基础的动态信息,但不能访问服务器端资源, 只要浏览器支持JavaScript,用JavaScript编写的脚本就可以正确执行。尽管JavaScript采用与Java类似的语法,但二者并无直接的联系。 • VBScript是Microsoft公司开发的一种通用的Web脚本语言,其基本语法与Basic语言类似,但它只能被IE浏览器所支持。VBScript是ASP(Active Server Pages)默认的脚本语言,使用ASP可以创建和运行动态、交互的Web服务器应用程序。ASP需要Microsoft 的IIS(Internet信息服务器)的支持才可以运行。 • JScript 是Microsoft 公司推出的一种解释型的、基于对象的脚本语言, JScript 脚本只能在某个解释器上运行,该解释器可以是 Web 服务器,也可以是 Web 浏览器。 可以用JScript 来编写ASP页面。
1.1 Java的开发环境 • JDK的安装 产生如下目录结构 \bin的目录下包含义下主要文件: javac: Java编译器, 用来将java程序编译成 Bytecode java: Java编译器,执行已经转换成Bytecode的 java应用程序. appletviwer : Java解释器, 用来解释已经转换成 Bytecode的java小应用程序.
1.1 Java的开发环境 • \lib子目录 系统类库 • 设置路径 1. PATH c:\…\bin 2. CLASSPATH=. ; c:\...\lib\; c:\myclasses; 运行程序的时候必须找到相应的类,就要求设置环境变量,在我的电脑 属性 高级 环境变量 CLASSPATH 中设置 .为当前目录,加一分号可以设置其它的类目录.
public class app //公共类 main方法必为公共类,便于外部访问 { public static void main(String[] args) //static意味main是类方法 { //,非对象方法,可以直接访问,是静态的不用创建对象 System.out.println ("Hello from Java: "); }//使用java.lang包的系统类out字段(类的数据成员)的println方法 }//(类的成员函数)//可以作为单行注释/*和*/则可以跨越多行 C:\>java app Hello from Java 程序的编译 C:\> javac app.java 1.2 创建第一个应用程序
前面的程序没有导入包或者类是因为编译器自动导入了java.lang包,该类构成java的基本核心语句,如果使用其它类,则必须自己导入.前面的程序没有导入包或者类是因为编译器自动导入了java.lang包,该类构成java的基本核心语句,如果使用其它类,则必须自己导入. import java.util.Date;//导入Date类 使用*可以导入所有类 public class app //两种导入都是指示位置,不影响文件大小 { public static void main(String[] args) { System.out.println (“Today= “+new Date());//创建对象 } } C:\>java app Today=Mon Aug 02 12:15:13 EDT 2000 1.3包和类的导入
前面的程序没有导入包或者类是java自己带的包或者类,java知道在哪里找相关的包或者类.但自己的类怎么处理? 下面是一个名为printer.java的文件,内有一个printer类,该类有一个print方法. package abc; public class printer { public void print() { System.out.println(“hello from java!”); } } 怎么能够在另外一个应用程序中使用这个类? 下面是使用该类的对象方法print的一个应用程序. 导入自己的类1
import abc.printer;//导入printer类 public class app { public static void main(String[] args) { (new printer()).print();//这里用new操作符创建printer类的新对 } //象,并使用该对象的print方法 } 导入类如果在当前目录,则java可以自动搜索到,如果在别的位置如c:\classes的目录下则必须设置CLASSPATH环境变量,把该目录包含进去,如CLASSPATH=.;c:\classes; 导入自己的类2
创建applet 需要导入java.applet包中的 Applet类 由于paint方法是AWT的一部分,所以我们这里也导入java.awt包中的AWT类 import java.applet.Applet; import java.awt.*; public class applet extends Applet //类applet继承自Applet类 { public void paint(Graphics g) //Graphics类的 g 对象传递给paint { g.drawString ("hello from java !",60,100); //开始位置 } //用g对象的drawString方法实际绘制文本 } 1.4 创建Applet
<HTML> <HEAD> <TITLE>APPLET</TITLE> </HEAD> <BODY> <CENTER> <APPLET CODE=applet.class WIDTH=200 HEIGHT=200> </APPLET> </CENTER> </BODY> <HTML> 文件名字为applet.html 可以直接显示,也可以用appletviewer查看 C:\>appletviewer applet.html 1.5 运行Applet
/*将标记直接放入applet.java文件中,可以不用Web页面测试,创建/*将标记直接放入applet.java文件中,可以不用Web页面测试,创建 <APPLET // class文件后 可以用c:\>appletviewer applet.java观看 CODE=applet.class WIDTH=200 HEIGHT=200> </APPLET>*/ import java.applet.Applet; import java.awt.*; public class applet extends Applet { public void paint(Graphics g) { g.drawString ("hello from java !",60,100); } } 在代码中嵌入<APPLET>标记
import java.awt.*; import java.awt.event.*; class AppFrame extends Frame //类AppFrame继承自Frame类 { public void paint(Graphics g) //Graphics类的 g 对象传递给paint { g.drawString ("hello from java !",60,100); //开始位置 } //用g对象的drawString方法实际绘制文本 } public class app { public static void main(String[] args) { 1.6创建窗口化应用程序1
AppFrame f = new AppFrame(); f.setSize(200,200); f.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}}); f.show(); //0代表正常退出 }// addWindowListener方法的作用是应用程序窗口关闭时, //应用程序本身也关闭 } // Java app 就可以运行了 创建窗口化应用程序2
Java开发类库组成 • Java提供了丰富的标准类来帮助程序设计者更方便快捷地编写程序,这些标准类组成了类包,主要有: • java.lang java.awt • java.applet java.awt.image • java.awt.peer java.io • java.net java.util • 除了java.lang之外,其余类包都不是java语言所必须的。
Java开发类库组成 • (1)java.lang • 本类包中包含了各种定义java语言时必须的类,这些类能够以其他类不能使用的方式访问java的内部。任何java程序都将自动引入这个包。其中的类包括: • Object类:java中最原始、最重要的类,每个java类都是它的子类,它实现了每个类都必须具有的基本方法。 • 基本类型包装器:Boolean, Character, Number, Double, Float, Integer, Long。 • String类:字符串类。 • Math类:数学函数的集合。 • 执行线程:类Thread, ThreadGroup, 接口Runable。 • 异常和错误:类Exception, Error, 接口Throwable。
Java开发类库组成 • 运行环境:可以通过类Runtime和System访问外部系统环境。System类的两个常用功能就是访问标准输入/输出流和错误流、退出程序。 • 其他类:接口Cloneable、运行时的类等。 (2)java.applet Java Applet是Java编程的一个主要魅力,java.applet类包提供了Applet的运行机制以及一些编写Applet非常有用的方法。
Java开发类库组成 (3) java.awt 本类包是各种窗口环境的统一界面(AWT代表Abstract Windows Toolkit,即抽象窗口工具包),其中的类使得创建诸如窗口、菜单、滚动条、文本区、按钮以及复选框等图形用户界面(GUI)的元素变得非常容易。 (4) java.awt.image 类包能够以独立于设备的方式加载并过滤位图图象。 (5) java.awt.peer java.awt.peer是全部awt组件的对等对象接口的集合,每个接口都提供了机器相关基本的方法,awt使用这些方法来实现GUI,而不必关心是何种机器或操作系统。
Java开发类库组成 (6) java.io Java的输入/输出模式是完全建立在流的基础之上的。流是一种字节从一个地方到另一个地方的单向流动,可以把流附加于文件、管道和通信链路等。 java.io类包中定义的许多种流类通过继承的方式进行组织,其中也包括一些用来访问本地文件系统上的文件的流类。 (7) java.net java.net类包用来完成与网络相关的功能:URL、WWW连接以及更为通用的Socket网络通信。 (8) java.util java.util类包包含了一些实用类和有用的数据结构,如字典(Dictionary)、散列表(Hashtable)、堆栈(Stack)、向量(Vectro)以及枚举类(Enumeration)等。
面向对象编程 基本概念 面向对象编程就是将数据和方法封装于对象中,使每个对象半自治化,包装私有的(即纯粹内部的)数据和方法,使它们不会造成整体名称空间的混乱。然后,通过公共的(即可以从外部调用的)方法定义的良好接口,对象可以和程序的其余部分交互。 封装就是将一个需要投入很多关注的复杂系统转变为一个对象,对象在其内部处理所有工作并能够容易地概念化。 类(class)是一个模版,可以从它创建对象。可以认为类是对象的类型。 对象(object)是类的实例,这很象变量是数据类型的实例。可以把类看做对象的类型,而把对象看做类的实例。对象封装了方法和实例变量。
概念 数据成员(data member)是类中的变量,它们可以存储对象使用的数据。 对象支持实例变量(其值是此对象特有的)和类变量(其值是由这个类的对象共享的)。对象的数据成员称为实例数据成员或者实例变量。由一个类的所有对象共享的数据项目称为类数据成员或者类变量。 数据成员可以从对象外部访问,或者可以使它们位于对象的内部,以供对象之内的方法私有地使用。
方法(method)是类或者对象内置的函数。 可以有实例方法(instance method)和类方法(class method)。可以对对象使用实例方法,但是可以只通过引用类的名称来使用类方法——这里不需要对象。 通常将方法分类为:那些在类内部使用的,称为私有方法(private method);那些在类外部使用的,称为公共方法(public method);而那些由类和这个类派生出的类使用的,称为保护方法(protected method) 有两种类型的方法:类方法和实例方法。实例方法就是在对象上调用的方法。类方法直接在类上调用,不需要创建对象。 概念
概念 继承(inheritance)是从一个称为基类(base class)的类派生另一个称为派生类(derived class)的类的过程,而且可以在派生类中使用基础类的方法。(基类就是旧类,派生类是新类) 主要作用是在新类中附加你所希望添加的东西,以便使新类具有比基类更多的定制功能。 java不支持多重继承,替换方式是使用接口。
声明和创建对象 public class app { public static void main(String[] args) { String s1; //声明对象 s1=new String(“Hello from Java!”);//创建对象 String s2= new String(“Hello from Java!”);//声明并创建 char c1[]={‘H’,‘i’,‘ ’,‘t’,‘h’,‘e’,‘r’,‘e’}; String s3=new String(c1);//这里重载,参数类型和个数不同 double double1=1.23456789; String s4=String.valueOf(double1);//不用new转换成对象 String s5;//将s1中的对象引用复制到s5,实际上s1和s5指向 s5=s1; //同一个对象。改动s1中的实例数据,s5也会改变, System.out.println(s1); System.out.println(s2); System.out.println(s3); System.out.println(s4); System.out.println(s5); }}
输出结果 Hello from java! Hello from java! Hi there 1.23456789 Hello from java!
声明和定义类 class printer //声明类 { public void print() //类定义是类的实际实现 { System.out.println("Hello from Java!"); }} public class app { public static void main(String[] args) { // static可将变量转变为类变量,将方法转变为类方法便于 printer printer1=new printer();//直接使用,不用创建对象 printer1.print(); //使用上面的类的对象的print方法 }} 结果 Hello from Java! 这里在同一个文件中声明和定义了两个类,printer和app。在一个文件中只有一个类可以声明为公共的,这里是app。这里文件名必须和该公共类名字相同。
上例分成两个文件问题 class printer //printer.java { public void print() { System.out.println("Hello from Java!"); }} public class app { public static void main(String[] args) { printer printer1=new printer(); printer1.print(); }} 结果 Hello from Java!
创建实例变量 class Data //声明类 { public String data_string=“Hello from Java!”;//类中存储实例变量 } public class app { public static void main(String[] args) { Data data=new Data(); String string=data.data_string;//引用实例变量 System.out.println(string); } } 结果 Hello from Java!
访问说明符的说明 声明类成员为public时,在你程序的任何地方都可以访问它。 声明为private,它只在成员所在的类之内能够访问。 声明为protected,它对于当前类,在同一包内的其它类以及从这个类派生出的类是可用的。 如果没有使用访问说明符,类成员的默认访问是对于成员所在的类,从这个类派生出的在同一包中的类以及同一包中的其它类可见。 位置 private 未指定 protected public 同一类 x x x x 同一包中的子类 x x x 同一包中的非子类 x x x 另一个包中的子类 x x 另一个包中的非子类 x
设置变量访问 class Data //声明类 { private String data_string="Hello from Java!";//类中存储实例变量 } public class app { public static void main(String[] args) { Data data=new Data(); String string=data.data_string;//引用实例变量 System.out.println(string); } } 由于访问说明符的变化导致编译错误
class data { public static int intdata=0;//名为intdata的类数据变量 } public class app { public static void main(String[] args) { data a,b; a=new data(); b=new data(); a.intdata=1;// 设置为1,则结果b.intdata值为显示 System.out.println("The value of b.intdata = " +b.intdata); } } 结果 The value of b.intdata = 1 创建类变量
public class app { public static void main(String[] args) //String对象数组为参数 { System.out.println("Command line arguments..."); for(int loop_index=0;loop_index<args.length;loop_index++) {System.out.println("Argument "+loop_index+" = "+ args[loop_index]); } } } c:\>java app a b c d //传递给main的数组的四个元素 Command line arguments… Argument 0 = a Argument 1 = b Argument 2 = c Argument 3 = d 传递给main的命令行参数
class calculator { int addem(int op1,int op2) {return op1+op2;}//使用return语句 } public class app { public static void main(String[] args) {calculator calc=new calculator(); System.out.print("addem(2,2)="+calc.addem(2,2)); } } 结果 addem(2,2)=4 从方法返回值
class calculator { static int addem(int op1,int op2)//关键字static使方法成为类方法 {return op1+op2;} } public class app { public static void main(String[] args) { System.out.print("addem(2,2)="+ calculator.addem(2,2)); } // 直接调用类方法 } 上面并没有创建对象,当然创建对象可以使用对象方法。 创建类方法
为类创建构造器:在类中加上一个和这个类同名的方法,不需要任何访问说明符或者返回类型。 class data { private String data_string; data() //无参数构造器 {data_string ="Hello from Java!";} public String getData() {return data_string;} } public class app { public static void main(String[] args) {System.out.print((new data()).getData()); } } //结果 Hello from Java! 创建构造器