面向对象是基于万物皆对象这个哲学观点. 所谓的面向对象就是将我们的程序模块化, 对象化,把具体事物的特性属性和通过这些属性来实现一些动作的具体方法放到一个类 里面
面向对象的三大特征 继承,封装,多态
封装:是将一类事物的属性和行为抽象成一个类,一般是使其属性私有化,行为公开化,提高了数据的隐秘性的同时,使代码模块化。这么做的好处是:
• 将变化隔离。
• 便于使用。
• 提高代码复用性。
• 提高安全性。
封装原则:
• 将不需要对外提供的内容都隐藏起来。
• 把属性都隐藏,提供公共方法对其访问
继承:把公共的属性提取出来形成一个公共的类,让其他的类去继承:减少代码的冗余度
特化:在一个父类的基础上拓展子类特有的属性和行为,生成一个新的子类
原则:父类存放共性,子类存放特性
子类可以从父类继承哪些成员:
非私有的字段 和方法 可以被继承到(暂时这样记忆-主要是从是否可以访问的层面考虑)
构造方法不能够被继承:java规定
子类可以继承到父类的特性
继承特点
Java中类的继承只能够是单继承:
可以支持多重继承
每一个类都有一个直接父类:
如果没有看到显示的继承代码,那么就隐式继承就Object
多态
什么是多态
理解:使用aml:编译是看的是Animal类型,运行时看的是实际存放的对象[真实类型]
官方概念:编译时跟运行时类型不一致就产生了多态
民间理解:父类类型的变量,存放子类类型的对象,可能存放子类类型的对象有多种可能
多态存在的前提:必须有继承关系
2.多态的编译时和运行时的过程{重点}
1.编译时,看的是父类类型,会现在父类中,看有不有对应的方法,如果没有继续向上找{更高父类}
如果找到了,编译通过,如果找不到,编译失败报错
2.运行时:看真实类型,如果在真实类型中找到了,就运行真实类型中的函数,如果没有找到,向上找
问题:编译通过了,但是运行可不可能找不到?不可能的,因为编译都已经说明了,上面一定有
如上代码多态的体现的本质:都是父类类型的变量存放子类类型的对象
Dog dog = new XDog();//核心本质
方法参数传递:方法形参父类类型,允许传子类类型对象