寒假实训 Day04

继承

          发生在父子之间 父类(基类)

        人类:

                  特征:姓名、年龄                        行为:吃饭、娱乐

            学生类:           特征:姓名、年龄、学号               行为:吃饭、娱乐、学习

            教师类:           特征:姓名、年龄、工号               行为:吃饭、娱乐、讲课

            工人类:           特征:姓名、年龄、薪水               行为:吃饭、娱乐、工作

        

         公共类中已有特征和行为而在多个类型只需要编写自己独有特征和行为的机制,叫做继承。 使用继承提高了代码的复用性,可维护性以及扩展性。 在Java语言中使用extends(扩展)关键字来表示继承关系。

         java 只支持单继承,可以有多重继承,一个子类只能有一个父类,而一个父类可以有多个子类(简单来说就是一个孩子一个爹,一个爹可以有多个孩子)

        注意: 子类 is a 父类

        如: public class Worker extends Person{} - 表示Worker类继承自Person类 其中Person类叫做超类、父类、基类。 其中Worker类叫做派生类、子类、孩子类。

  1.2 注意事项

        (1).子类不能继承父类的构造方法和私有方法,但私有成员变量可以被继承只是不能直接访问。

        (2).无论使用何种方式构造子类的对象时都会自动调用父类的无参构造方法,来初始化从父类 中继承的成员变量,相当于在构造方法的第一行增加代码:super()的效果。

        (3).使用继承必须满足逻辑关系:子类 is a 父类,也就是不能滥用继承。

        (4).Java语言中只支持单继承不支持多继承,也就是说一个子类只能有一个父类,但一个父类 可以有多个子类。

方法的重写(Override)

    方法的重载(方法名相同,参数类型,个数,顺序不同)

        (1)基本概念

                从父类中继承下来的方法不满足子类的需求时,就需要在子类中重新写一个和父类一样的方法 来覆盖从父类中继承下来的版本,该方式就叫做方法的重写。

         (2)重写的原则

             a.要求方法名相同、参数列表相同以及返回值类型相同,从jdk1.5开始允许返回子类类型。

             b.要求方法的访问权限不能变小,可以相同或者变大。

             c.要求方法不能抛出更大的异常(异常机制)。

         练习:

                编程实现Animal类的封装,特征有:名字和毛色,要求提供打印所有特征的方法。 编程实现Dog类的封装并继承自Animal类,该类的特征有:牙齿数量,要求提供打印所有特征的方法 编程实现DogTest类,在main方法中分别使用无参和有参方式构造Dog类型对象并打印特征。

      2.访问权限

              2.1 常用的访问权限

                访问控制符 访问权限 本类内部 本包中的类 子类内部 其它包中的类

                public          公有的          ok           ok             ok           ok

                protected     保护的          ok           ok             ok           no

                啥也不写      默认的          ok           ok             no           no

                private          私有的          ok           no             no           no

                 a.public修饰的成员可以在任意位置使用;

                 b.private修饰的成员只能在本类内部使用;

                 c.通常情况下,成员方法都使用public关键字修饰,成员变量都使用private关键字修饰;

      包的声明

                package 包名:- 表示声明单层包 package 包名1.包名2.包名3...包名n;

                                          - 表示多层包,为了便于管理以及解决命名冲突的问题;

                练习:

                        自定义矩形(Rect)类,特征有:横纵坐标、长度及宽度,提供无参,全参构造,set/get方法要求实现封装并提供打印方法;

                          自定义圆形(Circle)类,特征有:横纵坐标、半径,提供无参,全参构造,set/get方法,要求实现封装并提供打印方法; 提取共性自定义图形(Shape)类,提供无参,全参构造,set/get方法。 自定义ShapeTest类,自定义成员方法实现既能打印矩形又能打印圆形的方法并调用 (最后一个成员方法选做)

多态

         基本概念:

                        多态主要指同一种事物表现出来的多种形态。

                饮料:可乐、雪碧、乐虎、加多宝、红牛、脉动、...

                宠物:猫、狗、鸟、小强、鱼、... 人:学生、教师、工人、保安、...

        语法格式:

            父类类型 引用变量名 = new 子类类型(); //父类型的引用指向子类型的对象 【多态的核心】             如: Person pw = new Worker();

                    Shape shape = new Rect();

                    pw.show();

          练习:

                编程实现Person类的封装,特征有:姓名和年龄,要求提供打印所有特征的方法。 编程实现Worker类的封装并继承自Person类,特征有:薪水 编程实现PersonWorkerTest类,在main方法中分别创建Person和Worker类型对象并打印特征。

         解析: 由程序结果可知,编译阶段调用Person类中的show方法,运行阶段调用Worker类中的show方法

         多态的效果

                (1)当父类类型的引用指向子类类型的对象时,父类类型的引用可以直接调用父类独有的方法;

                (2)当父类类型的引用指向子类类型的对象时,父类类型的引用不可以直接调用子类独有的方法;

                (3)对于父子类都有的非静态方法来说,编译阶段调用父类版本,运行阶段调用子类重写的版本;

                (4)对于父子类都有的静态方法来说,编译和运行阶段都调用父类版本;

          引用数据类型之间的转换

                (1)引用数据类型之间的转换方式有两种:自动类型转换 和 强制类型转换。 其中自动类型转换主要指小类型向大类型的转换,也就是子类转换为父类。 其中强制类型转换主要指大类型向小类型的转换,也就是父类转换为子类。

                (2)引用数据类型之间的转换必须发生在父子类之间,否则编译报错。

                (3)若强转的目标类型并不是该引用真正指向的数据类型时则编译通过,运行阶段发生类型转换异常。

             (4)为了避免上述错误的发生,应该在强转之前进行判断,格式如下: if(引用变量 instanceof 数据类型) - 判断引用变量指向的对象是否为后面的数据类型

        实际意义:

                        多态的实际意义在于屏蔽不同子类的差异性实现通用的编程带来不同的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值