第四章 接口与多态
复习第三章:
1.两种类重用机制:继承是从属关系,组合是包含关系
2.super关键字可以调用超类构造方法
3.终结类和静态类,不可继承
静态类:普通静态类,必须加final修饰;内部静态类,不必加final
一、
接口即纯抽象类:抽象类中可以包含抽象方法和普通方法,接口中全是抽象方法
意义:
1.接口为多继承的变通实现
2.接口可以按照类的不同功能分组,使没有继承关系和没有组合关系的类,统一地对外提供接口
3.隐藏方法实现的细节
多态性:
1.子类对象引用超类方法
2.接口类型引用可以访问实现接口类的对象的方法
二、接口
可以包含:
1.抽象方法
2.基本数据类型的数据成员:默认为static和final,且必须初始化,之后不能更改
接口作用:
1.继承多个设计
2.建立类和类之间的“协议”:
a)不相关的类之间,按照他们共同行为,设计一个统一的接口
b)常量的共享
接口内的:
方法:public abstract关键字可以省略
数据成员:finale关键字可以省略。一定要有初始值,且不能改变
接口可以继承多个接口! extends关键字
类可以实现多个接口,implements关键字
三 类型转换
1.基本类型之间的转换
将值从一种类型转换到另一种类型
2.引用变量的类型转换
任何一个超类的类型
对象所属的类实现的一个接口
引用指向的对象的类型(向下转型)
一般为向上转型,唯一的向下转型!!!!!:即转为其本身的类型:
SupClass A;
A= new SubClass();
SubClass B= (SubClass) A;(向下转换)
四、方法查找
1.实例方法的查找,比如SubClass 和SupClass都有method方法
SubClass a = new Subclass();
SupClass b = (SupClass) a;
b.method();//调用SubClass的method方法,即超类引用调用子类方法
2.类方法的查找,比如SubClass和SupClass都有staticmethod方法
SubClass a = new Subclass();
SupClass b = (SupClass) a;
b.staticmethod();//调用SupClass的staticmethod方法
五、多态——统一消息,不同响应
1.超类和子类,实现统一接口的不同类型的对象
2.可以向不同类型对象发送相同消息,但
不同类型对象响应同一消息时的行为可以有所差别
绑定:方法调用表达式 方法体的代码 结合起来
早绑定:编译器,程序运行前
晚绑定:动态绑定,在运行期基于对象的类别,绑定应该执行的方法体
多态性的两个技术:
1.动态绑定技术
2.向上转型技术
六、构造方法与多台性
构造方法中调用了抽象方法,会出现不确定的情况
/*在一个构造函数中,首先会调用父类的构造函数,如果没有显示调用,则调用父类没有参数的构造函数*/
构造方法设计要注意:
1.用最少的动作做初始化
2.如果可以避免,不要调用任何方法
3.唯一能够安全调用的是超类中具有final属性的方法,或者private方法(private方法自动为final)
第五章 异常处理
Java异常处理机制的特点:
1.将错误处理代码从常规代码中分离
按错误类型和差别分组
对无法预测的错误进行捕捉
自定义异常类
2.错误的分类:
1.错误
Error类是所有错误类的父类
2.异常
Exception类是所有异常类的父类
3.异常的分类:
非检查型异常
不期望程序捕获的异常,在方法中不需要声明,编译器也不进行检查
继承自RuntimeException
不要求捕获和声明的原因:
1.引发异常的操作在Java中会频繁出现,比如每次使用对象时,都必须编写异常代码来检查null引用的话,会变成一个庞大的try-catch块
2.不一定作为异常处理。可以在使用引用前测试空值。可以在除法中测试零值!
4.检查型异常
其他类型的异常
如果被调用的方法跑出一个E异常,调用的方法必须处理
5.检查型异常的处理
1)声明抛出异常 throws
如果调用方法不处理异常,可以throws语句抛出,最后会抛给JVM,JVM会捕捉异常,做相应的处理,并终止程序运行
2)捕捉异常
try{}catch{}finally{}
catch{}打印错误信息,打印调用堆栈
finally{}通常用来释放内存以外的其他资源
6.生成异常对象
1)三种方式
a。由于Java虚拟机生成
b。由Java类库中的某些类生成
c。在自己写的程序中生成和抛出异常对象
2)抛出异常对象都是通过throw语句实现,异常对象必须是Throwable或其子类的实例
throw new ThrowableObject();
ArithmeticException e = new ArithmeticException();
throw e;
7.声明自己的异常类
自定义的异常类必须是Exception的子类
第六章 输入输出
一、流的概念
流:从内存与其他地方之间数据传输的通道
I/0流类分类:
1.按照方向:输入流、输出流
2.按照分工:节点流(进行输入输出),处理流(I/O之前之后处理)
3.按照内容:直接继承自Object
给机器读:面向字节:InputStream OutputStream
给人读:面向字符:Reader Writer
面向字符的流:
目标:文本文件
实现内部格式unicode 16-bit char和文本文件中的外部格式UTF,ascii等之间的转化
面向字节的流:
目标:二进制文件
标准输入输出流类:
System.in
System.out
System.in
例:标准输入/输出重定向 复制文件
import java.io.*;
public class Redirecting{
public static void main(String[] args) throws IOException{
BufferedInputStream in = new BufferedInputStream(
new FileInputStream(“Redirecting.java”));
PrintStream out = new PrintStream(
new BufferOutputStream(
new FileOutputStream(“test.out")));
System.setIn(in);
System.setOut(out);
System.setErr(out);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s;
while((s=br.readLine())!=null)
System.out.println(s);
in.close();
out.close();
}
}
二、写文本文件
FileWriter与BufferedWriter都用于输出字符流区别:
1.BufferedWriter提供缓冲区,提升写效率
2. BufferedWriter提供了一个newLine()方法,这个方法是跨平台的,可以进行换行
比如FileWriter输入\n,在windows的txt文本中无法显示换行!
import java.io.*;
class BufferedWriterTest{
public static void main(Strings[] args) throws IOException{
String fileName = “newHello.txt”;
BufferedWriter out = new BufferedWriter(new FileWriter(fileName));
out.write(“Helloe!”);
out.newLine();
out.write(“end”);
out.close();
}
}
思考:其实BufferWriter与FileWriter的关系应该是与BufferInputStream与FileInputStream的关系一样,
在设计模式中,都属于Wrapper包装模式的 decorator装饰者模式
Writer是抽象组件,FileWriter是具体组件,而且BufferWriter中含有一个Writer对象实例的引用
在这里decorator模式使具体组件FileWriter更强大:
是因为它通过将要写的内容放在缓存区,从而提高了输出效率
三、读文本文件
FileReader与BufferReader
注意:每个文件中只能有一个public类,其他类默认为private类
但是有几个类,就会生成几个.class文件
这里写一个copy文件完整的类:
*****************************************
class CopyMaker{
String sourceName, destName;
BufferedReader source;
BufferedWriter dest;
String line;
private boolean openFiles(){
try{
source = new BufferedReader(new FileReader(sourceName));
}
catch(IOException iox){
System.out.println(“Open Error”);
return false;
}
try{
dest = new BufferdWriter(new FileWriter(destName));
}
catch(IOException iox){
System.out.println(“Open Error”);
return false;
}
}
}
private boolean copyFiles(){
try{
line=source.readLine();
while(line!=null){
dest.write(line);
dest.newLine();
line=source.readLine();
}
}
catch(IOException iox){
…
return false;
}
return true;
}
private boolean closeFiles(){
try{
source.close();
}
catch(IOException iox){}
try{
dest.close();
}
catch(IOException iox){}
return true;
}
public boolean copy(String src,String dst){
sourceName= src;
destName= dst;
return openFiles() && copyFiles() &&closeFiles();
}
public class FileCopy{
public static void main(String[] args){
if(args.length==2)
new CopyMaker().copy(args[0],args[1]);
else
System.out.println(“xxx”);
}
}
*****************************************
四、写二进制文件
1.抽象类OutputStream
派生类:FileOutputStream:节点流
派生类:DataOutputStream:处理流 提供了size,跨平台统一数据格式,多种数据方式写接口
派生类:BufferOutputStream:加了缓冲
五、读二进制文件
1.抽象类InputStream
DataOutputStream
FileInputStream
BufferInputStream
循环读,通过异常来判断读完了
嵌套try catch结构
DataOutputStream的writeByte方法
写int的最不重要字节
读Int的最不重要字节
复制二进制文件code:
六、File类
文件相关信息,管理文件
File f= new File(“Hello.txt");
if(f.exists()) f.delete();
else
try{
f.createNewFile();
}
catch(Exception e){
}
isfile方法
七、处理压缩文件
GZIP格式压缩一个文件,ZIP可以压缩多个文件
压缩流类
压缩:GZIPOutputStream和ZipOutputStream
解压缩:GZIPInputStream和ZipInputStream
八、对象序列化
ObjectInputStream/ObjectOutputStream类
实现对象的读写
不保存对象的transient和static类型的变量
对象所属类必须实现Serializable接口(实际为空接口)
transient用来阻止序列化
Externalizable 接口 extends Serializable
writeExternal() readExternal()
对序列化做特殊处理,如加密
九、随机文件读写
RandomAccessFile类
可跳转到文件的任意位置读/写数据
可在随机文件中插入数据,而不破坏该文件的其他数据
第六章 对象群体的组织
一、Java集合框架介绍
1.对外的接口:表示集合的抽象数据类型
2.接口的实现:指实现集合接口的Java类,是可重用的数据结构
3.对集合运算的算法:比如查找、排序
两大接口:
Collection类接口
Map类接口
Collection接口常用方法
查询类:containAll, contain,isEmpty
修改类:retainAll,removeAll
二、主要接口及常用的实现类
1.Collection的子接口:
Set接口:SortedSet接口
List接口:
Vector,ArrayList,LinkedList,Stack
Queue接口:
LinkedList,PriorityQueue
2.Map接口
Map接口:SortedMap子接口(类:TreeMap, ConcurrentSkipListMap)
三、常用算法
一般都用于List,max,min可以用于所有接口
1.排序算法sort
两种形式:
a.自然次序排列,或者集合实现了Comparable接口
b.需要一个附加的Comparator对象作参数
2.洗牌算法shuffle
3.reverse
4.fill
5.copy
6.binarySearch
查找RadomAccess接口,如果没有,还是线性查找
四、数组常用算法
Arrays类:java.util.Arrays
常用方法:
fill,equals,sort,binarySearch,toString,array copy
五、两个基于动态数组的类型
Vector,ArrayList:
1.都实现了Collection接口
2.不能存储基本类型的数据,支持基本类型包裹类
3.ArrayList方法是非同步的,效率较高
4.Java提供了线程安全集合:Java.util.concurrent包,印象、有序集、队列:
任何集合类通过使用同步包装器变成线程安全的:
List<E> synchArrayList=Collections.synchronizedList(new ArrayList<E>)
注意:
1.ArrayList:默认构造10个元素
2.两者区别:
Vector是遗留的,旧线程安全集合,推荐用ArrayList,同步包装器变成线程安全
六、遍历Collection
1.通过Enumeration(旧版本)/Iterator(有限选用)接口遍历
2.增强for循环遍历集合
3.通过聚集操作遍历集合
1.迭代器遍历
Java中的许多方法返回Enumeration类型对象
Enumeration不能用于ArrayList对象,Iterator可以
Iterator方法:hasNext(),next(),remove()—从集合中取出最后调用next()返回的元素,而不是从Iterator类中取出
2.增强for循环:
Vector<String>dayNames = new Vector();
dayNames.add();
for(String day: dayNames){day…}
3.聚集操作与lamda表达式一起使用
七、Map接口
抽象方法主要有:查询方法和修改方法
两个主要实现类:HashTable(1.0) HashMap(1.2)
查询方法:
size,isEmpty,containsKey,containsValue,get,values,keySet,
修改方法:
put,putAll,remove,clear
Hash的概念:
容量,key,
hashcode(Key映射到的一个真行数据),value,
哈希函数,item,装填因子load factor=item number/compacity
解决冲突的算法:链地址法,二次散列法
HashMap构造方法:默认容量16,装填因子0.75
第七章 图形用户界面
GUI的程序都是事件驱动的
Swing