1、 Java学习笔记目 录一、 Java技术基础1.1编程语言1.2 Java的特点1.3 Java开发环境1.4 Java开发环境配置1.5 Linux命令与相关知识1.6 Eclipse/Myeclipse程序结构二、 Java语言基础2.1基础语言要素2.2八种基本数据类型2.3常量和变量2.4运算符与表达式2.5编程风格2.6流程控制语句2.7数组2.8字符串2.9方法三要素2.10插入排序2.11冒泡排序2.12冒泡排序:轻气泡上浮的方式2.13二分法
2、查找2.14 Java系统API方法调用2.15二进制基础2.16 Java基础其他注意事项三、 面向对象3.1类3.2对象3.3包3.4方法及其调用3.5引用3.6访问控制(封装)3.7构造器3.8 super()、super和 this()、this3.9重载和重写3.10继承3.11 static3.12 final3.13多态3.14抽象类3.15接口3.16内部类3.17匿名类3.18二维数组和对象数组3.19其他注意事项四、 Java SE核心I4.1 Object类4.2 String类4.3 StringUtils类4.4 StringBuilder类4.5正则表达式4.6 D
3、ate类4.7 Calendar类4.8 SimpleDateFormat类4.9 DateFormat类4.10包装类4.11 BigDecimal类4.12 BigInteger类4.13 Collection集合框架4.14 List集合的实现类ArrayList和LinkedList4.15 Iterator迭代器4.16泛型4.17增强型for循环4.18 List高级数据结构:Queue队列4.19 List高级数据结构:Deque栈4.20 Set集合的实现类HashSet4.21 Map集合的实现类HashMap4.22单例模式和模版方法模式五、 Java SE核心II5.1
4、Java异常处理机制5.2 File文件类5.3 RandomAccessFile类5.4基本流:FIS和FOS5.5缓冲字节高级流:BIS和BOS5.6基本数据类型高级流:DIS和DOS5.7字符高级流:ISR和OSW5.8缓冲字符高级流:BR和BW5.9文件字符高级流:FR和FW5.10 PrintWriter5.11对象序列化5.12 Thread线程类及多线程5.13 Socket网络编程5.14线程池5.15双缓冲队列 Java技术基础1.1编程语言机器语言:0 1在硬件直接执行汇编语言:助记符高级语言: (Java运行比C/C+慢)1)面向过
5、程的高级语言:程序设计的基本单位为函数,如:C/C+语言。2)面向对象的高级语言:程序设计的基本单位为类,如:Java、C#。1.2 Java的特点平台无关性、简单性、面向对象、健壮性、多线程、自动内存管理。平台无关性:指Java语言平台无关,而Java的虚拟机却不是,需要下载对应平台JVM虚拟机的。自动内存管理:对临时存储的数据自动进行回收,释放内存。如:引用类型的变量没有指向时,被回收;程序执行完后,局部变量被回收。1.3 Java开发环境Java Developement KitJava开发工具包,简称JDK,是由Sun公司提供的一个免费的Java开发工具,编程人
6、员和最终用户可以利用这个工具来编译、运行Java程序。目前版本有JDK1.0、JDK1.1、JDK1.2、JDK1.3、JDK1.4、JDK1.5(J2SE5.0)、JDK1.6(J2SE6.0)、JDK1.7(J2SE7.0)。JDK结构:JDK |-开发工具(Tools)命令:java、javac、jar、rmic . |- JRE(Java基本运行环境) |-系统API库,系统类库 | 系统带来的标准程序库,标准API |-
7、 J VM java虚拟机 java 语言的执行环境1.4 Java开发环境配置安装完JDK之后,不能立刻使用,需要设置环境变量:1)设置PATH:D:Javajdk1.6.0bin(指向JDK中bin文件夹,有各种编译命令)。2)CLASSPATH:告诉Java程序去哪里查找第三方和自定义类,如果 .class文件和类源文件在同一文件夹内,则不需要配置classpath,后续有包,则需要。AWindows:在命令行执行set CLASSPATH=E:workspace1304bin (临时环境配置)java day02.Demo1u 注意事项
8、:v E: set classpath= c: (不加分号就不找当前路径) = . ; c: ; d: ;(先找classpath,若无,再找当前路径)v C、D两盘有同名 . class 文件,classpath设置为D盘,而命令行窗口当前盘符为C盘,则JVM现找classpath路径,后找当前路径。BLinux:在控制台执行设置CLASSPATH环境变量,指向package所在的目录,一般是项目文件夹中的bin目录。执行java package.ClassName (包名必须写)。
9、export CLASSPATH=/home/soft01/workspace/1304/bin (临时环境配置) java day01.HelloWorld java -cp /home/soft01/workspace/1304/bin day01.HelloWorld(二合一)u 注意事项:v Windows根目录是反斜线:v Linux根目录是斜线:/1.5 Linux命令与相关知识1)Linux无盘符,只有一个根目录(root)2)终端 = 控制台 = 命令行窗口3)pwd:打印当前工作目录,显示当前
10、工作目录的位置4)ls:列表显示目录内容,默认显示当前目录内容5)cd:改变当前工作目录;cd后不加参数=返回home文件夹;cd :返回home; cd /:切换到根目录;cd . :返回上一层目录(相对的);6)mkdir:创建文件夹(目录) 注意:目录 = 文件夹7)rm:删除文件;rm xx xx:可删多个文件; rm rf xx:-为减号,r表递归,f表强制8)cat xx:显示文本文件内容9)启动Java开发工具:cd/opt/eclipse &
11、nbsp; ./eclipse . 表当前目录下10)绝对路径: /home (以 / 开始为绝对路径,相对于根目录) 相对路径:home (相对于当前工作目录)11)home(用户主目录,用户的家):/home/username 如:/home/soft0112)主目录(home):有最大访问权限:什么都能干,增删改查、建目录等 其他地方:一般只能查看,不能增删改查、创建目录等1.6 Eclipse/Myeclipse程序结构Project项目文件 |- src源文件| |- P
12、ackage包|-.java源文件 |- bin |- Package包|- .class字节码程序u 注意事项:v Myeclipse5.5消耗少,Myeclipse6.5最稳定Java语言基础2.1基础语言要素1)标识符:给类、方法、变量起的名字A必须以字母或下划线或 $ 符号开始,其余字符可以是字母、数字、$ 符号和下划线。B只能包含两个特殊字符,即下划线 _ 和美元符号 $ 。不允许有任何其他特殊字符。C标识符不能包含空格。D区分大小写。2)关键字:只有系统才能用的标识符u 注意事项:v true、false、null不是关键字!是字面量。v main不是关键字!但是是一个特殊单词,可
13、以被JVM识别,主函数是固定格式,作为程序的入口。3) 注释:单行注释:/ 多行注释:/* */ 文档注释:/*/u 注意事项:开发中类前、属性前、方法前,必须有文档注视。2.2八种基本数据类型1)四种整数类型(byte、short、int、long):byte:8位,用于表示最小数据单位,如文件中数据,-128127short:16位,很少用,-32768 32767int:32位、最常用,-231-1231 (21亿)long:64位、次常用u 注意事项:v int i=5; / 5叫直接量(或字面量),即直接写出的常数。v 整数字面量默认都为int类型,所以在定义
14、的long型数据后面加L或l。v 小于32位数的变量,都按int结果计算。v 强转符比数学运算符优先级高。见常量与变量中的例子。2)两种浮点数类型(float、double):float:32位,后缀F或f,1位符号位,8位指数,23位有效尾数。double:64位,最常用,后缀D或d,1位符号位,11位指数,52位有效尾数。u 注意事项:v 二进制浮点数:1010100010=101010001.0*2=10101000.10*210(2次方)=1010100.010*211(3次方)= . 1010100010*21010(10次方)v 尾数: . 1010100010 指数:
15、1010 基数:2v 浮点数字面量默认都为double类型,所以在定义的float型数据后面加F或f;double类型可不写后缀,但在小数计算中一定要写D或X.X。v float 的精度没有long高,有效位数(尾数)短。v float 的范围大于long 指数可以很大。v 浮点数是不精确的,不能对浮点数进行精确比较。3)一种字符类型(char):char:16位,是整数类型,用单引号括起来的1个字符(可以是一个中文字符),使用Unicode码代表字符,0216-1(65535)。u 注意事项:v 不能为0个字符。v 转义字符:n 换行 r 回车 t Tab字符 " 双引
16、号 表示一个v 两字符char中间用“+”连接,内部先把字符转成int类型,再进行加法运算,char本质就是个数!二进制的,显示的时候,经过“处理”显示为字符。4)一种布尔类型(boolean):true真 和false假。5)类型转换: char->自动转换:byte->short->int->long->float->double 强制转换:会损失精度,产生误差,小数点以后的数字全部舍弃。 容易超过取值范围。2.3常量和
17、变量变量:内存中一块存储空间,可保存当前数据。在程序运行过程中,其值是可以改变的量。1)必须声明并且初始化以后使用(在同一个作用域中不能重复声明变量)!2)变量必须有明确类型(Java是强类型语言)。3)变量有作用域(变量在声明的地方开始,到块结束)。变量作用域越小越好。4)局部变量在使用前一定要初始化!成员变量在对象被创建后有默认值,可直接用。5)在方法中定义的局部变量在该方法被加载时创建。常量:在程序运行过程中,其值不可以改变的量。u 注意事项:v 字面量、常量和变量的运算机制不同,字面量、常量由编译器计算,变量由运算器处理,目的是为了提高效率。eg:小于32位数的字面量处理byte b1
18、 = 1; byte b2 = 3;/byte b3 = b1+b2;/编译错误,按照int结果,需要强制转换byte b3 = (byte)(b1+b2);/byte b3 = (byte)b1+(byte)b2;/编译错误!两个byte、short、char相加还是按int算System.out.println(b3); /选择结果:A编译错误B运行异常 C 4 D b3byte b4 = 1+3;/字面量运算,编译期间替换为4,字面量4/byte b4 = 4; 不超过byte就可以赋值v 不管是常量还是变量,必须先定义,才能够使用。即先在内存中开辟存储空间,才能够往里面放入
19、数据。v 不管是常量还是变量,其存储空间是有数据类型的差别的,即有些变量的存储空间用于存储整数,有些变量的存储空间用于存储小数。2.4运算符与表达式1)数学运算:+-*/%+-u 注意事项:v + - * / 两端的变量必须是同种类型,并返回同种类型。v % 取余运算,负数的余数符号与被模数符号相同, - 1 % 5 = - 1,1 % - 5 = 1;Num % n,n>0,结果范围0,n),是周期函数。v 注意整除问题:1 / 2 = 0(整数的除法是整除)1.0 / 2 = 0.5 1D / 2 = 0.5v 单独的前、后自增或自减
20、是没区别的,有了赋值语句或返回值,则值不同!eg1:自增自减int a = 1; a = a+; System.out.println("a的值:"+a);第1步:后+,先确定表达式a+的值(当前a的值) a+ ->1 第2步:+,给a加1 a ->2第3步:最后赋值运算,把a+整个表
21、达式的值赋值给a a ->1a被赋值两次,第1次a = 2,第2次把1赋值给1eg2:自增自减x,y,z分别为5,6,7 计算z + = - y * z+ ;/ x = 5,y = 5,z = 42z = z + - y * z+ 42 = 7 + 5 * 7 从左到右入栈,入的是值eg3:取出数字的每一位d = num%10;/获取num的最后一位数num/=10; /消除num的最后一位2) 位运算:& | (取反) (异或)>> <<>
22、>>u 注意事项:v 一个数异或同一个数两次,结果还是那个数。v |:上下对齐,有1个1则为1;&:上下对齐,有1个0则为0;(都为二进制)v &相当于乘法,| 相当于加法;&:有0则为0,| :有1则为1,:两数相同为0,不同为1。3)关系运算符:> < >= <= 0="" 1="" 2="" 3="" int="" x="”+x+”,y=”+y+”,z=”+z);/" x-=
23、"=1" -="*=" flag="" u="" v="" a=""> b ? a : i > j ? i : j 相当于 a > b ? a : ( i > j ? i : j )v 三目运算符中:第二个表达式和第三个表达式中如果都为基本数据类型,整个表达式的运算结果由容量高的决定。如:int x = 4;x > 4 ? 99.9 : 9; 99.9是double类型,而9是int类型,double容量高,所以最后结果为9.9。7) 运算符优先
24、级:括号 > 自增自减 > ! > 算数运算符 > 位移运算 > 关系运算 > 逻辑运算 > 条件运算 > 赋值运算2.5编程风格MyEclipse/Eclipse中出现的红色叉叉:编译错误编译错误:java编译器在将Java源代码编译为class文件的过程出现的错误,一般是语法使用错误!当有编译错误时候,是没有class文件产生,也就不能运行程序。Java 程序结构:2.6流程控制语句1)选择控制语句if语句:if 、if-else、if-else-if:可以处理一切分支判断。格式:if(判断)、if(判断)else、
25、if(判断)else if(判断)switch语句:switch(必须整数类型)case 常量1:; case 常量2: ; . u 注意事项:v int类型指:byte、short、int,只能写long类型,要写也必须强转成int类型;而byte、short为自动转换成int。v swtich-case:若case中无符合的数,并且default写在最前(无break时),则为顺序执行,有break或 则退出。v swtich-case:若case中无符合的数,并且default写在最后,则执行default。v swtich-case:若case中有符合的数,并且default写在最后,
26、并且default前面的case没有break时,default也会执行。2)循环控制语句for:最常用,用在与次数有关的循环处理,甚至只用for可以解决任何循环问题。u 注意事项:for中定义的用于控制次数的循环变量,只在for中有效,for结束则循环变量被释放(回收)。while:很常用,用在循环时候要先检查循环条件再处理循环体,用在与次数无关的情况。如果不能明确结束条件的时候,先使用while(true),在适当条件使用if语句加break结束循环。do-while:在循环最后判断是否结束的循环。如:使用while(true) 实现循环的时候,结束条件break在while循环体的最后,
27、就可以使用 do-while 。do-while 的结束条件经常是“否定逻辑条件”,不便于思考业务逻辑,使用的时候需要注意。可以利用while(true)+ break 替换。循环三要素:A循环变量初值 B循环条件 C循环变量增量(是循环趋于结束的表达式)for和while循环体中仅一条语句,也要补全 ,当有多条语句,且不写 时,它们只执行紧跟着的第一条语句。 循环的替换: while(布尔表达式) 等价 for(;布尔表达式;) while(true) 等价 for(;) while(true) + break 替换 dowhile(布尔表达式
28、); for(;) + break 替换 dowhile(布尔表达式);3)跳转控制语句continue:退出本次循环,直接执行下一次循环break:退出所有循环2.7数组类型一致的一组数据,相当于集合概念,在软件中解决一组,一堆XX数据时候使用数组。1)数组变量:是引用类型变量(不是基本变量)引用变量通过数组的内存地址位置引用了一个数组(数组对象),即栓到数组对象的绳子。eg:数组变量的赋值 int ary = new int3;/ ary->0,0,0<-ary1 int ary1 = ary;/
29、ary 的地址赋值给ary1,ary 与 ary1 绑定了同一个数组 /ary1 与 ary11 是同一个元素,数组变量不是数组(数组对象)2)数组(数组对象)有3种创建(初始化)方式:new int10000 给元素数量,适合不知道具体元素,或元素数量较多时 new int3,4,5 不需要给出数量,直接初始化具体元素适合知道数组的元素。 2,3,4 静态初始化,是简化版,只能用在声明数组变量的时候直接初始化,不能用于赋值等情况。eg:数组初始化int ary1 = new int2,3,4;/创建数组时候直接初始化元素int ary2 = 2,3,4
30、;/数组静态初始化,只能在声明变量的同时直接赋值/ary2 = 4,5,6;/编译错误,不能用于赋值等情况ary2 = new int4,5,6;3)数组元素的访问:数组长度:长度使用属性访问,ary.length 获取数组下标。数组下标:范围:0 length-1就是0,length),超范围访问会出现下标越界异常。使用index 访问数组元素:ary2。迭代(遍历):就是将数组元素逐一处理一遍的方法。4)数组默认初始化值:根据数组类型的不同,默认初始化值为:0(整数)、0.0(浮点数)、false(布尔类型)、u0000(char字符类型,显示无效果,相当于空格,编码为0的字符,是控制字符
31、,强转为int时显示0)、null(string类型,什么都没有,空值的意思)。5)数组的复制:数组变量的赋值,是并不会复制数组对象,是两个变量引用了同一个数组对象。数组复制的本质是创建了新数组,将原数组的内容复制过来。6)数组的扩容:创建新数组,新数组容量大于原数组,将原数组内容复制到新数组,并且丢弃原数组,简单说:就是更换更大的数组对象。System.arraycopy() 用于复制数组内容,简化版的数组复制方法:Arrays.copyOf()方法,但需JKD1.5+。2.8字符串字符串(string):永远用“”双引号(英文状态下),用字符串连接任何数据(整数),都会默认的转化为字符串类
32、型。字符串与基本数据类型链接的问题:如果第一个是字符串那么后续就都按字符串处理,如System.out.println("(Result)"+6 + 6 );那么结果就是(Result)66,如果第一个和第二个第n个都是基本数据,第n+1是字符串类型,那么前n个都按加法计算出结果在与字符串连接。如下例中的System.out.println(1+2+”java”+3+4);结果为3java34。eg:字符串前后的“+”都是连接符!不是加法运算符!System.out.println("A"+'B');/ABSystem.out.print
33、ln('A'+'B');/131System.out.println(1+2+”java”+3+4);/3java34u 注意事项:比较字符串是否相等必须使用equals方法!不能使用=。"1".equals(cmd) 比cmd.equals("1") 要好。2.9方法三要素方法:method(函数function = 功能) y=f(x) 1)方法的主要三要素:方法名、参数列表、返回值。2)什么是方法:一个算法逻辑功能的封装,是一般完成一个业务功能,如:登录系统,创建联系人,简单说:方法是动作,是动词。3)方法名:一般按
34、照方法实现的功能定名,一般使用动词定义,一般使用小写字母开头,第二个单词开始,单词首字母大写。如:createContact() 。4)参数列表:是方法的前提条件,是方法执行依据,是数据。如: login(String id, String pwd) ,参数的传递看定义的类型及顺序,不看参数名。5)方法返回值:功能执行的结果,方法必须定义返回值,并且方法中必须使用return语句返回数据;如果无返回值则定义为void,此时return语句可写可不写;返回结果只能有一个,若返回多个结果,要用数组返回(返回多个值)。u 注意事项:递归调用:方法中调用了方法本身,用递归解
35、决问题比较简练,只需考虑一层逻辑即可!但是需要有经验。一定要有结束条件!如:f(1)=1; 递归层次不能太深。总之:慎用递归!2.10插入排序将数组中每个元素与第一个元素比较,如果这个元素小于第一个元素,则交换这两个元素循环第1条规则,找出最小元素,放于第1个位置经过n-1轮比较完成排序。 for(int i = 1; i < arr.length; i+) int k = arri;/ 取出待插入元素 int j;/ 找到插入位置 for (j = i - 1; j >= 0 && k
36、< arrj; j-) arrj + 1 = arrj;/ 移动元素 arrj + 1 = k;/ 插入元素 System.out.println(Arrays.toString(arr); 2.11冒泡排序比较相邻的元素,将小的放到前面。 for(int i = 0; i < arr.length - 1; i+) boolean isSwap = false; &n
37、bsp;for (int j = 0; j < arr.length - i - 1; j+) if (arrj > arrj + 1) int t = arrj; arrj = arrj + 1; arrj + 1 = t; &n
38、bsp; isSwap = true; if (!isSwap) break; System.out.println(Arrays.toString(arr); 2.12冒泡排序:轻气泡上浮的方式冒泡排序法可以使用大气泡沉底的方式,也可以使用轻气泡上浮的方式实现。如下为使用轻气泡上浮的方式实现冒泡排序算法。 for (int i = 0; i < arr.length - 1; i+) &
39、nbsp;boolean isSwap = false; for (int j = arr.length - 1; j > i; j-) if (arrj < arrj - 1) int t = arrj; arrj = arrj - 1; &n
40、bsp; arrj - 1 = t; sSwap = true; if (!isSwap) break; System.out.pr
41、intln(Arrays.toString(arr); 2.13二分法查找 intlow = 0;inthigh = arr.length - 1;intmid = -1; while(low <= high) mid = (low + high) / 2; if (arrmid < value)low = mid + 1; else if (arrmid > value) high = mid - 1; else &
42、nbsp; break; if (low <= index=" + mid + " else=""> k,在前半段中继续进行二分查找;若arrmid < k,则在后半段中继续进行二分查找。假如有一组数为3、12、24、36、55、68、75、88要查给定的值k=24。可设三个变量low、mid、high分别指向数据的上界,中间和下界,mid=(low+high)/2.1)开始令low=0(指向3),high=7(指向88),则mid=3(指向36)。因为kmid,故确定应在后半段中查
43、找。3)令新的low=mid+1=2(指向24),而high=2(指向24)不变,则新的mid=2,此时k=arrmid,查找成功。如果要查找的数不是数列中的数,例如k=25,当第四次判断时,k>mid2,在后边半段查找,令low=mid+1,即low=3(指向36),high=2(指向24)出现low>high的情况,表示查找不成功。2.14 Java系统API方法调用Arrays类,是数组的工具类,包含很多数组有关的工具方法。如:1)toString() 连接数组元素为字符串,方便数组内容输出。2)equals 比较两个数组序列是否相等。3)sort() 对数组进行排序,小到大
44、排序。4)binarySearch(names, "Tom") 二分查找,必须在有序序列上使用。2.15二进制基础1)计算机中一切数据都是2进制的! 基本类型,对象,音频,视频。2)10进制是人类习惯,计算按照人类习惯利用算法输入输出。 "10" -算法转化-> 1010(2) 1010 -算法转化-> "10" 3)16进制是2进制的简写,16进制就是2进制!4)计算机硬件不支持正负号,为了解决符号问题,使用补码算法,补码规定高位为1则为负数,每位都为1则为-1,如1111 1111
45、 = -1 = 0xff5)二进制数右移>>:相当于数学 / 2(基数),且正数高位补0,负数高位补1;二进制字左移<<:相当于数学>>>:相当于数学 / 2(基数),且不论正负,高位都补0。6)注意掩码运算:把扩展后前面为1的情况除去,与0xff做与运算。eg1:二进制计算int max = 0x7fffffff; long l = max + max + 2; System.out.println( l );/ 0eg2:二进制运算(拼接与拆分)int b1 = 192; int b2 = 168; int
46、 b3 = 1; int b4 = 10; int color = 0xD87455;int ip = (b1<<24) + (b2<<16) + (b3<<8) + b4; / 或者ip = (b1<<24) | (b2<<16) | (b3<<8) 85="" int="" b="color&0xff;" g="(color">>> 8)&0xff; / 116 int r = (color &
47、gt;>> 16)&0xff;/ 2162.16 Java基础其他注意事项v Java程序严格区分大小写。v 类名,每个单词首字母必须大写(公司规范!)。v 一个Java应用程序,有且只有一个main方法,作为程序的入口点。v 每一条Java语句必须以分号结束。v 类定义关键字class前面可以有修饰符(如public),如果前面的修饰符是public,该类的类名必须要与这个类所在的源文件名称相同。v 注意程序的缩进。v double a = new double2; /语法可以,但企业中一定不要这么写,Java中建议放前面。v Java中所有范围参数都是包含0,不包含结束
48、,如int n = random.nextInt(26); /生成0到26范围内的随机数,不包括26。v 任何数据在内存中都是2进制的数据,内存中没有10进制16进制。v int n = Integer.parseInt(str);/将字符串-> int 整数。v System.out.println(Long.toBinaryString(maxL); Long类型用Long.XXXX 。v 程序:数据+算法 数据即为变量,算法为数据的操作步骤,如:顺序、选择、循环。v 字符串按编码大小排序。面向对象Object:对象,东西,一切皆对象 = = 啥都是东西面向对象核心:封装、继承、多态
49、。3.1类1) 是同类型东西的概念,是对现实生活中事物的描述,映射到Java中描述就是class定义的类。类是对象的模板、图纸,是对象的数据结构定义。简单说就是“名词”。2) 其实定义类,就是在描述事物,就是在定义属性(变量)和方法(函数)。3) 类中可以声明:属性,方法,构造器;属性(变量)分为:实例变量,局部变量;实例变量:用于声明对象的结构的,在创建对象时候分配内存,每个对象有一份!实例变量(对象属性)在堆中分配,并作用于整个类中,实例变量有默认值,不初始化也能参与运算;局部变量在栈中分配,作用于方法或语句中,必须初始化,有值才能运算。4) 类与类之间的关系:关联:一个类作为另一个类的成
50、员变量:需要另一个类来共同完成。class A pulic B b class B 继承:class B extends A class A 依赖:个别方法和另一个类相关。class A public void f(B b) /参数里有B public B g() /返回值里有B class B 5)null与空指针异常:引用类型变量用于存放对象的地址,可以给引用类型赋值为null,表示不指向任何对象。当某个引用类型变量为null时无法对对象实施访问(因为它没有指向任何对象)。此时,如果通过引用访问成员变量或调用方法,会产生NullPointerException空指针异常。u 注意事项:除了8中基本类型,其他都是引用类型变量(也叫句柄)。3.2对象是这类事物实实在在存在的个体!利用类做为模板创建的个体实例,本质是数据。匿名对!-!-!-