Java 基础总结(二)

本文参见:http://www.cnblogs.com/dolphin0520/category/361055.html

1. 字节流与和字符流

    1). 字符流操作时使用了缓冲区,而在关闭字符流时会强制性地将缓冲区中的内容进行输出,但是如果程序没有关闭,则缓冲区中的内容是无法输出的。

    2). 字符流使用了缓冲区,而字节流没有使用缓冲区。

    3). 缓冲区可以简单地理解为一段内存区域。

2. 典型的垃圾收集算法:

    1). Mark-Sweep(标记-清除)算法

    2). Copying(复制)算法

    3). Mark-Compact(标记-整理)算法

    4). Generational Collection(分代收集)算法

    5). 一般来说,大对象会被直接分配到老年代,所谓的大对象是指需要大量连续存储空间的对象,最常见的一种大对象就是大数组,比如:byte[] data = new byte[4*1024*1024] ? 这种一般会

         直接在老年代分配存储空间。

    6). 当然分配的规则并不是百分之百固定的,这要取决于当前使用的是哪种垃圾收集器组合和JVM的相关参数。

    7). 垃圾的确定:

       a. 引用计数法 : 这种方式的特点是实现简单,而且效率较高,但是它无法解决循环引用的问题,因此在Java中并没有采用这种方式(Python采用的是引用计数法)。

         b. 可达性分析法 : 该方法的基本思想是通过一系列的“GC Roots”对象作为起点进行搜索,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达的,不过要注意的是被判定

             为不可达的对象不一定就会成为可回收对象。被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本

             上就真的成为可回收对象了。

          参考:http://www.cnblogs.com/dolphin0520/p/3783345.html

 

3. static :

    1). 方便在没有创建对象的情况下来进行调用(方法/变量)。

    2). static可以用来修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。

    3). Java中的static关键字不会影响到变量或者方法的作用域。在Java中能够影响到访问权限的只有private、public、protected(包括包访问权限)这几个关键字。

    4). static 修饰的方法和变量前面可以同时加权限修饰符。

    5). 静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要访问权限足够)。

    6). static成员变量和static语句块的执行顺序同代码中的顺序一致。


4. 类与继承:

    1). 在生成对象的过程中,会先初始化对象的成员变量,然后再执行构造器。也就是说类中的变量会在任何方法(包括构造器)调用之前得到初始化,即使变量散步于方法定义之间。

    2). 子类是不能够继承父类的构造器,但是要注意的是,如果父类的构造器都是带有参数的,则必须在子类的构造器中显示地通过super关键字调用父类的构造器并配以适当的参数列表。

         如果父类有无参构造器,则在子类的构造器中用super关键字调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器。

    3). 父类的构造器调用以及初始化过程一定在子类的前面。

    4). 隐藏和覆盖是不同的。隐藏是针对成员变量和静态方法的,而覆盖是针对普通方法的。如果:Parent p = new Child() , p.name 结果为父类中的成员变量name的值。

    5). 覆盖只针对非静态方法(终态方法不能被继承,所以就存在覆盖一说了),而隐藏是针对成员变量和静态方法的。这2者之间的区别是:覆盖受RTTI(Runtime type identification)

         约束的,而隐藏却不受该约束。也就是说只有覆盖方法才会进行动态绑定,而隐藏是不会发生动态绑定的。在Java中,除了static方法和final方法,其他所有的方法都是动态绑定。

5. 深入理解Java的接口和抽象类

    1). 抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。

    2). 接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量),而方法会被隐式地指定为public abstract方法且只能是public abstract方法,

         并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。

    3). 抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。

    4). 如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。

6. final :

    1). 当用final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。

    2). 只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的。

    3). 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

    4). 当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。也就是说在用到该final变量的地方,相当于

         直接访问的这个常量,不需要在运行时确定。只有在编译期间能确切知道final变量值的情况下,编译器才会进行这样的优化

原文地址:https://www.cnblogs.com/Jtianlin/p/4605500.html