Java 面向对象03
封装、继承、多态
java面向对象的三大特性:封装、继承、多态。
私有化封装
封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节,但可以通过该对象对外的提供的接口来访问该对象。
简单来说,就是让属性对可信任的类/对象可见,对不可信任的类/对象隐藏。
封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法。
步骤:
- 成员变量前加修饰符private
- 提供公共的getter、setter方法
- public 返回值类型 getXxx(){return xxx;}
- public void setXxx(数据类型 xxx){this.xxx=xxx;}
- 在使用时,通过对象调用get/set方法来间接使用私有化属性
public class Husband {
/*
* 对属性的封装
* 一个人的姓名、性别、年龄、妻子都是这个人的私有属性
*/
private String name ;
private String sex ;
private int age ;
private Wife wife;
/*
* setter()、getter()是该对象对外开发的接口
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void setWife(Wife wife) {
this.wife = wife;
}
}
对于封装而言,一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以完成自己的操作。使用封装的好处:
- 良好的封装能够减少耦合。
- 类内部的结构可以自由修改。
- 可以对成员进行更精确的控制。
- 隐藏信息,实现细节。
继承
继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。即,当新类拥有现有的类所有成员时,可以让新类从现有的类派生、衍生。
通过使用继承我们能够非常方便地复用以前的代码,能够大大的提高开发的效率。
继承的关键字 extends
格式:class Zi extends Fu{}
特点:
- 子类继承父类所有的实例成员
- 子类不能继承父类的构造方法
- 子类继承了父类的私有成员 不能直接使用 只能通过父类提供的方法间接使用
- 子类可以定义父类没有的成员-子类特有成员
- 子类可以重新定义父类已有成员
- 重新定义父类的成员变量:要求变量名相同即可
- 子类重新定义父类的成员方法:重写
- java只支持类与类之间的单继承
- 如果一个类没有继承其他类 默认继承Object
重写
重写(Override)是父类与子类之间的多态性,实质是对父类的函数进行重新定义。
其实就是在子类中把父类本身有的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列表,返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下, 对方法体进行修改或重写,这就是重写。
要求:除了范围修饰符可以扩大,其他方法声明必须和父类完全一样。
重写和重载的区别:
- 涉及的类的个数不同
- 重载只涉及一个类
- 重写必须是继承:涉及到子类和父类
- 要求不同
- 重载要求:方法名相同 参数列表不同
- 重写要求:除了范围修饰符可以扩大 其他方法声明必须和父类完全一样
- 影响不同
- 几个方法重载之间相互没有影响:只是调用时不能通过方法名区分,而是通过参数列表区分
- 子类重写父类的方法:子类中从父类继承的方法会被隐藏
- 意义不同
- 重载:几个方法功能相同 只是需要的原始数据不同
- 重写:父类的方法不能满足子类的需求:子类需要根据自己的需求对父类的方法进行改进
多态
什么是多态:等号左边父类引用,等号右边子类对象
多态对象有什么特点:除了重写的方法,其他和父类对象完全相同
什么时候使用多态:定义方法的参数列表、方法的返回值类型、类的成员变量、数组的元素类型时 都定义为父类类型 这样就可以传递、返回、赋值、装任意子类类型的对象
实现多态的三个条件(前提条件,向上转型、向下转型)
- 继承的存在;(继承是多态的基础,没有继承就没有多态)
- 子类重写父类的方法。(多态下会调用子类重写后的方法)
- 父类引用变量指向子类对象。(涉及子类到父类的类型转换)
向上转型 Student person = new Student()
将一个父类的引用指向一个子类对象,成为向上转型,自动进行类型转换。此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,而不是父类的方法此时通过父类引用变量无法调用子类特有的方法。
向下转型 Student stu = (Student)person;
将一个指向子类对象的引用赋给一个子类的引用,成为向下转型,此时必须进行强制类型转换。向下转型必须转换为父类引用指向的真实子类类型,,否则将出现ClassCastException,不是任意的强制转换
向下转型时可以结合使用instanceof运算符进行强制类型转换,比如出现转换异常—ClassCastException