[TOC]
封装
隐藏内部实现细节
继承
继承在一定程度上破坏了父类的封装性,此时要合理运用组合
多态
https://www.zhihu.com/question/30082151
面向对象的多态性:https://liuyangjun.blog.csdn.net/article/details/79788326
理解java的三大特性之多态:https://www.cnblogs.com/chenssy/p/3372798.html
什么是多态
事物在运行过程中存在不同的状态。
多态的三个前提
- 继承
- 重写
- 父类引用指向子类对象(向上转型)
多态成员访问的特点
- 成员变量
编译看左边,运行看左边。
- 构造方法
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
- 成员方法
编译看左边,运行看右边。
- 静态方法
编译看左边,运行看左边。 (静态和类相关,算不上重写,所以,访问还是左边的)
多态的优劣
优点:十分灵活,减少多余对象的创建
弊端:不能使用子类特有的属性和方法
例子:
比如你是一个酒神,对酒情有独钟。某日回家发现桌上有几个杯子里面都装了白酒,从外面看我们是不可能知道这是些什么酒,只有喝了之后才能够猜出来是何种酒。你一喝,这是剑南春、再喝这是五粮液、再喝这是酒鬼酒….在这里我们可以描述成如下:
酒 a = 剑南春
酒 b = 五粮液
酒 c = 酒鬼酒
…
这里所表现的的就是多态。剑南春、五粮液、酒鬼酒都是酒的子类,我们只是通过酒这一个父类就能够引用不同的子类,这就是多态——我们只有在运行的时候才会知道引用变量所指向的具体实例对象。
诚然,要理解多态我们就必须要明白什么是“向上转型”。在继承中我们简单介绍了向上转型,这里就在啰嗦下:在上面的喝酒例子中,酒(Win)是父类,剑南春(JNC)、五粮液(WLY)、酒鬼酒(JGJ)是子类。我们定义如下代码:
JNC a = new JNC();
对于这个代码我们非常容易理解无非就是实例化了一个剑南春的对象嘛!但是这样呢?
Wine a = new JNC();
在这里我们这样理解,这里定义了一个Wine 类型的a,它指向JNC对象实例。由于JNC是继承与Wine,所以JNC可以自动向上转型为Wine,所以a是可以指向JNC实例对象的。这样做存在一个非常大的好处,在继承中我们知道子类是父类的扩展,它可以提供比父类更加强大的功能,如果我们定义了一个指向子类的父类引用类型,那么它除了能够引用父类的共性外,还可以使用子类强大的功能。
但是向上转型存在一些缺憾,那就是它必定会导致一些方法和属性的丢失,而导致我们不能够获取它们。所以父类类型的引用可以调用父类中定义的所有属性和方法,对于只存在与子类中的方法和属性它就望尘莫及了。
枚举
https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
枚举的遍历:values()