Java面向对象有哪些特性?

封装、继承、多态
  • 封装:说明一个类的行为和属性与其他类关系。增加代码的可维护性,便于修改,隐藏了类的内部实现机制。
  • 继承:父类和子类的关系。从已有类派生出新的类,增强代码的复用性。
  • 多态性:继承、重写、父类引用指向子类对象。说明的是类与类的关系。

    为什么这些特性能帮我们写更好的代码?

    • 封装:使代码能够重复使用,增加代码的复用性
    • 继承:也是增加代码的复用性
    • 多态:增强代码的可移植性、鲁棒性

    Show Me The Difference(from Alibaba)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    //以下代码有什么不同?

    //代码1
    final class Accumulator{
    private double result=0.0D;
    public void addAll(double[] values){
    for(double value :values){
    result+=value;
    }
    }
    }

    //代码2
    final class Accumulator2{
    private double result=0.0D;
    public void addAll(double[] values){
    double sum=0.0D;
    for(double value :values){
    sum+=value;
    }
    result+=sum;
    }
    }

代码1会得到很多变量result的中间值,这些都是脏数据,无意义,反而读到了脏数据会产生错误。多线程调用时,会让一个线程读到另外一个线程的中间值。

代码2一次性得到最终值:首先用一个方法的局部变量,把整个值加完之后再一次性赋值给result,这样就不会得到很多中间值。多线程调用时,也会小概率的读到中间值,出现不一致性的概率更小,有可能得到0,因为result+=sum不具备原子性。因此我们在方法完成之前,读不到中间状态的脏数据。

综上,代码2写法更好