一 :Java 发展简史
1. Java 是一种语言,具有自己的语法和数据结构
2. Java 来自于 sun ,sun 指的是斯坦福大学网络
3. 具体发展历程
Java的具体发展历程 |
|
时间 |
描述 |
1991~1995 |
Sun 为了占领智能消费电子产品市场,由james gosling 负责该项目,来开发 Oak(橡树) 语言 |
1995 |
将 Oak 改名为 Java,当时也是window95版本的发布 |
1996 |
发布 JDK1.0 |
1997 |
发布 JDK1.1 |
1998 |
发布 JDK1.2, 将该版本命名为 J2SDK , 将 Java更名为 Java 2 |
1999 |
1999 将 java 分为三大块: J2SE (Java 标准版)、 J2EE(Java 企业版) 、J2ME(Java 微型版本<android>) |
2000 |
发布 J2SE1.3 |
2002 |
发布 J2SE1.4 |
2004 |
此时不再叫 J2SE1.5,叫 5.0 |
2005 |
2005 Java 10 周年,将 J2SE 改为 J AVA SE、将 J2EE 改为 J AVA EE、 将 J2ME 改为 J AVAME |
2006 |
发布 J AVA SE 6 |
2011 |
7 月 J AVASE 7 |
最新 |
JavaOne大会上透露Java8,java9计划 |
java 分为三个技术平台:JAVASE(是JAVAME,JAVAEE的基础),JAVAME,JAVAEE
二 :Java 语言特性
简单性
面向对象
可移植性(一次编译,到处运行)JVM
健壮性(自动垃圾回收机制,GC)
多线程
三 : java 的运行步骤
1:编写代码
首先把我们想要计算机做的事情,通过 Java 表达出来,写成 Java 文件,这个过程就是 编写代码的过程。如上图所示的 Hello.java 文件。
2:编译
写完 Java 代码后,机器并不认识我们写的 Java 代码,需要进行编译成为字节码,编译 后的文件叫做 class 文件。如上图所示的 Hello.class 文件。
3:类装载 ClassLoader
类装载的功能是为执行程序寻找和装载所需要的类。 ClassLoader能够加强代码的安全性,主要方式是:把本机上的类和网络资源类相分离, 在调入类的时候进行检查,因而可以限制任何“特洛伊木马”的应用。
4:字节码(byte-code)校验
功能是对 class 文件的代码进行校验,保证代码的安全性。 Java 软件代码在实际运行之前要经过几次测试。JVM 将代码输入一个字节码校验器以 测试代码段格式并进行规则检查--检查伪造指针、违反对象访问权限或试图改变对象类型 的非法代码。 注意----所有源于网络的类文件都要经过字节码校验器 字节码校验器对程序代码进行四遍校验,这 可以保证代码符合JVM 规范并且不破坏系统 的完整性。如果校验器在完成四遍校验后未返回出错信息,则下列各点可被保证: - 类符合JVM规范的类文件格式 - 无访问限制异常 - 代码未引起操作数栈上溢或下溢 - 所有操作代码的参数类型将总是正确的 - 无非法数据转换发生,如将整数转换为对象引用 - 对象域访问是合法的
5:解释(Interpreter)
可是机器也不能认识 class 文件,还需要被解释器进行解释,机器才能最终理解我们所 要表达的东西。
6:运行
四 :Java 技术三大特性
1:虚拟机
Java 虚拟机 JVM(Java Virtual Machine)在 Java 编程里面具有非常重要的地位,约 相当于前面学到的 Java 运行环境,虚拟机的基本功能如下:
(1):通过 ClassLoader 寻找和装载 class 文件
(2):解释字节码成为指令并执行,提供 class 文件的运行环境
(3):进行运行期间垃圾回收
(4):提供与硬件交互的平台 Java虚拟机是在真实机器中用软件模拟实现的一种想象机器。Java虚拟机代码被存储 在 .class文件中;每个文件都包含最多一个public类。Java 虚拟机规范为不同的硬件平台 提供了一种编译Java技术代码的规范,该规范使Java 软件独立于平台,因为编译是针对作 为虚拟机的“一般机器”而做。这个“一般机器”可用软件模拟并运行于各种现存的计算机 系统,也可用硬件来实现。编译器在获取Java应用程序的源代码后,将其生成字节码,它是 为JVM生成的一种机器码指令。每个Java解释器,不管它是Java技术开发工具,还是可运行 applets 的Web浏览器,都可执行JVM。
JVM 为下列各项做出了定义
- 指令集(相当于中央处理器[CPU] ) - 寄存器 - 类文件格式 - 栈 - 垃圾收集堆 - 存储区
JVM 的代码格式由紧缩有效的字节码构成。由 JVM 字节码编写的程序必须保持适当的类 型约束。大部分类型检查是在编译时完成。任何从属的 Java 技术解释器必须能够运行任何 含有类文件的程序,这些类文件应符合 Java 虚拟机规范中所指定的类文件格式。
2:垃圾回收
2.1:什么是垃圾 在程序运行的过程中,存在被分配了的内存块不再被需要的情况,那么这些内存块对程 序来讲就是垃圾。 产生了垃圾,自然就需要清理这些垃圾,更为重要的是需要把这些垃圾所占用的内存资源,回收回来,加以再利用,从而节省资源,提高系统性能。
2.2:垃圾回收 - 不再需要的已分配内存应取消分配(释放内存) - 在其它语言中,取消分配是程序员的责任 - Java 编程语言提供了一种系统级线程以跟踪内存分配 - 垃圾收集 - 可检查和释放不再需要的内存 - 可自动完成上述工作 - 可在 JVM 实现周期中,产生意想不到的变化
2.3:提示
(1):在 Java 里面,垃圾回收是一个自动的系统行为,程序员不能控制垃圾回收的功 能和行为。比如垃圾回收什么时候开始,什么时候结束,还有到底哪些资源需要回收等,都 是程序员不能控制的。 (2):有一些跟垃圾回收相关的方法,比如:System.gc() , 记住一点,调用这些方法, 仅仅是在通知垃圾回收程序,至于垃圾回收程序运不运行,什么时候运行,都是无法控制的。 (3):程序员可以通过设置对象为 null,来标示某个对象不再被需要了, 这只是表示这个对象可以被回收了,并不是马上被回收。
3:代码安全 Java 如何保证编写的代码是安全可靠的呢?
(1):第一关:编写的代码首先要被编译成为 class 文件,如果代码写得有问题,编译期间 就会发现,然后提示有编译错误,无法编译通过。
(2):第二关:通过编译关后,在类装载的时候,还会进行类装载检查,把本机上的类和网 络资源类相分离,在调入类的时候进行检查,因而可以限制任何“特洛伊木马”的应用。 (3):第三关:类装载后,在运行前,还会进行字节码校验,以判断你的程序是安全的。
(4):第四关:如 果 你 的程序在网络上运行,还有沙箱(Sand Box)的保护,什么是沙箱呢? 就是如果你的程序没有获得授权,只能在沙箱限定的范围内运行,是 不能够访问本地资源的, 从而保证安全性。
五 :关键字
Java 中关键字的基本含义
• abstract:表明类或类中的方法是抽象的;
• boolean:基本数据类型之一,布尔类型;
• break:提前跳出一个块;
• byte:基本数据类型之一,字节类型;
• case:在 switch 语句中,表明其中的一个分支;
• catch:用于处理例外情况,用来捕捉异常;
• char:基本数据类型之一,字符类型;
• class:类; • continue:回到一个块的开始处;
• default:用在 switch 语句中,表明一个默认的分支;
• do:用在"do while"循环结构中;
• double:基本数据类型之一,双精度浮点数类型;
• else:在条件语句中,表明当条件不成立时的分支;
• extends:用来表明一个类是另一个类的子类;
• final:用来表明一个类不能派生出子类,或类中的方法不能被覆盖,或声明一个变 量是常量;
• finally:用于处理异常情况,用来声明一个肯定会被执行到的块;
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
• float:基本数据类型之一,单精度浮点数类型;
• for:一种循环结构的引导词;
• if:条件语句的引导词;
• implements:表明一个类实现了给定的接口;
• import:表明要访问指定的类或包;
• instanceof:用来测试一个对象是否是一个指定类的实例;
• int:基本数据类型之一,整数类型;
• interface:接口;
• long:基本数据类型之一,长整数类型;
• native:用来声明一个方法是由与机器相关的语言(如 C/C++/FORTRAN 语言)实现的;
• new:用来申请新对象;
• package:包;
• private:一种访问方式:私有模式;
• protected:一种访问方式:保护模式;
• public:一种访问方式:公共模式;
• return:从方法中返回值;
• short:基本数据类型之一,短整数类型;
• static:表明域或方法是静态的,即该域或方法是属于类的;
• strictfp:用来声明 FP-strict(双精度或单精度浮点数)表达式,参见 IEEE 754 算 术规范;
• super:当前对象的父类对象的引用; • switch:分支结构的引导词;
• synchronized:表明一段代码的执行需要同步; • this:当前对象的引用;
• throw:抛出一个异常; • throws:声明方法中抛出的所有异常;
• transient:声明不用序列化的域;
• try:尝试一个可能抛出异常的程序块 • void:表明方法不返回值;
• volatile:表明两个或多个变量必须同步地发生变化;
• while:用在循环结构中; • assert:声明断言;
• enum:声明枚举类型;
1:所有关键字都是小写的
2:goto 和 const 不是 Java 编程语言中使用的关键字,但是是 Java 的保留字,也就是 说 Java 保留了它们,但是没有使用它们。true 和 false 不是关键字,而是 boolean 类型 直接量
3:表示类的关键字是 class
1:什么是标识符 在 Java 编程语言中,标识符是赋予变量、类或方法的名称。
2:标识符命名规则 命名规则如下:
(1):首字母只能以字母、下划线、$开头,其后可以跟字母‘下划线、$和数字 示例:$abc 、 _ab 、ab123 等都是有效的
(2):标识符区分大小写 (事实上整个 Java 编程里面都是区分大小写的) abc 和 Abc 是两个不同的标识符
(3):标识符不能是关键字 (4):标识符长度没有限制
3:标识符命名建议
(1):如果标识符由多个单词构成,那么从第二个单词开始,首字母大写 示例:isText 、 canRunTheCar 等
(2):标识符尽量命名的有意义,让人能够望文知意 (3):尽量少用带$符号的标识符,主要是习惯问题,大家都不是很习惯使用带$符号的 标识符;还有在某些特定的场合,$具有特殊的含义
(4):由于 Java 语言使用 Unicode 字符集,所以字母包括: v ‘A’-‘Z’和‘a’-‘z’; v Unicode 字符集中序号大于 0xC0 的所有符号; v Unicode 字符集支持多种看起来相同的字母; v 建议标识符中最好使用 ASCII 字母
(5):标识符不应该使用中文,虽然中文标识符也能够正常编译和运行,其原因如上一 点讲到的:是把中文当作 Unicode 字符集中的符号来对待了。
例如如下程序是可以正常编译和运行的,但是不建议这么做:
public class Test {
public static void main(String[] args) {
String Java私塾 = "中文标识符测试";
System.out.println("Java私塾=="+Java私塾);
}
}
运行结果:Java 私塾==中文标识符测试
六 :基本数据类型
Java 数据类型的分类 Java 里面的数据类型从大的方面分为两类,一是基本数据类型,一是引用类型。
1:Java 中的基本数据类型
Java 中的基本数据类型分为八个原始数据类型,原始类型可分为四种:
(1):整数型:byte、short、int、long
(2):浮点型:float、double
(3):字符型:char
(4) :逻辑型 :boolean
引用数据类型 :类 ,接口, 数组。
:引用类型是什么
一般引用类型(reference type)指向一个对象,不是原始值,指向对象的变量是引用 变量。 在 Java 里面除去基本数据类型的其它类型都是引用数据类型
java 里面的转义字符
转义字符是指,用一些普通字符的组合来代替一些特殊字符,由于其组合改变了原来字 符表示的含义,因此称为“转义”。
常见的转义字符:
\n 回车(\u000a)
\t 水平制表符(\u0009)
\b 空格(\u0008)
\r 换行(\u000d)
\f 换页(\u000c)
\' 单引号(\u0027)
\" 双引号(\u0022)
\\ 反斜杠(\u005c)
逻辑型:boolean
逻辑值有两种状态,即人们经常使用的“on”和“off” 或“true”和“false”或“yes” 和“no”,这样的值是用 boolean 类型来表示的。
boolean 有两个文字值,即 true 和 false。
以下是一个有关 boolean 类型变量的声明和初始化: boolean truth = true; //声明变量 truth
注意──在整数类型和 boolean 类型之间无转换计算。有些语言(特别值得强调的是 C 和 C++)允许将数字值转换成逻辑值(所谓“非零即真”),这在 Java 编程语言中是不 允许的;boolean 类型只允许使用 boolean 值(true 或 false)。
注意:Java 中不可以直接将整数类型和逻辑类型转换
声明和赋值
什么是声明
声明为 Java 程序实体引入标识符,能够使用这些名字访问到这些实体,
声明实体包括: 类名、属性名、方法名、变量名、参数名、接口名等等。其实简单点说就是定义某个东西并 对外宣称它。
什么是赋值
赋值就是为一个声明的变量或者常量赋予具体的值,也就是赋予值的意思。使用一个等 号”=”来表示。 示例: int a = 5; 这句话的意思就是,声明一个类型为 int 的变量 a,并将它赋值为 5。
字符串型 String
字符型只能表示一个字符,那么多个字符怎么表示呢? Java 中使用 String 这个类来表示多个字符,表示方式是用双引号把要表示的字符串引起 来,字符串里面的字符数量是任意多个。字符本身符合 Unicode 标准,且上述 char 类型的 反斜线符号(转义字符)适用于 String。与 C 和 C++不同,String 不能用 \0 作为结束。String 的文字应用双引号封闭,如下所示: “The quick brown fox jumped over the lazy dog.”
什么是常量
常量是值不可以改变的标识符。 对常量的定义规则:建议大家尽量全部大写,并用下划线将词分隔。
如:JAVASS_CLASS_NUMBER ,FILE_PATH 2
什么是变量
变量是值可以改变的标识符,用来引用一个存储单元,用标识符来表示,可以通过操作 变量来操作变量所对应的内存区域或值块的值。
变量是标识符 也就是说变量本质上是标识符,但是不是所有的标识符都是变量。
值可以改变 一定是值可以改变的这些标识符才被称为变量,注意是可以改变,不是一定要改变。
变量的定义规则 (1):遵从所有标识符的规则 (2):所有变量都可大小写混用,但首字符应小写 (3):尽量不要使用下划线和$符号
七 运算符:
1:算术运算
算术运算是指:+、-、*、/ 等基本运算 需要注意的是: %是求 mod 运算; 整数的除法要小心: 5/2 = 2 // 不是 2.5
2:比较运算
比较运算是指:>、<、>=、<=、==、!= 等类似运算 需要注意的是: 字符可以比较大小;(用它们的 ascii 码,化为整数) 小心浮点数的相等比较 instanceof 也是一个比较运算,用来判断一个对象是否属于某个类。
3:逻辑运算
运算符&& ( 定义为“与”)和||(定义为“或”)执行布尔逻辑表达式
&&当第一个子表达式是假 时,第二个子表达式被跳过,而且当第一个子表达式是假时,整个表达式将总是假,所以不 必考虑第二个子表达式的值。
如果使用||运算符,而且第一个表达式返回真, 则 第二个表达式不必求值,因为整个表达式已经被认为是真。
4:++、---运算
++运算相当于:运算的变量加 1,如:x++ 等同于 x=x+1;
--运算恰好相反,相当于运算的变量减 1
5:=赋值运算
x=5 相当于把 5 这个值赋给变量 x
6:用加号(+)进行串链接
运算符 + 能够进行 String 对象的链接并生成一个新的 String:
String salutation = "Dr. ";
String name = "Jack " + "Arthur";
String title = salutation + name;
最后一行的结果是: Dr. Jack Arthur 如果+运算符中有一个自变量为 String 对象,则其它自变量将被转换成 String。所有 对象都可被自动转换成 String,尽管这样做的结果可能是意义含糊的。不是串的对象是通 过使用 toString() 成员方法而转换成串的等价物的。
7:三目运算 ?:
三目运算符?:表达的是:判断问号前面的条件表达式是否为真,如果为真,返回冒号前 面的值,否则返回冒号后面的值。
八 :程序流程控制
if, else 语句的基本句法是:
if (布尔表达式){
语句或块;
} else {
语句或块;
}
for 循环的句法是:
for (初值表达式; boolean 测试表达式; 改变量表达式){
语句或语句块
}
do 循环的句法是:
do {
语句或块;
}while (布尔测试);
while 循环的句法是:
while (布尔表达式) {
语句或块
}
九 对象,包,类
类是对象的抽象,对象是类的实例;
对象是由属性和行为组成;
对象的每个属性被表示为类中的一个成员变量;
属性是对象所具有的特征,而行为是对象可以做的动作;
类是具有相同属性和行为的一组对象的集合;
类是java程序的基本构造单元,java程序中所有的语句都出现在一个类中。
Java 类的定义形式
一个完整的 Java 类通常由下面六个部分组成:
包定义语句
import 语句
类定义{
成员变量 构造方法 成员方法
}
其中:只有类定义和“{}”是不可或缺的,其余部分都可以根据需要来定义。
包是什么
在 Java 中,包是类、接口或其它包的集合,包主要用来将类组织起来成为组,从而对 类进行管理。
包对于下列工作非常有用:
(1) :包允许您将包含类代码的文件组织起来,易于查找和使用适当的类。
(2) :包不止是包含类和接口,还能够包含其它包。形成层次的包空间。
(3):它有助于避免命名冲突。当您使用很多类时,确保类和方法名称的唯一性是非常困难 的。包能够形成层次命名空间,缩小了名称冲突的范围,易于管理名称。
从逻辑上讲,包是一组相关类的集合;从物理上讲,同包即同目录。
JDK 中常用的包
java.lang----包含一些 Java 语言的核心类,包含构成 Java 语言设计基础的类。在此包中 定义的最重要的一个类是“Object”,代表类层次的根,Java 是一个单根系统,最终的根就 是“Object”,这个类会在后面讲到。
Java 中如何表达包——package 语句
Java 语言使用 package 语句来实现包的定义。package 语句必须作为 Java 源文件的第一 条语句,指明该文件中定义的类所在的包。若缺省该语句,则指定为无名包,其语法格式为:
package pkg1[.pkg2[.pkg3…]]; //“[]”表示可选
类定义
Java 程序的基本单位是类,你建立类之后,就可用它来建立许多你需要的对象。Java 把每一个可执行的成分都变成类。
类的定义形式如下:
<权限修饰符> [一般修饰符] class <类名> {
[<属性定义>]
[<构造方法定义>]
[<方法定义>]
}
:什么是构造方法
类有一个特殊的成员方法叫作构造方法,它的作用是创建对象并初始化成员变量。在创 建对象时,会自动调用类的构造方法。
:构造方法定义规则
Java 中的构造方法必须与该类具有相同的名字,并且没有方法的返回类型(包括没有 void)。另外,构造方法一般都应用 public 类型来说明,这样才能在程序任意的位置创建类 的实例--对象。
:如何使用一个 Java 类
前面学习了如何定义一个类,下面来学习如何使用一个类 1:new 关键字
假如定义了一个表示日期的类,有三个整数变量;日、月和年的意义即由这些整数变量 给出。如下所示:
class MyDate {
int day;
int month;
int year;
}
名称 MyDate 按照大小写的有关约定处理,而不是由语意要求来定。 那 么 怎 么来使用这个类呢:在你可以使用变量之前,实际内存必须被分配。这个工作是 通过使用关键字 new 来实现的。如下所示: 在一个方法体中,声明
MyDate today;
today = new MyDate();
这就创建了一个对象。
关键字 new 意味着内存的分配和初始化,new 调用的方法就是类的构造方法。
this.的引用
每个对象可以使用this关键字引用它本身,this.表示对当前对象的引用。