《Java编程思想第四版》中在算法题中常用的概念总结(持续更新)

总结今年前期在《Java编程思想第四版》中常见的几个问题:

1.OOP相关概念

  • 向上转型(upcasting)
    书中那句“新类是现有类的一种类型”的概括很到位,也直接解释了继承的关系。Java编译器支持向上转型,是指子类引用转换成父类引用这一动作,可以理解为继承的实现方式。
    先用小例子感受一下upcasting:
//父类:乐器
public class Instruments {
    public void play(Note n){
        System.out.println("Instruments.play——"+n);
    }
}
//子类:钢琴
public class Piano extends Instruments{
    public void play(Note n){
        System.out.println("Piano.play——"+n);
    }
}
//执行类
public class Music {
    public static void tune(Instruments i){
        i.play(Note.A_SHARP);
    }
    public static void main(String[] args) {
       Instruments p = new Piano();
       tune(p);
    }
}
//枚举音阶
public enum Note {
    MIDDLE_C,E_FLAT,A_SHARP;
}

执行结果:在Music类中,子类piano的引用传递到以其父类Instrument对象引用为入参的方法tune()中,不报错且会执行子类自己的方法
《Java编程思想第四版》中在算法题中常用的概念总结(持续更新)_第1张图片

  • 多态(书中整个第八章都在描述)
    书中认为,多态的作用是:消除类型之间的耦合。它的实现依靠“动态绑定”
    在这里解释一下动态绑定:非面向对象编程(如C)在编译时会产生对一个具体函数名的调用,运行时就将这个调用解析到绝对地址。也就是编译器前期绑定了代码地址。然而在OOP中,当对象发送消息时,被调用的代码(即代码地址)到运行时才能确定。编译器只是确认方法存在,但不知道被执行的确切代码。这种形式称为动态绑定。C++中需要给方法加“virtual”关键字保证动态绑定。
    只要用到集合的算法题,都可以用多态来写出优美(具有封装性)的代码,比如:
          Map<Character,Integer> map = new HashMap<>();//hashmap引用转型为map

其实在实际工作中,多态的优点才更容易体现:如果你决定更换实现类型的时候,所要做的就只是改变构造器中类的名称。
比如把HashMap改成TreeMap的时候,其它部分的代码基本不需要改变。

2.操作符相关知识

  • 移位操作符
    移位操作的对象都是二进制的“位”,只用来处理整数类型。
    直观的理解就是“>>”为“ /2 ”,“<<”为“ *2 ”。和c/c++不同的是Java还增加了一种“无符号”右移位操作符“>>>”
    相应的算法题有leetcode50.Pow(x, n),解答如下:
class Solution {
   public double myPow(double x, int n) {
        long N = n;
        if(N == 0) return 1;
        if(N < 0) { x = 1/x; N = -N;}
        double res = 1;
        while(N>0){
            if((N&1)>0) res = res*x;
            N>>=1;  
            x *= x;
        }
        return res;
    }
}

你可能感兴趣的:(Java特性的日常get,计算机基础知识)