编译和执行示例程序
Java的最大优点
Java虚拟机
Java平台
Java语言
Java库
三种执行环境
1.1 编译和执行示例程序
1.下载和安装Java软件开发工具包(Java Software Development Kit,SDK)
2.按照以下规则编写和编译Java程序
java类或模块的名字必须匹配它所在文件的名字,这里的匹配指完全匹配,包括字母的大小写;
避免使用开发环境;
3.将程序写入myframe.java的文件(文件名必须有一个.java的后缀)
4.打开一个命令行窗口,等待DOS提示符,或者在UNIX中使用SHELL,输入命令编译程序:
java myframe.java
5.成功编译后,将会建立一个称为myframe.class的文件;
6.使用命令执行java类文件:
java myframe
1.2 Java的最大优点
1.软件的可移植性;
2.J2EE、J2ME、J2SE的区别:
Sun公司定义3个不同版本的java平台,来实现让一个系统软件在所有的计算机上运行。
在所有的平台上,语言都是相同的,但是捆绑的库不同。
J2EE企业版(大型平台):
用于构建企业级的服务器应用,它包含标准版中的任何组件,并增加了附加库,以支持目录管理、交易管理以及企业消息处理等功能;
J2ME微型版(小型平台):
用于嵌入式的消费型产品中,如移动电话、掌上电脑、汽车导航系统或其他无线设备;
J2SE标准版(中型平台):
标准的JDK开发平台,其中包括编译程序和运行时系统。利用这个工具,可以编写、部署和运行java应用,用于桌面的applet以及低端的服务器;
1.3 java虚拟机
JVM:Java Virtual Machine Java虚拟机
JRM:Java Runtime Environment Java运行时环境
ABI:Application Binary Interface 应用二进制接口,是一个程序在运行时应用的环境,也是一种可执行文件的格式。
操作系统都有自己的进程地址控件,硬件系统也各不相同;
java在所有的计算机上都使用相同的ABI;
java运行时环境JRE,包括java虚拟机,是java ABI与各种硬件/操作系统ABI之间的桥梁。
1)java源代码编译后生成的目标代码时一种字节码(bytecode),与其他语言不同的是:java的字节码是一种中立结构的机器代码(不是任何现有系统上的二进制指令代码),通过JVM可以快速地解释并运行在任何特定的计算机上。
2)java程序的执行通过JVM实现;
3)一般情况下,JVM是在运行java程序时调用的;
4)JVM读取字节码程序,解释或翻译成实际的机器指令后再执行,实行了java的“一次编写,多处运行”的特点;
1.4 java平台
java平台的组成部分:
1)java编程语言;
2)java虚拟机(解释程序/编译程序)
3)伴随系统的软件库
4)运行时环境
javascript不是一种通用的应用程序语言,主要用于浏览器编程。
1.5 java语言
java是一种面向对象的编程语言,是一种强类型的语言,具有数据声明、操作数据的语句;
java称函数为方法;
java程序的执行从一个特定的main()方法开始;
1.6 java库
API:应用程序接口
java库分为两类:
1)捆绑到JDK中的核心库:每个JDK都必须支持;
2)可选的JDK附加标准库;
核心API及其功能
1)java运行时:标准的运行时库,其中包括I/O、联网、applet、基本的窗口系统、数据结构、国际化、数学运算等java库;
2)java基础类:Swing GUI库、java 2D图形和访问支持(可视化的GUI支持);
3)安 全:支持数字签名、X.509数字证书和消息摘要等(可以出口到世界各地)
4)java IDL: JAVA接口定义语言,可用于与CORBA中间件进行对话;
5)JDBC :java数据库通用性,支持数据库访问;
6)java Bean :软件组件库;
7)java RMI :java远程方法调用,用于与其他java进程(包括其他系统上的java进程)进行通信;
java包也称为类库,是API系列中的一个API;
JCP:JAVA Community Process 成立于1998年,是java平台发展的一种组织形式,也是一个开放的论坛;
1.7 三种执行环境
java程序有三种执行环境:
1)单独的程序:称为应用或应用程序;
2)在浏览器中运行的程序:称为applet,其仅仅是在浏览器内部运行的小应用程序;
3)在web服务器中运行的程序:称为Servlet。
浏览器中包含一个JVM,它将在客户端上执行applet。
Servlet是当用户浏览相应于某个Servlet的URL时调用的一种java程序,它的输入来自服务器,输出返回服务器,通常又转发给客户。
第二章 面向对象的编程
抽象
封装
基本类型与类类型的比较
对象概念的总结
创建新的对象:构造函数
每个实例与每个类中成员
final限定符
访问限定符
2.3 基本类型与类类型的比较
java有8个内置数据类型:
1)字节byte
2)短整数short
3)整数integer
4)长整数long
5)浮点数float
6)双精度浮点数double
7)字符char
8)布尔boolean
2.3.1 定义类型
定义一个基本类型:int
定义一个类类型:
2.3.2 声明变量
类类型的变量称为对象;
声明一个基本变量:int count,i;
声明一个对象变量:Fruit lemon,apple,f;
当声明一个类类型的变量时,实际上并没有创建对象;
2.3.3对象与对象引用
当声明一个基本类型变量时,除分配内存外,还可以立即开始为变量赋值;
当声明一个类类型的变量时,只是用null值对其进行初始化(不指向任何实体),而且在变量指向一个对象之前,不能为对象数据字段进行赋值;
2.3.4 基本类型上的运算/对象中的方法
j+5
对象上的运算采用方法调用,而不是运算符。
方法和对象中字段称为对象的成员,lemon.grame;
2.4 对象概念的总结
类:类是用户定的类型,描述了组合在一起的字段和方法,用以表示某个客观对象。更新字段的唯一手段是调用方法。类称为非基本类型。
对象:一个对象属于某一个类,对象保留其字段中的值,也可以拥有他的方法调用。在典型情况下,对于任何一个给定的类,可以存在许多对象。我们说一个对象是类的实例。通过引用变量既可以得到一个对象。在使用引用变量之前,必须分配(声明)一个对象。
基本类型:是java中8个基本数据类型之一,基本类型不包括其他任何类型,与非jiben或类类型相反。
基本变量:把一个变量声明为java中的8个基本数据类型之一,既可以得到一个基本变量,基本变量可以直接为数据分配内存。
2.5 创建新的对象:构造函数
构造函数是一种特殊的方法,只能用于创建和初始化一个新的对象。也就是,它是内存分配器和初始化程序。
构造函数为对象分配内存,并为其字段赋值;
构造函数的方法总是具有与类相同的名字。
许多类都至少有一个显式构造函数。
可以定义若干个不同的构造函数,然后通过它们的参数类型区别它们。
使用this()方法调用同一个类中不同的构造函数。
构造函数可以调用另一个调用函数。
当一个构造函数显式地调用另一个构造函数时,这个调用必须是发出调用的构造函数中的第一个语句;
程序员不能在对象已经创建之后再显式地调用构造函数。
java语言规范中规定:不能把构造函数作为类的成员。
java中几乎每一种元素都是对象,它们都是通过调用构造函数创建的。
如:Cheese cheddar = new Cheese(matured);
2.5.1 继承的基本知识
一个类基于另一个类的技术,称为继承;
子类对象总是可以赋值到父类对象,反之不然;
如:Fruit lime = new Citrus(); //Citrus 是子类
系统中的所有对象都是java.lang.Object的子类型。
2.5.2 怎样调用构造函数
当类中没有提供任何显式构造函数时,则会分配一个默认的无参数构造函数。默认的无参数构造函数不需要任何参数,也不执行任何动作,但它能够确保每个类总是至少拥有一个构造函数。
因此,当我们真正提供了任何构造函数时,一般不要使用默认的无参数构造函数。
当对象实例化时,其内部的工作过程为:
1)为对象分配内存
2)内存清零,使所有的数据字段均填以默认值0、0.0或null等。
3)调用构造函数,且可以显式地调用同一个类中的另一个构造函数
如:Fruit() {
this(55,10);
}
4)对象父类中的构造函数总是通过使用super(someArguments)被显式地或隐式地调用。这是一种递归调用,意味着父类中的构造函数又调用它自己的父类中的构造函数。如此类推,直到最终调用了Object类中的构造函数。因此,构造一个新的对象可以引起若干方法调用,代价很大。
5)任何带有显式初始化语句的数据字段都会执行初始的赋值;
6)执行对象构造函数中的其他语句。
2.5.3 无析构函数
析构函数方法用于回收对象;
java具有自动的存储管理功能,其中包括回收不再使用的对象。因此,程序员只需删除、覆盖或者用null撤销对象最后的引用,相应的对象就可以析构,其占用的内存就可以被其他对象重用。
2.5.4 方法
方法式面向对象编程对函数的称谓。方法总是需要在类中声明,而且不能存在于类的外部。
通过方法名调用方法;
在一个类中可以有若干个具有相同名字的方法,同名的方法可以认为重载了相同的名字;
具有相同名字的方法应当进行同样的操作。
语法格式为:optAccess returnType methodName(optArgumentList)optionalThrowsClause{
....statements....
}
2.5.5 总是利用“引用变量”得到一个对象
java中的所有对象总是且只通过内存引用访问的,这种方式称为间接寻址。绝对不应当直接涉及对象,而只能通过一个保留地址的变量访问对象。
2.5.6 null引用
意味着不引用任何对象;
1)声明一个对象变量并没有创建相应的对象;
2)利用“==”运算符比较两个对象变量,实际上只是比较变量中保留的指针,而不是对象的内容。因此,通常应定义一个用于比较的equal()方法
3)作为参数传递的对象引用的副本将压入堆栈中,原始对象中的字段因而可以被方法改变或更新,但不能让原始引用指向一个不同的对象。
4)易于声明一个类,其中类本身的实例又作为它的字段。
5)因为一个引用变量可以自动撤销引用,以得到对象中字段的内容,因此,很容易看出是对指针进行赋值和比较而不是对象。
2.5.7 动态的数据结构
如创建二叉树:
class Tree {
private Object data;
private Tree left;
private Tree right;
}
2.6 每个实例和每个类中的成员
static:只用一次,每个类中只有一个。
java中有4个静态成员的变体
1)数据:属于类而不是单个对象的一组数据
2)方法:属于类的方法
3)代码块:只执行一次的代码块
4)类 :嵌套在另一个类中的类
2.6.1 静态数据
静态变量也称为类变量
2.6.2 静态方法
当方法所做的处理只是与整个类有关,而并不特别针对一个实例时,应把这个方法声明为静态的。
如:java.lang.String类有若干个valueOf()方法,为静态的,因此无需使用字符串实例化就可以调用它们,
String s = String.valueOf(-12.0);
2.6.3 静态代码块
是有关键字static前缀的代码块。必须处于类的内部以及所有方法的外面。它属于类,多用于初始化。
静态代码块只可以访问静态数据。一个类中可存在多个静态代码块,将按照其出现在源代码中的位置依次执行。
2.6.4 静态类
2.7 final限定符
意味着无法再改变,用于限定某一个元素为常量。
final static int myTotal =1000;
final Fruit banana =new Fruit(200.21);
void someMethod(final MyClass c,final int a[]){
c.field=7;
a[0]=7;
c=new MyClass();//final means this line is NOT ALLOWED
a=new int[13];
2.7.1 空的final
当一个数值在声明中计算起来太复杂,或者可能会引起异常情况出现,或final值取决于传递给构造函数的参数时,都应使用空的final变量。
2.8 访问限定符
每个元素只能选用一个限定符。
1)private 私有方式:类中的成员不能被类外部的方法等访问。把构造函数定义为私有的,可以防止一个类被其他类实例化。把一个方法定义为私有的,则意味着该方法只能被同一类中的其他方法访问;
2)“无”:称为包访问,默认方式,意味着类中的成员只能由同一java包中的其他类访问。类可以指定包访问方式,或公有访问方式。
3)protect 保护方式:类中的成员允许同一java包或该类中的子类访问。
4)public 公有方式:在任何地方,只要能够访问该类都可以访问其成员。一个类可以定义为包访问方式,也可以定义为公有方式。
第三章 示例程序的解释
示例程序的解释
应用程序从何处开始执行
运行时的内部工作原理:堆栈和堆
Object类
阅读Java API文档
1)Jar 是JDK的一个工具软件,用于解压缩文件
2)ASCII American Standard Code for Information Interchange
3)javadoc:java工具,是JDK的一部分,是一种文本编程系统的实现。
第四章 标记符、关键字与类型
Java和Unicode
扫描
标记符
注释
关键字
基本类型
字符串连接
字符串比较和intern()方法
4.1 java 和Unicode
Unicode是ISO标准16位字符集,支持65536个不同的字符。
java内部使用2个字节表示每个字符,采用Unicode字符。
4.2 扫描
4.3 标记符
4.4 注释
1)使用“//”,行注释
2)使用“/* */”多行注释
3)使用“/** */”,表明这里的内容可以由自动文档生成器javadoc读取
javadoc注释必须放在方法的外部。
4.5 关键字
1、用于内置类型:
1)boolean
2)char
3)byte
4)short int long
5)float double strictfp
6)void
2、用于对象
1)new
2)this
3)super
3、用于语句
1)选择语句: if else
switch case break default
2)循环语句:for continue
do while
3)控制转移语句:return throw
4)异常处理语句:try catch finally assert
5)线程语句: synchornized
4、用于修饰声明(可视化、共享性)
1)static
2)abstract
3)final
4)private
5)protect
6)public
5、用于其他方法或相关类
1)class
2)interface
3)throws
4)native
5)transient
6)volatile
6、用于类的扩展和接口的继承
1)extends
2)interface
3)implements
4)package
5)import
7、留作将来使用
1)constant
2)goto
4.6 基本类
4.6.1 布尔类型
取值范围:true、false
直接量:是一种在编译时提供的值,只需在程序中编写需要的具体数值。
如:if (true) x=33;
不能够把布尔值转化成任何类型的值
4.6.2 整数int类型
是32位的有符号二进制补码
取值范围:-2 147 483 648~2 147 483 648
4.6.3长整数类型
long是64位的有符号二进制补码
取值范围:-9 223 372 036 854 775 808 ~9 223 372 036 854 775 808
4.6.4 字节类型
byte:8位有符号二进制补码形式的数值。
使用字节的理由是:存储通用的8位数值,为了匹配现有的数据文件中的值,为了节省存储空间。
取值范围:-128~127
若把一个范围较大的数据类型的数值(非直接量)付给一个范围较小的数据类型的变量,必须先进行强制转换。因为算术运算总是按至少32位的精度执行,这意味着在为字节变量赋值时,如果其中包含任何算术运算,必须总是对运算结果进行强制转换。
如:byte b1=1,b2=2;
byte b3=b1+b2; //错误
byte bs=(byte)(b2+b1) //正确
4.6.5 短整数类型
short:16位有符号二进制补码形式的整数,用来匹配已经存在于文件中的外部数值,以及节省存储空间。
取值范围:-32 768~32 767
4.6.6 双精度浮点类型
double:64位存储的浮点数
取值范围:-1.7E308~+1.7E308 ,约有14-15位有效数字
4.6.7 单精度浮点类型:
float:32位存储的浮点数
取值范围:-3.4E38~+3.4E38,有效数据约为6-7位。
4.6.8 字符类型
char:16位无符号数字,用于可打印的字符
1)单个字符:'A'
2)字符转义序列
'/n'(换行)
'/r'(回车)
'/f'(换页)
'/b'(退格)
'/t'(制表符)
'//'(反斜杠)
'/'(双引号)
'/''(单引号)
3)八进制转义序列:格式为'/nmm'
4)Unicode转义序列:格式为'/uxxx'
4.6.9 字符串类型
String
字符串直接量时在双引号中的0个或多个字符。
使用构造函数创建String类
String filmstar=new String(nihao);
String filestar=nihao;
这两个等价
4.7 字符串连接
使用+
4.8 字符串比较与intern() 方法
只可以使用if (s1.equals(s2))的方法
而s1==s2 比较的字符串的地址
使用intern()方法:返回的所有字符串都可以使用==比较字符串,而且节省空间。
第五章 名字、数组、运算符与精度
名字
表达式
数组
运算符
相关性
怎样计算精度
扩宽与窄化转换
溢出
Math包
5.1 名字
一般格式为:package1.package2.class1.class2
5.2 表达式
5.3 数组
java中数组是对象,java数组动态分配
数组下标从0开始
1)数组是对象
2)数组类型是引用类型
3)数组采用new运算符分配
4)数组总是分配到堆中,而不是堆栈中
5)所有数组的父类都是Object。
数组与对象不同于:
1)不能把数组作为除Object之外的一些类的子类
2)数组的语法与其他对象类的语法不同
3)不能为数组定义自己的方法
数组的长度即其中的元素数量,是数组类中的一个数据字段,如myArray.length,而不是myArray.length().
但是,java.lang.String是一个正规的类,它有length()的方法。
5.3.1 创建数组
1)不可以:int sprout[256];
而必须:int sprout[]=new int[256];
2)当指向对象时,必须:
Fruit carrot[]=new Fruit[256];
for (int i=0;i<carrot.length;i++)
{
carrot[i]=new Fruit();
}
5.3.2 初始化数组
byte b[]={1,2,3};
String wkdays[]={MON,TUE,,,};//初始化列表中允许后面有多余的逗号
wkdays={mon,tue};//是错误的,不能在声明之外初始化
wkdays=new String[] {mon,tue};//正确的
Fruit orchard[]= new Fruit[]{new Fruit,new Fruit(4.3),null};
java.lang.System类中的方法:arraycopy()用于复制部分或全部数组。
String midweek[]=new String[3];
System.arrayCopy(wkdays/*src*/,1/*offset*/,midweek/*dest*/,0/*offset*/,3/*len*/);
clone()方法创建新的数组,使用clone()方法时,克隆后的对象必须强制转换成正确的类型。
克隆整个数组
int p[]=new int[100];
int p2[]=(int[])p.clone();
5.3.3 数组的数组
Fruit plums[][];
5.4 运算符
instanceof 运算符用于超类,以确定它是否有一个特定的子类对象。
如:class vehicle {...
class car extends vehicle {..
class convertible extends car {..
vehicle v;
if (v instanceof convertible)
5.5 相关性
1)优先级
2)相关性
3)计算顺序
5.6怎样计算精度
5.7 扩宽与窄化转换
5.8 溢出
1)整数溢出
2)浮点溢出
5.9 Math包
