<类的继承>
class Father{
public Father () { System.out.println("This is the constructor in Father class."); } private void sayHi() { System.out.println("HI"); } public void sayHello() { System.out.println("Hello"); }}class Son extends Father{ public Son() { //super();add automatically System.out.println("This is the constructor in Son class."); }// private void sayHi() { // System.out.println("HI");// }// public void sayHello() { // System.out.println("Hello");// }}子类是无法继承父类的构造方法的。但是会使用super()在子类的构造方法中自动调用父类的构造方法。用来消除重复代码。
对象向上转型中, 一个引用能调用那些成员取决于这个引用的类型,能调用那些方法取决于这个引用指向的对象。子类重写父类方法时不能是比父类更严格的访问权限,不要去继承一个已经完成好的类。
内部类可以使用外部类的成员变量和方法,但是并不意味着内部类继承了外部内,之所以能使用是因为在实例化内部类之前需要先实例化外部类
<String>string字符串的内容无法更改,只是改变了变量的指向,而stringbuffer可以更改<集合>List由ArrayList或者Vector实现,可以放入重复元素;Set接口不能加入重复元素但是可以排序,其子类有Hashset(无序排放)和treeset(有序排放)。iterator迭代输出时不能对list进行操作。map接口有两个子类,hashmap和tablemap,都是无序存放,与允许key重复。Map有两个泛型,一个key,一个value。<static>
用static定义的成员变量可以直接用类名调用。而且,该类的不同对象中的static变量都是同一个。同理静态方法也可以直接用类名调用。但是方法中只能引用静态变量,不能用this关键字 。静态代码块static {},没有名字,在装载类的过程中调用,主要作用是为成员变量赋初始值。
<接口>
定义了接口就是定义了调用对象的标准,接口就是比较纯粹的抽象类,方法全是抽象方法,可以不写abstract,所有方法的权限都是public。
<I/O>
数据的流向是以Java程序为参照物的,即input是读,output是写。
字节流的核心类:InputSream/OutputStream抽象类,所 输入输出的父类,最常用子类是FileInputStream/FileOutputSream。File file = new File(filePath);
StringBuffer content = new StringBuffer();1.Use FileInputStream reading by bytes
try { byte[] temp = new byte[1024]; FileInputStream fileInputStream = new FileInputStream(file); while(fileInputStream.read(temp) != -1){ content.append(new String(temp)); temp = new byte[1024]; } fileInputStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }2.Use inputStreamReader reading by characters
char[] temp = new char[1024];
FileInputStream fileInputStream = new FileInputStream(file); InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream); while(inputStreamReader.read(temp) != -1){ content.append(new String(temp)); temp = new char[1024]; } fileInputStream.close(); inputStreamReader.close();---------------------------------------------------------------------------------------------
public String readLine() throws IOException //读取一行数据装饰者模式:减少继承.//the efficiency of writing methods from high to low is FileWriter,BufferedOutputStream,FileOutputStream
public static void writeFileByFileOutputStream(String filePath, String content) throws IOException{ File file = new File(filePath); //synchronized (file) { FileOutputStream fos = new FileOutputStream(filePath); fos.write(content.getBytes("GBK")); fos.close(); //} } public static void writeFileByBufferedOutputStream(String filePath, String content) throws IOException{ File file = new File(filePath); //synchronized (file) { BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(filePath)); fos.write(content.getBytes("GBK")); fos.flush(); fos.close(); // } } public static void writeFileByFileWriter(String filePath, String content) throws IOException{ File file = new File(filePath); //synchronized (file) { FileWriter fw = new FileWriter(filePath); fw.write(content); fw.close();<多线程>
实现线程的方法一:new()生成线程对象,start()启动线程,进入就绪状态,与主线程抢占CPU,如果抢到了CPU就进入执行状态,如果之后CPU又被抢走就在回到就绪状态,直到run()的内容执行完毕,线程死亡。
MyThread thread1 = new MyThread();
Thread thread = new Thread(thread1); thread.start();class MyThread extends Thread{
public void run() { //the name must be run for (int i = 1; i < 10; i++) { System.out.println("Thread 1: "+ i ); } } }实现线程的方法二(实际开发常用,将线程体和执行线程分开):
在初始化Thread类或者其子类的线程对象时,把实现接口Runnable的类的对象传给线程的实例。再使用start()
class MyThread implements Runnable {
public void run() { for (int i = 1; i < 10; i++) { System.out.println("Thread 1: "+ i ); } }}线程的控制方法:
Thread,sleep(毫秒)休眠让出CPU,时间到了后进入就绪状态,不是立即运行;类外需要抛出异常Thread.yield()当前线程让出CPU,但是还会去抢优先级设置方法get/setPriority(),线程的优先级最大是10最小是1,优先级越大执行的概率越大 但不代表会先执行。