分享

Java面向对象基础(封装继承多态)【2】

 大前端之旅 2021-12-16
封装的作用和含义
   需要让用户知道的才暴露出来,不需要让用户知道的全部隐藏起来,这就是封装。说的专业一点,封装就是把对象的属性和操作结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。
     我们程序设计要追求“高内聚,低耦合”。
高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合是仅暴露少量的方法给外部使用,尽量方便外部调用。
编程中封装的具体优点:
     1. 提高代码的安全性。
     2. 提高代码的复用性。
     3. “高内聚”:封装细节,便于修改内部代码,提高可维护性。
     4. “低耦合”:简化外部调用,便于调用者使用,便于扩展和协作。

再比如说,如果哪天我们需要将Person类中的age属性修改为String类型的,你会怎么办?你只有一处使用了这个类的话那还比较幸运,但如果你有几十处甚至上百处都用到了,那你岂不是要改到崩溃。而封装恰恰能解决这样的问题。如果使用封装,我们只需要稍微修改下Person类的setAge()方法即可,而无需修改使用了该类的客户代码。

封装的实现—使用访问控制符

Java是使用“访问控制符”来控制哪些细节需要封装,哪些细节需要暴露的。Java中4种“访问控制符”分别为private、default、protected、public,它们说明了面向对象的封装性,所以我们要利用它们尽可能的让访问权限降到最低,从而提高安全性。

      下面详细讲述它们的访问权限问题。其访问权限范围如表所示。

    1.private 表示私有,只有自己类能访问

      2. default表示没有修饰符修饰,只有同一个包的类能访问

      3. protected表示可以被同一个包的类以及其他包中的子类访问

      4. public表示可以被该项目的所有包中的所有类访问

下面做进一步说明Java中4种访问权限修饰符的区别:首先我们创建4个类:Person类、Student类、Animal类和Computer类,分别比较本类、本包、子类、其他包的区别。 

封装的使用细节

类的属性的处理:

      1. 一般使用private访问权限。

      2.  提供相应的get/set方法来访问相关属性,这些方法通常是public修饰的,以提供对属性的赋值与读取操作(注意:boolean变量的get方法是is开头!)。

      3. 一些只用于本类的辅助性方法可以用private修饰,希望其他类调用的方法用public修饰。

package javastart02;/** * 测试封装 * @author 玖点夜谈 * */
public class TestEncaption03 { private int age; private String name; private String sex; public void setName(String name) { this.name=name; }public void setAge(int age) { if(age>=1&&age<=130) { this.age=age; System.out.println("年轻"); }else { System.out.println("重新输入年龄"); } }
public String getName(String name) { return this.name; }public int getAge() { return this.age;}}

多态(polymorphism)

多态指的是同一个方法调用,由于对象不同可能会有不同的行为。现实生活中,同一个方法,具体实现会完全不同。比如:同样是调用人的“休息”方法,张三是睡觉,李四是旅游,高淇老师是敲代码,数学教授是做数学题; 同样是调用人“吃饭”的方法,中国人用筷子吃饭,英国人用刀叉吃饭,印度人用手吃饭。

      多态的要点:

      1. 多态是方法的多态,不是属性的多态(多态与属性无关)。

      2. 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象。

      3. 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。

package javastart02;/** * 测试多态 * @author 玖点夜谈 * */public class TestPolym { public static void main(String[] args) { Animal a=new Animal(); anmialcry(a); Dog d=new Dog(); anmialcry(d); } static void anmialcry( Animal a) { a.shout(); }
}class Animal { public void shout() { System.out.println("叫了一声!"); }}class Dog extends Animal { public void shout() { System.out.println("旺旺旺!"); } public void seeDoor() { System.out.println("看门中...."); }}class Cat extends Animal { public void shout() { System.out.println("喵喵喵喵!"); }}

对象的转型(casting)

父类引用指向子类对象,我们称这个过程为向上转型,属于自动类型转换。

      向上转型后的父类引用变量只能调用它编译类型的方法,不能调用它运行时类型的方法。这时,我们就需要进行类型的强制转换,我们称之为向下转型!

在向下转型过程中,必须将引用变量转成真实的子类类型(运行时类型)否则会出现类型转换异常ClassCastException


    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多