面向对象 VS 面向过程
- 面向对象:把整个需求按照特点、功能划分,将这些存在共性的部分封装成对象
- 创建了对象不是为了完成某一个步骤,而是描述某个事物在解决问题的步骤中的行为
- 面向过程:分析出实现需求所需要的步骤,通过函数一步一步实现这些步骤,接着依次调用即可
- 优点:性能上它是优于面向对象的,因为类在调用的时候需要实例化,开销过大
- 缺点:不易维护、复用、扩展
- 用途:单片机、嵌入式开发、Linux/Unix等对性能要求较高的地方
三大特性
抽象、封装、继承是多态的基础,多态是抽象、封装、继承的表现
封装
- 理解:利用抽象数据类型将数据和基于数据的操作进行封装,将属性私有化,隐藏内部细节,只提供一些对外的接口与外界联系
- 主要作用
- 对外隐藏内部实现细节,增强程序的安全性
- 良好的封装有利于减少耦合
- 类的内部结构可自由修改,对成员进行更精确的控制
继承
-
理解:使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类
-
描述的是 is-a 的关系
- 如果有两个对象A和B,若可以描述为“A是B”,则可以表示A继承B
- 其中B是被继承者称之为父类或者超类,A是继承者称之为子类或者派生类
-
记住
- 子类拥有父类非private的属性和方法
- 子类可以拥有自己属性和方法,即子类可以对父类进行扩展
- 子类可以用自己的方式实现父类的方法
-
构造器
- 对于构造器而言,只能够被调用,而不能被继承
- 编译器会默认给子类调用父类的构造器(前提:父类有默认构造器)
- 如果没有默认的父类构造器,子类必须要显示的指定父类的构造器,而且必须是在子类构造器中做的第一件事(第一行代码)
public class Husband extends Person{ private Wife wife; Husband(){ super("chenssy"); System.out.println("Husband Constructor..."); } public static void main(String[] args) { Husband husband = new Husband(); } }
- 对于构造器而言,只能够被调用,而不能被继承
-
protected关键字
-
向上转型: 将子类转换成父类
- 好处
- 提高了代码的复用性和维护性
- 让类与类之间产生了关系,是多态的前提
- 弊端
- 类的耦合性增强了,不符合高内聚低耦合的设计目标
多态
Collection books = new HashSet();
- 理解:程序中定义的引用变量所指向的具体类型和通过该类型发出的方法调用在编程时不确定,而是在程序运行期间才确定,这样可以使得引用变量动态地绑定到不同的类实现上
必要条件和前提
1.继承 2.重写 3.向上转型
转型
- 向上转型: Person p = new Man() ; //向上转型不需要强制类型转化
- 向下转型: Man man = (Man)new Person() ; //必须强制类型转化
编译时多态 运行时多态
- 编译时多态,即方法的重载,从JVM的角度来讲,这是一种静态分派(static dispatch)
- 运行时多态,即方法的重写,从JVM的角度来讲,这是一种动态分派(dynamic dispatch)
编译看左边,运行看右边
java问题(多态中编译看左边,运行看右边)
java中的多态和继承—“编译看左边,运行看右边”(多态执行)
- 成员变量,静态方法看左边;非静态方法:编译看左边,运行看右边
public class Test {
public static void main(String[] args) {
Parent p = new Child();
System.out.println(p.name + "\t" + p.address);
p.sayName();
}
}
class Parent {
public String name = "father";
public static String address = "JiangXi";
public void sayName() {
System.out.println(name + "\t" + address);
}
}
class Child extends Parent {
public String name = "son";
public static String address = "ZheJiang";
public void sayName() {
System.out.println(name + "\t" + address);
}
}
father JiangXi
son ZheJiang
泛型
- 泛型实现了参数化类型的概念,使代码可以应用于多种类型
- 引入泛型的本质是为了安全,把编译时能发现的错误不带到运行时
List<T> list = new Arraylist<T>
sum
- 多态
- 是在继承层面上:根据实际运行时候来确定具体的实现
- 编译时多态和运行时多态
- 泛型
- 使用这个泛型类时候再去确定这个类里面的成员具体什么类型
- 编译时多态
五大基本原则
solid
- 单一职责原则(SRP) :一个类,最好只做一件事,只有一个引起它的变化(低耦合 高内聚)
- 每个类的职责应该单一,不要再一个类中引入过多的接口
- 开放封闭原则(OCP) :软件实体应该是可扩展的,而不可修改的
- 对扩展 【继承、组合等方式】 开放,对修改封闭的
- 里氏替换原则(LSP) :子类必须能够替换其基类
- 接口隔离原则(ISP):使用多个小的专门的接口,而不要使用一个大的总接口
- 依赖倒置原则(DIP) :高层模块不依赖底层模块,二者都同依赖于抽象;抽象不依赖具体,具体依赖抽象