Java SE Lesson 13
1. 内部类(Inner Class),内部类共分为4种。
2. 静态内部类(static inner class):只能访问外部类的静态成员变量与静态方法,生成
静态内部类对象的方式为:
OuterClass.InnerClass inner = newOuterClass.InnerClass();
3. 成员内部类(member inner class):可以访问外部类的静态与非静态的方法与成员变
量。生成成员内部类对象的方式为:
OuterClass.InnerClass inner = newOuterClass().new InnerClass();
4. 若想在局部内部类中访问外部类的成员变量,语法为:OuterClass.this.a;
5. 局部内部类(LocalInner Class):定义在方法当中,只能访问方法中声明的final类型
的变量。
6. 匿名内部类(AnonymousInner Class):匿名内部类会隐式地继承一个父类或实现一个接口。
Object 类中的 equals() 方法比较的是内存地址,而不是内容,需重写 hashCode() 方法和equals() 方法。
匿名内部类:
Local inner classes which don’t have classnames
No key word class
No key word extends and implements
No constructors
Implicitly extend asuperclass or implement an interface 隐戔继承类或实现了接口
Java I/O 系统:
–理解Java I/O系统
–熟练使用java.io包中的相关类与接口进行I/O编程
–掌握Java I/O的设计原则与使用的设计模式
File: creatNewFile( ) mkdir ( ) 只能创建一级目录,mkdirs ( ) 创建多级目录。
• 目录管理
–目录操作的主要方法为:
–publicboolean mkdir() 根据抽象路径名创建目录。
–publicString[] list() 返回抽象路径名表示路径中的文件名和目录名。
• File类中的常用方法
String getName()
String getPath()
String getAbsolutePath()
String getParent()
boolean renameTo( File newName)
long length()
boolean delete()
boolean mkdir()
String[] list()
–booleanexists()
–booleancanWrite()
–booleancanRead()
–booleanisFile()
–booleanisDirectory()
• 从流结构上可分为字节流(以字节为处理单位或称面向字节)和字符流(以字符为处理单位或称面向字符)。
字节流:InputStream OutputStream 都是抽象类 abstract
字符流: Reader Writer 都是抽象类 abstract
在最底层,所有的输入/输出都是字节形式的。基于字符的流只为处理字符提供方便有效的方法
与目标关联的一定是节点流,过滤流是将节点流进行包装。
集合与数组的相互转化:
集合转数组 :ArrayList alist = new ArrayList() ; alist.toArray( )
数组转集合 :Arrays.asList( ) 是一个静态方法。
InputStream :
abstractint read():读取一个字节数据,并返回读到的数据,如果返回-1,表示读到了输入流的末尾。它需要 InputStream的子类来实现。
节点流:
过滤流:
节点流 过滤流
FilterInputStream 是一个节点流,不会直接使用,会使用它的子类BufferedInputStream ――过滤流。
OutputStream :
节点流 过滤流
String 和 byte [ ] 的相互转化 :
String str = “helloworld”;
byte [ ] buffer = str.getBytes( );
String str = new String ( byte [ ], 0, length);
过滤流:
• 过滤流的主要特点是在输入输出数据的同时能对所传输的数据做指定类型或格式的转换,即可实现对二进制字节数据的理解和编码转换。
装饰模式:
• 装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案
• 装饰模式可以在不创造更多子类的情况下,将对象的功能加以扩展。
• 装饰模式把客户端的调用委派到被装饰类。装饰模式的关键在于这种扩展完全是透明的。
Reader类:
Writer类:
• Java程序语言使用Unicode来表示字符串和字符, Unicode使用两个字节来表示一个字符,即一个字符占16位 。
循环结束条件:
While ( null != newBufferedReader( ) .readLine( ) )
While ( -1 != newBufferedInputStream( ).read( ) )
Class System
public final class System
System.in System.out
FileWriter FileReader 分别继承于 OutputStremWriter InputStreamReader
RandomAccessFile类:
All Implemented Interfaces:
Closeable, DataInput, DataOutput
这个类能 write( ) 和 read() , 能操作基本数据类型。
序列化:
• 将对象转换为字节流保存起来,并在以后还原这个对象,这种机制叫做对象序列化。
• 将一个对象保存到永久存储设备上称为持久化。
• 一个对象要想能够实现序列化,必须实现Serializable接口或Externalizable接口。
1. 一个类若想被序列化,则需要实现java.io.Serializable 接口,该接口中没有定义任何方法,是一个标识性接口(Marker Interface),当一个类实现了该接口,就表示这个类的对象是可以序列化的。
• 序列化(serialization)是把一个对象的状态写入一个字节流的过程。当你想要把你的程序状态存到一个固定的存储区域例如文件时,它是很管用的。稍后一点时间,你就可以运用序列化过程存储这些对象
• 当一个对象被序列化时,只保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量。
2. 在序列化时,static变量是无法序列化的;如果A包含了对B的引用,那么在序列化A的时候也会将B一并地序列化;如果此时A可以序列化,B无法序列化,那么当序列化A的时候就会发生异常,这时就需要将对B的引用设为transient,该关键字表示变量不会被序列化。
–声明成transient的变量不被序列化工具存储(序列化时绕过)。同样,static变量也不被存储
–反序列化时不会调用对象的任何构造方法,仅仅根据所保存的对象状态信息,在内存中重新构建对象
• 在序列化和反序列化进程中需要特殊处理的Serializable 类应该实现以下方法:
• private voidwriteObject(java.io.ObjectOutputStream stream)
throws IOException;
• private voidreadObject(java.io.ObjectInputStream stream)
throwsIOException, ClassNotFoundException;
这两个方法不属于任何一个类和任何一个接口,是非常特殊的方法.
当我们在一个待序列化/反序列化的类中实现了以上两个private方法(方法声明要与上面的保持完全的一致),那么就允许我们以更加底层、更加细粒度的方式控制序列化/反序列化的过程。
Java SE Lesson 14
多线程:
说明:
线程是程序内的顺序控制流,只能使用分配给程序的资源和环境。
• 多个进程的内部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源,有可能互相影响.
• 线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。
• 当程序启动运行时,就自动产生一个线程,主方法main就在这个主线程上运行
• 一个程序实现多个代码同时交替运行就需要产生多个线程
线程的的实现:
1. 继承Thread类并重写run方法。
• Thread类:是专门用来创建线程和对线程进行操作的类。Thread中定义了许多方法对线程进行操作。
• Thread类在缺省情况下run方法什么都不做。可以通过继承Thread类并重写Thread类的run方法实现用户线程。
7. 将我们希望线程执行的代码放到run方法中,然后通过start方法来启动线程,start方法首先为线程的执行准备好系统资源,然后再去调用run方法。当某个类继承了Thread类之后,该类就叫做一个线程类。
8. 一个进程至少要包含一个线程。
线程的实现 2:
实现Runnable接口的类实现run方法。通过建立一个实现了Runnable接口的类,并以它作为线程的目标对象来创建一个线程。
Runnable接口:定义了一个抽象方法run()。定义如下:
public interface java.lang.Runnable
{
public abstract void run();
}
总结:
1. 两种方法均需执行线程的start方法为线程分配必须的系统资源、调度线程运行并执行线程的run方法。
3. 线程的消亡不能通过调用一个stop()命令。而是让run()方法自然结束。