Java基础系列三

174 阅读4分钟

1.内部类的一个重要运用就是可以实现多重继承(相当于外部类间接实现多重继承),外部类调用内部类相关方法,内部类可以直接对外部类的实例变量进行修改.比如1个类可以有2个内部类,然后这2个内部类分别继承别的类,这样就等于这个类获得了那2个父类的特性

2.序列化 

   1.对象序列化的重大作用是要保存实例的状态,例如玩游戏停电了,对象被序列化时,被该对象引用的实例变量会被序列化,被引用的所有对象也会序列化,只有实现Serializable接口的类才能序列化,被transient标记的实例变量序列化时被忽略,静态变量不会被序列化 

  2.序列化的内容不含有类信息,所以反序列化时如果没有类信息就无法创建实例对象,也就无法恢复数据,会报错。但是RMI(远程调用机制)可以根据URL从远程取回并加载类

  3.上面的例子相当于游戏数据没有到数据库中,停电了内存也没有了 

3.处理文本文件时用缓冲区,BufferedWriter,BufferedReader,减少磁盘读写次数,效率更高。输出流一般都有flush()方法,在进行输出时,比如向某个文件中写入内容,其实是先将输出流写入到缓冲区,当缓冲区写满后才将缓冲区的内容输出到文件中。但是当主机完成输出流的输出后,有可能缓冲区这个时候还没有被填满,这样的话,就会一直等待主机发送内容,这时候,就可以使用flush将缓冲区的内容强制输出到文件中,清空缓冲区 

4.流操作要手动关闭,JVM处理不了,1.7及其以上有AutoCloseable类可以自动关闭 

5.当序列化的时候的serialVersionUID与反序列化的时候的serialVersionUID不一致的时候,会跑出InvalidClassException。 如果没有显式地定义一个serialVersionUID,那么Java会默认根据类信息计算一个serivalVersionUID出来,这样反序列化时如果类有改变,serialVersionUID就对不上了 

6.Socket 

   1.读取服务器信息:BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream())); String str=br.readLine(); 

   2.写入信息(写的时候以字符串为单位): PrintWriter pw=new PrintWriter(socket.getOutputStream()); pw.writer(字符串) 

   3.服务端的socket相当于写了个while死循环,一直执行serverSocket的accept(),实时监控状态,收到请求就建立一个新线程 

7.一个数据包在网络中的漫游:应用层--传输层--网络层--链路层--物理层 

   1.HTTP协议:简单对象访问协议,对应于应用层 ,HTTP协议是基于TCP连接的 

   2.TCP协议: 对应于传输层 IP协议: 对应于网络层 TCP/IP是传输层协议,主要解决数据如何在网络中传输 

   3.socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。 

8. //静态代码块(在成员位置) static{ int a=1000; System.out.println(a); } 

     //构造代码块(在成员位置) { int x=100; System.out.println(x); } 

    //局部代码块(在方法中) {int x=10; System.out.println(x); } 

    静态代码块、构造代码块、构造方法的执行顺序? 

   静态-》构造代码块-》构造方法 

   静态代码块:只执行一次        构造方法:每次调用构造方法都执行 

9.synchronized 

   1.可用于修饰方法,静态方法,局部代码块 synchronized(this)

   { //局部代码块(在方法中) int x=10; System.out.println(x); } 

   2.无论是一个对象多个线程还是每个线程中一个对象,对无锁方法都是没有影响的。对于对象锁和类锁来说,只会对加了锁的方法产生不同的影响 

   3.eg:对象锁 public synchronized void method{} <=>public void method{ synchronized(this){............. } } 

   类锁 public static synchronized void method{} <=>public static void method{ synchronized(类名.class){............. } } 

   4.同一个对象调用同步方法A,则该类其余同步方法连同A都会被锁。当对象M调用方法B施加类锁,与M同类的对象N无法调用B或者M的其它同步静态方法 

   5.死锁会发生是因为两个线程互相持有对方正在等待的东西 

10.对象被调用println(Object object)会调用toString()方法