面向对象——OOP(二)(封装、继承、多态、抽象、接口)

面向对象三大特征之一: 封装:Encapsulation,封装和隐藏
●  缘由 :使用者对定义的属性(成员变量)直接操作会导致数据的错误、混乱或安全性问题
●  办法 :隐藏不需要对外提供的实现细节,使用者只能通过事先定制好的方法来访问
●  实现 :将属性声明为私有的,再提供公共的方法实现对该属性的操作

注意:好处:可以方便地加入控制逻辑,限制对属性的不合理操作。便于修改,增强代码的可维护性
------------------------------------------------------------------------------------------------------------------
面向对象三大特征之二: 继承:Inheritance
●  多个类中存在相同属性和行为时,将这些内容抽取到一个新类中,多个类无需再定义这些属性和行为,只要继承那个类即可(多个类称为子类,单独的这个类称为父类(基类或超类))
●  子类会把父类除构造器之外的所有信息给继承下来
●  子父类的概念是相对的(子类也可以作为其他类的父类,父类也可以作为其他类的子类)
●  子类可以有自己特有属性和方法也可以重写父类定义的方法
●  子类是父类的扩展

●  语法 修饰符  class  类名(子类)  extends  类名(父类){ }
●  作用 :提高了代码的复用性,让类与类之间产生了关系,提供了多态的前提
注意:java类是单继承,不支持多继承(接口支持多继承)。子类不能直接访问父类中私有的(private)的成员变量和方法。只能通过事先定制好的方法来访问(如:get、set方法)。当一个类没有显示的指明父类时,那么它的父类是java.lang.Object(此类是所有类型基类)。不要仅为了获取其他类中某个功能而去继承
------------------------------------------------------------------------------------------------------------------
继承之方法的重写: override,父类的方法对子类不适用,那么子类可以对父类的方法重写(重置、覆盖 ))
●  子父类方法必须具有相同的方法名称、参数列表、返回值类型
●  子类必须大于等于父类的权限修饰符
●  子类方法抛的异常类型不能大于父类被重写方法的异常
●  子父类的方法必须同为static或同为非static

●  子类方法中访问被被重写了的父类方法 super.方法名(参数)
●  子类方法中访问没有被重写的父类方法 super.方法名(参数) 或者 方法名(参数)
注意:当子类重写了父类的方法后,如果使用子类的对象调用被重写的方法,调用的是子类中重写的方法,如果子类没有重写父类的方法,则调用的是父类中的方法
------------------------------------------------------------------------------------------------------------------
面向对象三大特征之三: 多态:Polymorphism,指一个事物存在多种形态
表现形式:
●  方法的重载(overload)和重写(override)
●  对象的多态性:父类的引用指向子类的对象  如:Person(父类)p1 = new Woman()(子类);
多态的前提:
●  继承关系
●  子类重写了父类的方法
多态在程序运行分为: (编译时“看左边”,运行时“看右边”)
●  编译状态 :关注是父类。子类特有的属性和方法不能被编译通过
●  运行状态 :关注的是子类(真正对象的实体,子类的对象,那么执行的方法就是子类重写的方法)

注意:在多态下,调用方法实际执行的是子类重写父类的方法,无法执行子类特有的属性和方法,如果想执行,使用强转符“( )”
------------------------------------------------------------------------------------------------------------------
多态之instanceof:
●  语法 x  instanceof  A (检验x是否为类A的对象,返回值为boolean型)
●  要求x所属的类与类A必须是子类和父类的关系,否则编译错误
●  如果x属于类A的子类B,x  instanceof  A也为true

------------------------------------------------------------------------------------------------------------------

抽象类:abstract
继承过后,子类变得越来越具体,父类则更一般,更通用。有时将父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类
抽象类:可以定义和普通类完全一样的内容
●  语法权限修饰符  abstract  class  类名称{ }
●  不能被实例化,用来被继承。子类必须重写父类的抽象方法,才能被实例化
●  有构造器(所以的类都有构造器)
●  抽象类中不一定有抽象方法
抽象方法:只有方法的声明,没有方法的实现。在定义抽象方法时没有方法体和{ },结尾分号结束
●  语法权限修饰符  abstract  void(或者返回值类型) 方法名(形参列表);
●  抽象方法所在的类一定是抽象类
●  子类如果继承的是抽象的父类(有抽象方法),那么子类必须重写父类的所有抽象方法或者子类也是一个抽象类
●  若子类继承抽象类,并重写所有的抽象方法,则此类是一个“实体类”,即可以实例化

注意:不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法

------------------------------------------------------------------------------------------------------------------

接口:interface:抽象方法和常量值定义的集合
接口是一种特殊的抽象类,只包含常量和方法的定义,没有具体的实现。主要用途就是被实现类实现(面向接口编程)
●  接口类语法权限修饰符  interface  接口名称{ }
●  常量(成员变量)语法public  static  final  数据类型  常量名 = 值(其中public  static  final可以省略,为默认)
●  抽象方法语法public  abstract  void(或者返回值类型)方法名(形参列表)(其中public  abstract可以省略,为默认)
●  实现接口语法权限修饰符  class  类名称  implements  接口名称{ }(实现多个接口,接口名称之间使用“,”分隔)
●  实现类可以继承父类也可以实现接口语法权限修饰符  class  实现类  extends  父类  implements  接口名称{ }
●  对象的引用语法接口名称  变量名 = new  实现类的名称(接口与实现类之间也存在多态性)

注意:接口没有构造器。它是多继承机制(多个接口使用“,”分隔,类是单继承)。如果没有完全重写接口中的抽象方法,那么这个类一定是抽象类。反之,全部重写,那么它就是一个实体类,可以实例化。在接口中的常量必须初始化值

------------------------------------------------------------------------------------------------------------------

接口总结:
●  可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系
●  可以指明多个类需要实现的方法,一般用于定义对象的扩张功能
●  主要用来定义规范。解除耦合关系
------------------------------------------------------------------------------------------------------------------
接口和抽象类之间的关系:

注意:在开发中,一个类不要去继承一个已经实现好的类,要么继承抽象类,要么实现接口
------------------------------------------------------------------------------------------------------------------

自己整理,有些地方是扒拉的,如有侵犯,还望告知