Java基础语法笔记2

2012-05-27 23:40:26

第四章 接口与多态

复习第三章:

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