再比如说,如果哪天我们需要将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 |
|