主要针对面向对象的三大特性,类与类的六种关系以及面向对象的七大原则进行一些总结和介绍。
面向对象的三大特性
封装(Encapsulation)
不需要知道对象具体实现细节,通过共有方法暴露对象的功能。
继承(Inheritance)
使用已经存在的类作为基础类(父类),在此基础上建立新类(子类),子类既可以复用父类的功能,也能进行扩展,从而提高了代码的复用。另外,Java不像C++一样可以同时继承多个父类,只能够树形的继承,比如:Animal -> Person -> Man,或者通过 接口和内部类 实现多继承!
多态(Polymorphism)
一个类实例的相同方法在不同情形下有不同的表现形式,一般有两种
编译时多态(OverLoading) —— 方法重载
注释:如果学习过C++的朋友,这点很简单的可以看到实际的例子,
比如模板方法的实现,编译之后,会发现有很多具体方法的实现。
运行时多态(OverRidding) —— 继承 + 方法重写 + 父类引用指向子类对象
在java中也就是我们常说的,父类指针指向子类对象,此处就不进行代码例程的演示了。
类与类的关系
记忆口诀:鸡湿衣冠剧组(继承,实现,依赖,关联,聚合,组合)
前面两个继承和实现基本都知道,而后面的四个只是 语义层次 的区别,
两个类的相关程度,依赖 < 关联 < 聚合 < 组合
在此之前,相信很多朋友都没接触过UML类图,可能会看不懂,这个是类和接口
1.继承/泛化(Generalization)
一个是父类,一个是子类,用 空心三角箭头的实线 表示从子类指向父类,或子接口指向父接口。
UML图如下所示:
2.实现(Realization)
一个类实现接口,重写相关方法,用 空心三角箭头的虚线 表示
UML图如下所示:
3.依赖(Dependency)
简单来讲,就是在一个类的方法相关的参数等位置,用到了另外一个类的实例。
具体表现:局部变量、函数参数、返回值等
代码如下所示:
package classReference;
/**
* 类和类之间的关系之依赖关系
* @Package classReference
* @Title: DependencyDemo.java
* @Company: $
* @author BurgessLee
* @date 2018年10月9日-上午10:44:17
* @Description: $
*/
public class DependencyDemo {
public static void main(String[] args) {
C c = new C();
c.method();
}
}
class B {
public void test(){
System.out.println("B.....");
}
}
class C{
public void test(){
System.out.println("C....");
}
public void method(){
B b = new B();
b.test();
}
}
UML示意图如下:
4.关联(Association)
一个类的成员变量引用到了另外一个类
示例代码如下:
package classReference;
/**
* 类和类之间的关系之关联
* @Package classReference
* @Title: ReferenceDemo.java
* @Company: $
* @author BurgessLee
* @date 2018年10月9日-上午10:52:10
* @Description: $
*/
public class ReferenceDemo {
public static void main(String[] args) {
C1 c = new C1();
c.method();
}
}
class B1{
public String str = "我是b";
}
class C1{
private B1 b = new B1();
public void method(){
System.out.println(b.str);
}
}
UML图(实心箭头的实线表示,箭头指向被关联类,另外这个可以双向,一对多或多对多):
5.聚合(Aggregation)
和关联一样是通过成员变量来表现的,不过关联是处于同一层次的,而聚合则 是 整体和局部 层次的,比如:社团 和 小弟,另外即使没有了社团, 小弟们依旧可以到别的地方搞事情。用 空心菱形加实线箭头 表示。
6.组合(Composition)
和聚合类似,只是程度更加强烈,共生死,组合类负责被组合类的生命周期,比如: 社团 和 大佬,如果没了社团,大佬也就就不能存在了。 用 实心菱形加实线箭头表示 表示。
此处引用原来的图示: