java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE, JavaME, JavaSE)的总称。本站提供基于Java框架struts,spring,hibernate等的桌面应用、web交互及移动终端的开发技巧与资料

保持永久学习的心态,将成就一个优秀的你,来 继续搞起java知识。

目录
第八章 多态
第十四章 类型信息
第十二章 通过异常处理错误
第十三章 字符串

第八章 多态

1. 前期绑定 & 后期绑定
绑定是指将方法调用同一个方法主体关联起来的这么一个过程。如果在程序执行前进行绑定,就称为前期绑定。(C中所有的方法调用都是前期绑定)
后期绑定就是指在运行时根据对象的类型进行绑定。后期绑定也叫动态绑定/运行时绑定。
一种语言要想实现后期绑定,就必须具有某种机制,以便于在运行时能判断对象的类型,从而调用恰当的方法。不同的语言有不同的实现机制,不管怎么样都必须在对象中安置某种类型信息。(比如在C++中是通过在对象中安插一个指向虚函数表的指针来保存该对象的类型信息)。由此可见,运行时类型信息很重要!那java中是如何实现在运行时来获取对象的类型信息的呢?
java中除了static方法和final方法(private方法属于final方法)之外,其他所有的方法都是后期绑定的。声明为final的方法会告诉编译器“关闭”动态绑定。
2. 不会产生多态的情况
(1)子类覆盖父类的private方法
(2)访问字段(用一个指向子类的父类引用访问字段是不会产生多态的),并且这个访问是在编译时解析。
(3)静态方法
3. 如果覆盖了父类的方法,特指资源清理类方法,记得先释放子类部分的资源,然后super调用父类的方法以释放对象的父类部分资源。
4. RTTI
在运行期间对类型进行检查的行为称作运行时类型识别

第十四章 类型信息

运行时类型信息使得我们可以在运行时发现和使用类型信息。
1. java是如何让我们在运行时识别对象和类的信息的呢?
两种方式:
(1)传统的RTTI:它假定我们在编译时已经知道了所有的类型。(也就是说:在编译的时候就知道在某个类继承体系中有哪些类型了。)
(2)反射机制:它允许我们在运行时发现和使用类的信息。
2. class对象
要理解RTTI在java中的工作原理,首先必须知道类型信息在运行时是如何表示的。这项工作是由称为class对象的特殊对象完成的,它包含了与该类有关的信息。
[个人理解:编程语言中的所谓对象,无非就是内存中的一块区域,那么class对象就是这样的一块内存,它里面保存的是类相关的信息。]
类是程序的一部分,每个类都有一个class对象。
[个人理解:一个类有哪些方法,有哪些域,所有的这些信息都应该保存在内存中的一个区域,每个类在内存中都应该有这样的一块区域来保存这样的信息,而每一个这样的一块区域被称为class对象。]
3. java特有的动态加载
java中所有的类都是在对其第一次使用时,动态加载到JVM中的。所谓动态加载是指:java程序在它开始运行之前并非被完全加载,其各个部分是指在必需时才加载的。这一点与许多传统语言都不同。C++是静态加载语言。
4. 为什么要先有class对象?
class对象保存了对象的类型信息,如果没有class对象,就不知道对象应该占据多大的内存,在new对象的时候就不知道该分配多大的空间。所以在创建对象实例之前JVM一定会保证已经加载了对应的类。一旦一个类的class对象在内存中被创建好了,它就被用来创建这个类的所有对象。
5. 获取某个类A的class对象的引用
(1)public static Class forName(String name) throws ClassNotFoundException
返回与带有给定字符串名的类或接口相关联的 Class 对象。
这种方式适用于没有对象实例的情况。
(2)调用A对象实例的getClass()方法
这种方式适用于有对象实例的情况。
(3)类字面常量 "A.class"
这种方式简单、安全,在编译时就会受到检查。
6. 为了使用一个类而做的准备(类的加载过程):
(1)加载:在内存中创建一个class对象。
(2)链接:验证字节码、为静态域分配存储空间、解析对其他类的所有引用
(3)初始化:初始化静态域的存储空间
7. 在java中哪些情况下需要RTTI呢?
(1)传统的类型转换:由RTTI确保类型转换的正确性,若执行了一个错误的类型转换,会抛出ClassCastException异常。
(2)查询Class对象相关的操作。
(3)instanceof:用法是 ”对象 instanceof 类型“ ,可以使用Class类的实例方法boolean isInstance(Object obj)判定指定的 Object 是否与此 Class 所表示的对象赋值兼容。此方法是 Java 语言 instanceof 运算符的动态等效方法。即对于类A来说,下面的两个if语句等效:

originating the exception in f()
Inside g(),e.printStackTrace()
java.lang.Exception: thrown from f()
    at Rethrowing.f(Rethrowing.java:7)
    at Rethrowing.g(Rethrowing.java:11)
    at Rethrowing.main(Rethrowing.java:29)
main: printStackTrace()
java.lang.Exception: thrown from f()
    at Rethrowing.f(Rethrowing.java:7)
    at Rethrowing.g(Rethrowing.java:11)
    at Rethrowing.main(Rethrowing.java:29)
originating the exception in f()
Inside h(),e.printStackTrace()
java.lang.Exception: thrown from f()
    at Rethrowing.f(Rethrowing.java:7)
    at Rethrowing.h(Rethrowing.java:20)
    at Rethrowing.main(Rethrowing.java:35)
main: printStackTrace()
java.lang.Exception: thrown from f()
    at Rethrowing.h(Rethrowing.java:24)
    at Rethrowing.main(Rethrowing.java:35)

View Code
5. 异常链
有时需要捕获一个异常后抛出另一个异常,并且希望将原始异常的信息保存下来,这被称为异常链。
(1)从JDK1.4后,Throwable的子类在构造器中可以接受一个case参数,Throwable(Throwable cause),这个参数用来表示原始异常。这样即使在当前位置创建并抛出了新的异常,也能通过这个异常链追踪到异常最初发生的位置。
(2)只有三种基本的异常类提供了待cause参数的构造器(Exception,Error,RuntimeException)。若要把其他类型异常链接其他,应该用Throwable的initCause(Throwable cause)方法而不是构造器。
Throwable 内部有一个字段:private Throwable cause = this; //用于指示该Throwable 是否是由其他Throwable导致抛出的。
上述(1),(2)两种方式无外乎是设置该字段的值而已。
6. RuntimeException
RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明。这被称为UnChecked异常。
RuntimeException代表的是编程错误。

第十三章 字符串

1. 不可变String
String对象是不可变的。String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象。
2. StringBuilder 和 StringBuffer
StringBuilder 是javase5引入的,之前是StringBuffer,StringBuffer是线程安全的。
3. System.out.format类似于C语言中的printf,还有一个格式化类java.util.Formatter专门负责格式化。

因为水平有限,难免有疏忽或者不准确的地方,希望大家能够直接指出来,我会及时改正。一切为了知识的分享。

后续会有更多的精彩的内容分享给大家。