1.Java中transient关键字了解
在看linkedlist的源码时发现许多关键的变量都使用了transient关键字,
如下:
transient int size = 0;
transient Node<E> first;
transient Node<E> last;
如此便引发了思考:为什么要用这个关键字呢?
transient是短暂的意思,用于修饰成员变量,被transient修饰过的成员变量会在序列化时被忽略。
关于序列化的了解通过搜索是这样解释的
序列化
Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输。一般地,当我们使用缓存cache(内存空间不够有可能会本地存储到硬盘)或远程调用rpc(网络传输)的时候,经常需要让实体类实现Serializable接口,目的就是为了让其可序列化。当然,序列化后的最终目的是为了反序列化,恢复成原先的Java对象实例。所以序列化后的字节序列都是可以恢复成Java对象的,这个过程就是反序列化
为什么要用transient呢?
对于一些特殊的数据成员,我们不想用序列化机制来保存它。为了在一个特定对象的一个成员变量上关闭序列化,可以在这个成员变量前加上关键字transient。
注意:static修饰的静态变量天然就是不可序列化的。
2.内部类了解
在写 MyLinkedList过程中,观看Java LinkedList源码用于实例化链表的单元便是Node。如下:
public class Node {//用于实例化链表
Object item;//存储的元素
Node up;//上一个节点
Node next;//下一个节点
public Node(String item, Node up, Node next) {//元素给节点赋值
this.item = item;
this.up = up;
this.next = next;
}
}
其中Node便是一个内部类,内部类的对象依附于外部类对象而存在,可以看做一个变量。
访问方式
方式一:在外部类提供一个方法创建内部类的对象进行访问。
方式二:在其他类直接创建内部类的对象。(直接new出来)
大概使用:
//外部类
class Out{
//内部类
static class Inner{
public void print() {
System.out.println("这个内部类的print方法!");
}
}
//在外部的方法中创建了内部类的对象,然后调用内部 方法。
static public void outin() {
Inner in = new Inner();
in.print();
}
}
//其他类
class Test {
public static void main(String[] args) {
Out.Inner in = new Out.Inner();
in.print();
Out.outin();
}
}
结果: