一、接口
1)接口中定义的方法都是public权限,并且默认为public,而不是default。
2)接口的实现(implements)是特殊的继承,类似于父类子类的关系,可以向上转型(非常重要)。
3)一个类可以实现多个接口;一个接口可以继承多个接口。
二、静态变量/方法
1)如果某方法(或变量)声明为static,则可以直接使用“类名.方法名(或变量名)”调用。
2)静态方法只能使用静态变量。
三、静态工厂模式
核心思想:把生成对象的代码(使用new来调用构造函数的方法)封装在工厂类中,降低代码重复率。
例如:HPPrinter类和CanonPrinter类继承自Printer类,两者都包含print()方法但实现方法不同。如果现在要分开实现print()方法,则要分开生成对象,然后调用该方法,并且如果新增一台其他类型的Printer的话还需要重复这一步骤。静态工厂模式就是使用一个方法(写到一个PrinterFactory类里),传入类型为Printer的参数,然后执行print()方法。利用向上转型,只要是Printer的子类都适用。
四、包
在命令行环境下编译java文件,如果声明了包名(package),命令需要修改为:
javac -d . Test.java ("."是指新生成的文件夹放于当前目录,“-d”是指directory)
并且执行时需要加上包名,如
java pack.Test
五、权限
public > protected > default > private
1)public可以包外访问,而default只能包内访问。
2)private不能类外访问。
3)protected拥有default所拥有的权限(但不能用于修饰类),而且可以跨包继承。子类和父类不在一个包中,但是子类可以使用父类中被修饰为protected的成员变量和方法。
4)public类在一个文件中最多只能有一个,此时必须和java文件同名。没有public类则无此要求。
5)如果在权限不足的情况下继承,继承本身不会出错(编译不会报错),但是成员变量和方法不允许访问,访问时会报错。
六、异常
1)throw:抛出异常
2)throws:声明有可能产生异常,一旦声明了就不需要在该函数内处理,而是可以在调用该函数时使用try...catch来处理。
七、内部类和匿名内部类
1)设B是A的内部类,则生成B的对象前需要先生成A的对象:A.B b = new A().new B();
2)内部类可以使用外部类的成员变量,每一个内部类都有与其相对应的外部类。
3)匿名内部类:
b.fun(new A(){ public void doSomething(){ System.out.println("匿名内部类"); } //A是接口,这里直接生成一个实现了该接口的对象。 })
八、I/O
注:输入和输出是相对程序而言的
1)字节流
FileInputStream继承自InputStream(抽象);FileOutputStream继承自OutputStream(抽象)。
InputStream: int read(byte[] b, int off, int len)
OutputStream: void write(byte[] b, int off, int len)
FileInputSream fis = null; try{ fis = new FileInputStream(""e:/src/from.txt); byte [] buffer = new byte[100]; fis.read(buffer,0,buffer.length); }
- 声明输入流引用。
- 生成代表输入流的对象。
- 生成一个字节类数组。
- 调用输入流对象的read方法,读取数据。
注:buffer得到的都是ASCII值,若要打印出字符,需要
String s = new String(buffer); s = s.trim();//调用String对象的trim()方法,将会去掉这个字符串的首位空格和空字符
2)大文件的读写方法
while(true){ int temp = fis.read(buffer,0,buffer.length); if( temp = -1){//返回值表示读取的数量,为-1表示读取结束; break; }//每次调用read()(或者类似的readLine())读指针都会向后移 }
注:finally里要关闭fis和fos,而且这个语句也是要被包裹在try...catch里的。
3)字符流
FileReader继承自Reader(抽象),FileWriter继承自Writer(抽象)。
区别于字节流,buffer是char类型的数组。
4)节点流和处理流
BufferedReader——字符输入处理流
BufferedReader的初始化需要以FileReader(或其他Reader)为参数,即可以在普通的节点流的基础上添加新的功能。这被称为“装饰者模式”。