面向对象(02)
来源:互联网 发布:网络连接器主要 编辑:程序博客网 时间:2024/05/01 21:19
继承、多态
继承
1、格式
A extends B(){}
2、什么时候应该定义继承呢?
当两个类中有大量的相同代码,那么这个时候我们可以把这些相同的代码抽取出来,定义出一个类让这两个类去继承它。如果类与类之间存在【类 is 类】的关系。就可以考虑继承。但不要为了得到某些方法,而去继承某类。
从设计角度来说:什么时候把类的关系定义为继承呢?
由于继承体现了一种关系:is a的关系。xxx is yyy 的一种。
以后,你在定义类(A,B)的时候:
如果他们有关系:A is a B 的一种。或者B is a A。
那么,他们之间就存在继承关系。前者A是子类,后者B是子类。
定义继承:使用关键字extends:
例如:class A extends B{}
表示:A继承B
A:子类,派生类
B:父类、基类、超类
子类不可以直接访问父类私有的成员。
若想访问父类私有成员,子类需要通过父类公共的方法调用父类的私有成员。 set及get等方法。
3、继承的特点
在Java中类支持单继承,不支持多继承。但支持多层(重)继承;且一个类可以被多个类继承。在Java中,接口既支持单继承,也支持多继承。
4、好处
提高代码的复用性
让类与类之间产生关系,是多态的前提。
5、this和super关键字的区别
super代表父类的存储空间标识符。
super和this的用法
成员变量
this.变量 ------------- 调用本类中的成员变量
super.变量 ----------- 调用父类中的成员变量
构造方法
this(...); ----------- 调用本类中的构造方法
super(...); ----------- 调用父类的构造方法
成员方法
this.方法名(......); -------- 调用本类中的成员方法
super.方法名(.......); ------ 调用父类中的成员方法
6、子父类中成员变量的用法
A. 名称不同,直接找;
B. 名称相同,子类对象在使用的时候:
C. 先找子类局部范围
D. 再找子类成员范围
E. 最后找父类成员范围(不会去找父类的局部变量);
F. 都没有找到的话,就报错。
7、子父类中的成员方法的用法
名称不同,直接找
名称相同时,子类对象在使用的时候:
先找子类的的
再找父类的;都没找到的话,就报错。
8、方法重写
在子类中,方法声明(修饰符,返回值,方法名,参数列表)相同的情况下。
注意事项:
父类中的私有方法不能被重写
子类方法的访问权限一定要大于等于父类的的访问权限
静态只能重写静态。
什么时候需要重写父类的方法
当子类需要父类的功能,而子类又有自己特有的方法时,可以重写父类的方法。这样既可以使用父类的功能有可以定义子类特有的内容。
9、子父类中的构造方法的用法
子类的初始化过程中,首先回去执行父类的初始化动作
因为子类的构造方法中默认有一个super();
因为子类要使用父类的成员变量,这个初始化,必须在子类初始化之前完成。所以子类的初始化过程中,会先执行父类的初始化。
如果父类没有无参构造方法时:
A. 使用super调用父类的带参结构。
使用this调用本身的其他构造(不建议使用)10、实例
class Person {// 封装姓名属性private String name;// 封装年龄属性private int age;// 对外提供,设置name的方法public void setName(String name) {this.name = name;}// 对外提供,获取name的方法public String getName() {return name;}// 对外提供,设置age的方法public void setAge(int age) {this.age = age;}// 对外提供,获取age的方法public int getAge() {return age;}// 父类Person的doing方法public void doing() {System.out.println("Person类中的doing()方法");}// 父类Person的study方法public void study() {System.out.println("Person类中的study()方法");}}// 创建一个Student类,继承Person类class Student extends Person {// 重写---父类Person的doing方法public void doing() {System.out.println("Student类...重写---父类Person的doing方法");}// 重写---父类Person的study方法public void study() {System.out.println("Student类...重写---父类Person的study方法");}public void show() {// 通过super关键字,调用父类的doing方法super.doing();// 通过this关键字,调用本类的doing方法this.doing();// 通过super关键字,调用父类的study方法super.study();// 通过this关键字,调用本类的study方法this.study();}}// 测试类public class Demo {public static void main(String[] args) {// 创建Student对象Student s = new Student();// 通过Student对象调用Student类的show方法s.show();}}
多态
1、多态的前提条件
- 要有继承关系或实现关系
- 要有方法的重写(没有也可以,但是如果没有方法重写,这个多态是没有意义的);
- 要有父类引用指向子类对象【例如:Fu f = new Zi();】
2、使用多态的注意事项
- 成员变量的使用规则:编译看左边,执行也看左边
- 成员方法的使用规则:编译看左边,执行看右边
假如说子父类中符合了上述三点多态前提:那么Fu f =new Zi();在用f对象调用成员的时候
如果调用的是成员变量那么打印出来的是父类的成员变量;
如果调用的是成员方法那么打印出来的是子类的成员方法。
- 原因是:方法有重写而变量没有。
3、多态的弊端
- 可能会遇到类型转换异常, 如果遇到了规则如下:
在对一个对象进行转型的时候只可以把他转换成它原本的类型,或者是其父类的类型。
如:Fu f = new Zi(); //向上转型 把小类型转换成到大类型Zi z = (Zi)f; //向下转型 把大类型转换成到小类型
父类引用无法使用子类的特有功能。
- 解决的方法:将父类向下转型
4、多态的好处
- 提高代码的拓展性和可维护性。
5、多态的类型转换问题
- 在多态中,出现类型转换异常的根本原因是多态没有继承关系.
- 类型转换异常:java.lang.ClassCastException,如果遇到这个异常。如果两个类没有任何关系就不能互相转换(关系指的是继承或者实现)
6、实例
//创建Animal类class Animal {// Animal类中的show方法public void show() {System.out.println("Animal show");}}// 创建Cat类,使其继承Animal类class Cat extends Animal {// 重写Animal类中的show方法public void show() {System.out.println("Cat show");}}// 创建Dog类,使其继承Animal类class Dog extends Animal {// 重写Animal类中的show方法public void show() {System.out.println("Dog show");}}class DuoTaiDemo02 {public static void main(String[] args) {// 多态:向上转型Animal a = new Cat();a.show();// Cat show// 向下转型Cat c = (Cat) a;c.show();// Cat show// 因为a被强转为Cat类型,所以不能再次被强转成其他类型// 产生类型转换异常:java.lang.ClassCastExceptionDog d = (Dog) a;d.show();}}
- 面向对象-02
- 02 Java面向对象
- 面向对象(02)
- 02面向对象
- 02 面向对象
- Python面向对象02
- 02 面向对象
- 02_Java面向对象
- Java面向对象02
- 面向对象02
- 黑马程序员-面向对象02
- 黑马程序员------面向对象02
- 黑马程序员--面向对象02
- c++面向对象类02
- java学习-面向对象02
- 面向对象02--java基础
- 面向对象与原型02
- 02 OC面向对象基础
- 加载指定包名下的所有类或根据类的annotation进行过滤的工具类
- Kth Largest Element in an Array
- Shell Script - 追踪与debug
- 宝宝心声
- 分层驱动将IRP分解成多个IRP
- 面向对象(02)
- MySQL中的UUID
- Android手势密码LockPatternView、LockPasswordUtils、LockPatternUtils等分析
- NavigationView+Toolbar
- DevExpress XPO 常用功能
- DB Query Analyzer 6.04 is distributed, 78 articles concerned have been published
- HDU 5365(不是地球人)
- HDU 1114
- DevExpress ORM Tool (XPO)