Java特性

封装、继承、多态、反射、注解

Posted by candy1126xx on February 6, 2017

封装

定义

封装就是将类的信息隐藏在类内部,不允许外部程序直接访问,而是通过该类的方法实现对隐藏信息的操作和访问。

实现

封装实现主要是依赖private、protected、public三个访问修饰符。

继承

定义

继承定义了类与类的从属关系。子类继承了父类所有特性,并可定义更详细的特性。这也决定了类的组织形式是。Java只有单继承,但是可以通过成员内部类间接实现多继承。

内部类

在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。 成员内部类中隐式地持有外部类的引用,因此可以访问外部类的成员变量。 局部内部类、匿名内部类在引用外部变量时,必须将外部变量声明为final。这是Java闭包的手段。所谓闭包,就是把变量和方法包起来,使他们的生命周期一致,防止外部变量被释放后,内部类还在运行,引起错误。它的实现是将外部变量复制一份到内部类中。 静态内部类相当于独立的类,就算外部类没有载入也可访问内部类,内部类不持有外部类的引用,也不能访问外部类的非静态成员。写成内部类只是为了简化包深度,或是起到注释的作用。 内部类是对Java单继承的补充。

单继承

关键字extends。

多继承

public class MainClass {  
    // 成员内部类1 继承自 父类1
    public class Test1 extends Class1 {  

    }  
    // 成员内部类2 继承自 父类2
    public class Test2 extends Class2 {  

    }  
    // 间接实现 从父类1继承showName()
    public String showName() {  
        return new Test1().getName();  
    }  
    // 间接实现 从父类2继承getAge()
    public int showAge() {  
        return new Test2().getAge();  
    }
} 

静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?

可以被继承,但不可被重写。 如果子类有与父类同名的静态方法、属性,叫“隐藏”。 因为静态属性和方法与类相关,在类加载阶段就已经确定了,不是动态绑定,不经过多态选择,声明是谁就是谁的属性和方法。

多态

定义

多态是指表面相同的东西,其实有不同特性。多态分为编译时多态和运行时多态。 编译时多态是静态的,主要是指方法的重载,即在一个类里面,方法名字相同,而参数不同,返回类型可以相同也可以不同。它是根据参数列表的不同来区分不同的方法。 运行时多态是动态的,主要是指方法的重写,即子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。重写使子类可以根据需要,定义特定于自己的行为。

抽象类和接口的区别

  • 抽象类除了不能实例化对象之外,其它功能依然存在。
  • 接口没有构造方法,所有的方法必须是抽象方法,不能包含成员变量,除了staticfinal变量。
  • 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

动态绑定(多态选择)

程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态。当使用多态方式调用方法时,不是“引用变量的类型”决定调用谁的方法,而是“实例对象的类型”决定。 首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去检查子类的同名方法,如果有则调用子类方法,否则调用父类的方法。

反射

定义

在运行状态中,能够知道任意一个类的所有属性和方法,能够调用任意一个对象的任意一个方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

作用

  • 调用一些私有方法,访问一些私有属性,实现黑科技。
  • 实现序列化与反序列化,比如Serializable接口。
  • 实现跨平台兼容,比如JDK中的SocketImpl的实现。
  • 通过xml或注解,实现依赖注入(DI),注解处理,动态代理,单元测试等功能。比如Retrofit、Dagger、ButterKnife。