面向过程 & 面向对象

  • 面向过程:面向过程的编程思想中,过程/方法是程序的核心和主体,例如把大象放进冰箱里,程序的主体就是 打开冰箱/放进大象/关上冰箱 三个方法,大象、冰箱都是方法种的一个参数。
  • 面向对象:面向对象的编程思想中,对象是程序的核心和主体,把大象放进冰箱,我们需要冰箱类,冰箱类的属性可以有品牌、容量等,并且需要实例化一个冰箱,同时需要大象类,大象的属性可以有性别、年龄、体重等,在执行程序时,我们通过调用冰箱的 打开冰箱门/放入物品/关上冰箱门来执行程序,也就是说程序执行过程中的所有数据和方法,都是对象的属性和动作。

面向过程适合抽象的数值计算,与具体的事物无关;面向对象适合涉及到具体事物的程序,将事物的属性与动作封装为类,再通过为属性赋值获取具体的实例对象,从而提高代码的复用、扩展,也能更好的体现对象间的关系。

封装

将对象的属性与对这些属性的操作进行隐藏,对外仅提供一些基本的方法,以此对对象的属性进行精确的控制,防止外部随意修改,并且通过封装方法,提高代码的复用性,降低耦合。

继承

子类通过继承父类,可以获得父类所有成员,子类通过对父类成员的继承或是重写,来提高代码的复用,通过抽取相似类的共同属性与方法,成为一个共同的父类,从而提高代码的复用。

多态

多态的前提是子类继承父类,使用父类的引用指向子类的实例时就是多态,在编译时,调用父类引用的方法的指令是 invokevirtual,表示虚方法的调用,在运行时会根据实例对象的 vtable 虚方法表,查找到真正执行的方法的具体地址进行调用,vtable 在类加载的链接阶段就根据方法的重写规则生成好了。

强制类型转换 & 泛型

  • 强制转型Object a = new Integer(10); Integer b = (Integer) a; 即子类引用指向父类引用时,就需要进行强制转型。
  • 泛型:相对于强制转型,使用泛型更加优雅,并且假设 Object a = new Object(); Integer b = (Integer) a; 则会抛出运行时异常 ClassCast,而使用泛型,会在编译期进行检测。
  • 泛型擦除:Java 的泛型是伪泛型,在编译时,会进行泛型擦除,默认会将对象的类型变为 Object来处理,在执行例如 int a = list.get(i) 时,会由编译器自行完成强制类型转换。
/**
 * 泛型擦除
 */
public static void main(String[] args) {
        List<Integer> integerList = new ArrayList<>();
        integerList.add(10);
        int num = integerList.get(0); // 自动进行类型转换Integer—>int
        System.out.println(num); // 输出: 10
 }

抽象类 & 接口

  • 抽象类用来定义有共同属性和行为的类的模板,侧重于抽象类的类型,表示类的特征;
  • 接口用来定义要具备某个功能所需要实现的方法,侧重于抽象类的功能,表示类能做什么。

本文文档

© 版权声明
评论 抢沙发

请登录后发表评论

    暂无评论内容