2面向对象特征—封装1.封装的概念 封装即对外隐藏对象的内部具体实现,并开放出若干个可以操作的入口来访问数据 1.封装即对要操作的实体进行隐藏,使原始功能对外不可见,通过其他方法间接的操作真实的实体 2.日常生活中的各种电器的遥控器、银行的密码锁、指纹识别系统等均为封装的体现 2.封装的实现原理1.Java语言中为实现对实体的封装,可以对类内的成员进行私有化(private)声明,使其功能对外不可见,然后为其提供对应的访问器,对原始被封装的实体进行操作 2.访问器分为两种 获取访问器 修改访问器 3.封装的标准实现(一)1.为在Java编程人员建立一种快速的数据访问安全统一标准,对封装进行了格式的严格规定 2.封装通常是对成员变量进行,成员方法也可以使用,但是通常意义不大 3.class Person{ privateString name; publicvoid setName(String name){ this.name= name; } publicString getName(){ returnthis.name; } } 4.封装的标准实现(二)1.私有化所有的实例变量 2.为实例变量提供一个获取方法,无参数,返回值类型为该实例变量的类型 声明为public,方法体返回该实例变量的值 get变量名 name getName age getAge 当数据类型给boolean时,获取的方法改名为 is变量名 getter方法 3.为实例变量提供一个修改方法,参数为一个,类型是该变量的类型 声明为public,方法体不过返回,只对成员变量进行值得修改 set变量名 name setName age setAge setter方法
面向对象特征—继承1.继承概述继承描述的是一种类与类之间的关系 通过继承可以减少模型内部结构的重复描述,加强代码的复用性 2.继承基本概念1.父类/超类/基类:类B继承类A,称类A为父类 2.子类:类B继承类A,称类A为子类 3.顶层父类:Object 3.继承语法结构语法结构: class子类名称 extends 父类名称{ } 4.继承作用1.子类可以使用父类的成员。 子类可以使用父类中已有的成员变量————增强代码的复用性 子类可以使用父类中已有的成员方法————增强代码的复用性 2.子类可以定义父类中没有的成员。 3.子类可以对父类中已有的成员进行重新定义 子类可以保留父类已有的成员变量进行重新定义 保留父类已有的成员变量名,其他设定可以随意更改 子类可以对父类已有的成员方法进行重新定义——————(重写/覆盖) 子类可以使用实例方法覆盖父类的实例方法这个过程叫做重写。 (子类使用静态方法覆盖父类的静态方法不叫重写,叫做子类隐藏了父类的静态方法) 5.重写(override)1.重写是指子类对父类中已有的实例方法进行重新定义,称子类对父类的指定方法进行重写 2.重写只发生在继承关系中,重写描述的是子类方法对父类方法的关系 3.重写时子类重写的方法访问控制权限必须大于父类的访问控制权限 方法的重写要遵循“两同两小一大”规则, “两同”:方法名相同,形参表列相同; “两小”:1.子类的方法返回值类型应比父类方法返回值类型更小或者相等; 2.子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等; “一大”:子类方法的访问权限应比父类方法的访问权限要大或者相等。 注覆盖方法和被覆盖方法要么是都是类方法要么都是实力方法,不能一个是类方法,一个是实例方法 ※重载和重写 重载主要发生在同一个类的多个同名方法之间,重写发生在子类和父类的同名方法之间。当然,父类方法和子类方法之间也可能发生重载,因为子会获得父类的方法,如果一个子类定义了一个和父类方法相同的方法名,但参数列表不同的方法,就会形成子类方法和父类方法的重载。
6.重写误区1.静态方法的覆盖称为子类隐藏了父类的静态方法,而不是重写了父类方法 2.父类的私有方法,子类是无法继承的,因此父类私有方法不能被重写 javap指令 3.实例方法在重写时不能添加static修饰符,静态方法被重新定义时不能定义为非静态的方法 7.重写的应用当一个类开发完成,后期维护过程中,发现其功能已经过时,需要对其进行维护,添加一些新的功能,但是旧的功能如果被修改,可能导致其他功能连带失效,为了避免该现象,在不惊动原始功能的基础上,对其进行功能的扩展,即可以利用重写的特点进行,这一方式即设计模式中的装饰模式的雏形。 8.Super子类对父类的某些实例方法进行覆盖后,在子类中将无法直接调用父类被覆盖的方法,可以通过super关键字,对父类的成员进行引用 super.父类成员变量 super.父类成员方法 注如果在某个方法中访问名为 a 的Field,但没有显式指定调用者,则系统查找a的顺序为: 1.查找该方法中是否有名为a的局部变量; 2.查找当前类中是否包含名为a的Field; 3.查找a的直接父类中是否包含名为a的Field,依次上溯到a的所有父类,直到java.lang.Object类,如果最总不能找到名为a的Field,则系统会出现编译错误。
9.最终方法1.如果父类中的方法不允许被它的子类重写,可以将其声明为最终方法,表示该方法不允许被覆盖 2.final修饰符可以将一个方法定义为最终方法 3.最终方法不允许被重写 10.最终类1.对于一些常见的工具类或核心类,已经对其功能进行了详实的定义,不会再对其进行结构或功能的扩展,此时,为了避免其他类继承该类并对其功能进行扩展,可以声明当前类不允许被其他类所继承,通过关键字final实现 2.Final:对类进行final修饰符的添加,表明该类是一个最终类,不允许被继承 另外:(如果对一个成员变量用final修饰的话 该成员变量就变成为常量了。)
|