1.面向对象的三大特征
(1)封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式。
(2)继承:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
通过继承创建的新类称为“子类”或“派生类”。
被继承的类称为“基类”、“父类”或“超类”。
继承的过程,就是从一般到特殊的过程。
要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。
在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。
优点:1.提高代码的复用性2.让类与类之间产生关系,给多态提供前提。
缺点:打破了封装性。
单继承:一个子类只能有一个直接父类
多继承:一个子类可以有多个直接父类。但是java中不允许出现,会出现不确定性,因为多个父类可能有相同成员。
在Java中可以用多实现来解决问题(实现多个接口),或者多层继承。
注意:当本类中的成员和局部变量同名用this区分
当子类与父类成员变量同名用super区分。this代表一个本类对象引用,super代表一个父类空间。
当子类与父类出现一模一样的成员函数,会运行子类的函数,这种现象称为覆盖操作。
覆盖注意事项:子类覆盖父类方法时,子类权限必须大于父类权限。 静态只能覆盖静态。
什么时候执行覆盖操作? 当对一个子类进行扩展时,子类需要保留父类的功能声明,但又要定义子类中该功能的特有内容时,就要使用覆盖操作来完成。
为什么子类实例化的时候要访问父类的构造函数? 子类继承了父类,获取了父类的属性,所以在使用父类内容前要先看父类是 如何对自己内容初始化的。
(3)多态:指允许不同类的对象对同一消息作出响应。即同一消息可以根据发送对象的不同而采取多种不同的行为方式。(消息指的就是函数调用)
前提:继承,重写,父类只想子类对象。
作用:消除类型之间的耦合关系。
优点:提高扩展性,后期可维护性。
Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载。
在java中,多态大致可以分为以下几种情况:
1)person为父类,student为子类。那么:person p=new student();
2)fliable为接口,bird为实现接口的类,那么:fliable f=new bird();
3)fliable为抽象类,bird为继承fliable的类,那么:fliablef=new bird();
多态时需要说明p声明为父类的引用,但他实际为子类引用。但是他只能调用父类中的方法。如果子类中的方法覆盖了父类方法,那么将调用父类方法(虚方法调用)。接口多态也是同样的,也许你会问,如果f要调用自己的方法,那岂不是出错了?其实这里也是方法的覆盖,因为实现接口的子类肯定会实现接口中的方法, 所以此种情况下调用的是bird中的方法。但是如果bird有一个方法在接口中没有定义,那么f不能调用。
那么如果我声明了person p=new student();我想将p转为student的可不可以?当然可以,但是就得强制转换了(儿子想成为父亲直接来,父亲想成为儿子你就强来)。也称为向下转型。通常用instanceof判断对象的具体类型。
如:if(p instanceof student) { student s=(student)p;}