天天看点

JAVA的一些常识(绑定,多态,反射,RTTI)

多态

何为多态?嗯就是多种状态,如果前面要加上代词的话,我想应该是对象。java多态可以分为三种,即重写多态、重载多态、泛型多态(通常意义上的多态指的是重写多态)。

重写多态:子类可以将父类的任意虚方法根据需要进行重写,同样的声明多种实现,一个很简单的例子:

/**
 * Created by Lee Y on 2016/3/28.
 */
public class Polymorphic {
    public static void main(String[] args) {
        A a = new A();
        A b = new B();
        A c = new C();
        a.f();
        b.f();
        c.f();
        B b1 = new B();
        v(b1);
    }
    public static void v(A a){
        a.f();
    }
}

class A{
    void f(){
        System.out.println("this is A");
    }
    final void d(){

    }
}
class B extends A{
    void f(){
        System.out.println("this is B");
    }
}
class C extends A{
    void f(){
        System.out.println("this is C");
    }
}

/*
output:
this is A
this is B
this is C
this is B
 */
           

上述代码是多态与动态绑定非常简单的一个展示,子类B和C重写了父类的f方法,同时声明三个A类的引用,分别NEW成ABC的实例,同时调用f方法,结果显而易见是正确的。可能这个简单的例子体现的不是那么明显,那么请看v方法,v方法的参数是一个A类的引用,我将B类的一个对象引用b1传进去(请先区分好对象的引用和对象的实例都是什么),这表面看上去有点像强转,可是结果却是程序正确的调用了B类里的f方法,而不是A类中的f方法,所以这不是强转,而是多态,多态的好处是非常显而易见的。

重载多态:即在同样的命名空间内,可以定义多个同名方法,但要求参数列表的长度或参数类型不同,jvm会根据参数列表和参数类型动态的选择调用的方法。

泛型多态:java泛型单开一章来写,因为比较有意思。

绑定

这里指的前期绑定(静态绑定)和后期绑定(动态绑定),这里先不讨论java对动态绑定是如何实现的,只说它的作用。

静态绑定:指程序在编译期就确定对象调用的方法的过程。

动态绑定:指程序在运行期间临时确定对象所调用的方法的过程,上面的代码就是动态绑定的简单例子。

RTTI

与反射区别,RTTI指程序运行期间的类型检查,jvm在运行时只在必要的时候进行RTTI,因为它的效率并不比多态好,所以请尽量使用多态而不是RTTI。

具体在什么条件下会进行RTTI,我还很模糊,容我过几天再写=。=

反射

java最屌的功能,没有之一,就是反射,java的反射允许你在运行期间对一个完全未知的类进行任何操作(通过类名),包括所有私有成员,甚至是匿名内部类,当然使用反射的前提是,必须得到这个类class文件。