|
| 1 | +# 面向对象 |
| 2 | + |
| 3 | +## 什么是对象 |
| 4 | + |
| 5 | +对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。 |
| 6 | + |
| 7 | +类的实例化可生成对象,一个对象的生命周期包括三个阶段:生成、使用、消除。 |
| 8 | + |
| 9 | +当不存在对一个对象的引用时,该对象成为一个无用对象。Java的垃圾收集器自动扫描对象的动态内存区,把没有引用的对象作为垃圾收集起来并释放。当系统内存用尽或调用System.gc()要求垃圾回收时,垃圾回收程与系统同步运行。 |
| 10 | + |
| 11 | +## 面向对象的特征 |
| 12 | + |
| 13 | +封装,继承和多态。 |
| 14 | + |
| 15 | +- 封装:面向对象最基础的一个特性,封装性,是指隐藏对象的属性和现实细节,仅对外提供公共访问方式。 |
| 16 | + |
| 17 | +> 封装的原则:将不需要对外提供的内容都隐藏(设置访问修饰符为“private”)起来。把属性都隐藏,仅提供公共方法对其访问,可以在访问方式中加入逻辑判断等语句。 |
| 18 | +
|
| 19 | +- 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。 |
| 20 | + |
| 21 | +- 多态:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。 |
| 22 | + |
| 23 | +> 多态性分为编译时的多态性和运行时的多态性。 |
| 24 | +> |
| 25 | +> 运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事: |
| 26 | +> |
| 27 | +> 1). 方法重写(子类继承父类并重写父类中已有的或抽象的方法) |
| 28 | +> |
| 29 | +> 2). 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。 |
| 30 | +
|
| 31 | +## 什么是类? |
| 32 | + |
| 33 | +类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和方法两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性和方法两个主要部分。 |
| 34 | + |
| 35 | +Java中的类实现包括两个部分:类声明和类体。 |
| 36 | + |
| 37 | +## 多态的好处 |
| 38 | + |
| 39 | +多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。 |
| 40 | + |
| 41 | +主要有以下优点: |
| 42 | + |
| 43 | +- 可替换性:多态对已存在代码具有可替换性. |
| 44 | +- 可扩充性:增加新的子类不影响已经存在的类结构. |
| 45 | +- 接口性:多态是超类通过方法签名,向子类提供一个公共接口,由子类来完善或者重写它来实现的. |
| 46 | +- 灵活性:它在应用中体现了灵活多样的操作,提高了使用效率 |
| 47 | +- 简化性:多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要 |
| 48 | + |
| 49 | +## 代码中如何实现多态 |
| 50 | + |
| 51 | +实现多态主要有以下三种方式: |
| 52 | + |
| 53 | +- 接口实现 |
| 54 | +- 继承父类重写方法 |
| 55 | +- 同一类中进行方法重载 |
| 56 | + |
| 57 | +## 虚拟机是如何实现多态的 |
| 58 | + |
| 59 | +动态绑定技术(dynamic binding),执行期间判断所引用对象的实际类型,根据实际类型调用对应的方法. |
| 60 | + |
| 61 | +## 重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分? |
| 62 | + |
| 63 | +方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。 |
| 64 | + |
| 65 | +- 重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载; |
| 66 | + |
| 67 | +- 重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。 |
| 68 | + |
| 69 | +构造器不能被继承,因此不能被重写,但可以被重载。 |
| 70 | + |
| 71 | +父类的静态方法不能被子类重写。重写只适用于实例方法,不能用于静态方法,而子类当中含有和父类相同签名的静态方法,我们一般称之为隐藏,调用的方法为定义的类所有的静态方法。 |
| 72 | + |
| 73 | +## 接口的意义 |
| 74 | + |
| 75 | +接口的意义用四个词就可以概括:规范,扩展,回调和安全。 |
| 76 | + |
| 77 | +## 抽象类的意义 |
| 78 | + |
| 79 | +抽象类的意义可以用三句话来概括: |
| 80 | + |
| 81 | +- 为其他子类提供一个公共的类型 |
| 82 | +- 封装子类中重复定义的内容 |
| 83 | +- 定义抽象方法,子类虽然有不同的实现,但是定义是一致的 |
| 84 | + |
| 85 | +## 抽象类和接口有什么区别 |
| 86 | + |
| 87 | +抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。 |
0 commit comments