《疯狂java讲义》
一、Java语言概述
高级语言运行机制
高级语言按程序的执行方式可分为编译型和解释型两种:
-编译型:使用专门的编译器,针对特定平台将高级语言源代码一次性“翻越”成为可被该平台硬件执行的机器码。特点:可脱离开发环境、运行效率高、通常无法移植。如:C/C++
-解释型:使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行。每次执行解释型语言的程序都需要进行一次编译。特点:不能脱离解释器独立运行、运行效率较低、跨平台很容易,只需提供特定平台的解释器即可。如:Python
-伪编译型:如:VB,属于半编译型语言,被编译成P-代码,将解释引擎封装在可执行程序内。编译生成的exe文件可脱离开发环境、在特定平台上运行,但实际上其中包含了链接解释程序的代码
Java程序的运行机制:需要编译(javac),但不生成特定平台的机器码,而是生成与平台无关的字节码(.class文件)。其必须使用Java解释器来解释执行。可以认为Java语言既是编译型又是解释型。(先编译后解释)
JVM(Java Virtual Machine)负责解释字节码文件,是可运行Java字节码的虚拟计算机。所有平台上的JVM向编译器提供相同的编程接口,编译器只需要面向虚拟机。JVM是java实现跨平台的关键部分
开发Java的准备
-JDK:Java SE Development Kit,即Java标准版开发包
-JRE:Java Runtime Environment,即Java运行时环境
-JRE与JVM的关系:JRE包含JVM,JVM 是运行Java程序的核心虚拟机,而运行Java程序还需要其他的类加载器、字节码校验器、大量的基础类库。JRE除了包含JVM以外,还包含了其他环境支持
-Sun公司把Java分成了3个部分:Java SE(标准版)、Java EE (企业版)和Java ME(微版)
Java程序的基本规则
Java程序源文件的主文件名可以是任意的。但如果Java程序源代码里定义了一个public类,则该源文件的主文件名必须与该public类名相同。Java源文件里最多只能定义一个public类
垃圾回收机制
C/C++显式回收垃圾,缺点:
1.忘记及时回收而导致内存泄漏,降低系统性能
2.错误地回收程序核心类库的内存,导致系统崩溃
Java程序的内存分配和回收都是由JRE在后台自动进行的。JRE会提供一个后台线程来进行检测和控制,在CPU空闲或内存不足时进行垃圾回收。程序员无法精确控制。垃圾回收还可以清理内存碎片。
优点:减轻编程负担,提高编程效率;保护程序的完整性,提高安全性
缺点:影响程序性能,因为JVM必须跟踪程序中的对象判断哪些无用
因此在编写Java程序时,不要引用不需要的对象
二、理解面向对象
结构化程序设计的局限性
1.设计不够直观,与人类习惯思维不一致。采用结构化程序分析设计时需要将客观世界分解成一个个功能,每个功能用以完成一定的数据处理
2.适应性差,可扩展性不强。由于结构化设计采用自顶向下的设计方式,当需求改变或需要修改现有实现方式时,也要自顶向下地修改
面向对象的基本特征
1.封装encapsulation 2.继承inheritance 3.多态polymorphism (没有抽象。所有的编程语言都需要抽象)
面向对象还支持如下功能:
1.对象是面向对象方法中最基本的概念,基本特点为:标识唯一性、分类性、多态性、封装性、模块独立性好
2.类是具有共同属性、共同方法的一类事物。类是对象的抽象,对象是类的实例。类是软件系统中最小的程序单元
3.对象间的这种相互合作通信需要一个机制协助进行,称为“消息”
类:具有相同或相似性质的一组对象的抽象,是对一类事物的描述。抽象
对象:实际存在的该类事物的个体。具体
“基于对象”:也使用了对象,但无法利用现有的对象模板产生新的对象类型,继而产生新的对象。即没有继承,那么也就没有多态(只实现了封装)。面向对象的三大基本特征缺一不可。如JavaScript使用了一些封装好了的对象,调用其方法,设置其属性,但无法让开发者派生新的类,只能使用现有对象的方法和属性
除了8个基本数据类型值之外,一切都是对象
三、数据类型和运算符
基本数据类型
4种整数类型(byte、short、int、long)+2种浮点类型(float、double)+1种字符类型(char)+1种布尔类型(boolean)。注意:String是引用类型
其中boolean1位;byte8位;short和char16位;int和float32位;long和double64位
double要比float精确,但依然无法精确地表示一个浮点数。若需要精确表示,应用BigDecimal类
两种表示方法:十进制数形式,科学计数法形式(如5.21e2)
java的浮点类型默认是double,要使浮点数当作float处理应在气候加上f。如5.12f或5.12F
java提供了3种特殊浮点数值:正无穷大(正数除以0,POSITIVE_INFINITY)、负无穷大(负数除以0,NEGATIVE_INFINITY)、非数(0除以0或负数开方,NaN),且所有正无穷大数值是相等的,所有负无穷大数值是相等的,非数与任何值都不相等(与其自身都不相等)。注意:上述特殊值是浮点数,若整数除以0则是抛出异常
POSITIVE_INFINITY,NEGATIVE_INFINITY,NaN都是Double类或Float类中的属性。使用方式:Double.NaN
Double类型是double的包装类,在JDK1.5以后,二者可以直接相互赋值,称为自动拆箱和自动装箱。JDK1.4及以下则用:
Double d =new Double(5.12);
将double基本数据类型装箱为Double包装类
java7引入了下划线分隔功能,可在数值中使用下划线。如:pi=3.14_15_9_26535;
在java中boolean类型的值只能是true或false,不能用0或非0代替
字符串"true" 和"false" 不会直接转换成boolean类型,但true和false在字符串运算时会自动转换成字符串。如:true+" " 的值为"true "。任何基本数据类型的值和字符串做连接运算时都将其转换成字符串类型(注意String是引用类型)
基本数据类型的类型转换
表数范围小的数值或变量赋值给表数范围大的变量时,将进行自动类型转换(如把byte值赋给double类型的变量)3+4+"Hello" 的值是"7Hello" ,"Hello"+3+4的值是"Hello34"
要想逆向进行类型转换,则需使用强制类型转换,又称缩小转换,可能造成数值溢出。
给float型变量赋值时要注意浮点数值默认是double型,应:
float a = 5.21f;
float a = (float)5.21;
String转int:
int i = Integer.parseInt("50");
表达式类型的自动提升
当算数表达式中包含多种基本数据类型的值时
1.所有的byte、short、char类型将被提升到int类型
2.整个算数表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型
直接量
在程序中通过源代码直接指定的值,包括3种:基本类型、字符串类型、null类型
当程序第一次使用某个字符串直接量时,java会使用常量池来缓存该字符串直接量。在之后需要使用该字符串直接量时直接从常量池中取。常量池指的是在编译期被确定,并保存在已编译的.class文件中的一些数据。
String str1 = "hello";
String str2 = "hello";
String str3 = "hel"+"lo";
System.out.println(str1==str2); //结果为true
System.out.println(str1==str3); //结果为true
java虚拟机会保证一个String常量只有一份copy。这里三个字符串都是对“hello”这个常量的引用。但是如果用到了new关键字,创建的是对象而不再是常量
String str1 = "hello";
String str2 = new String("hello");
String str3 = "hell"+new String("o");
System.out.println(str1==str2); //结果为false
System.out.println(str1==str3); //结果为false
System.out.println(str2==str3); //结果为false
因此判断两个字符串的值是否相等,最好还是用equals()函数