Java面经刷题_Day1
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写法更好
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Exiaの格纳库!