电脑
大家在看到继承2个字的时候可能第一想法就是生活中的 子女继承父母的财产,生活中的继承特点是钱不用自己挣 也可以花。 在代码这块2个类之间存在某种联系,建立这种 继承关系,继承不能乱继承,能不能继承一定要符合一种 规矩这个规矩称之为 is a关系 狗 is a 动物 ok 狗 is a 人类 error
比如说我们玩的《lol》游戏中,所有的人物都属于英雄 应该有一个英雄类,每个英雄又有不同的特征比如有的属性 ADC有的属性AP,每个类型下面还有不同的实现英雄类 英雄类 ----------------------- | | ADC类 AP类 ------------------ ------------------- | | | | | | 寒冰类 女警类 老鼠类 凤凰类 电耗子类 提莫类 继承是让类与类之间产生关系,继承是实现多态的前提! a,继承的语法 继承的关键字 extends 定义一个父类 class 父类{ } 定义一个类使该类继承父类,那么该类就是此父类的子类 该子类就自动拥有父类可继承下来的属性和方法。 class 子类 extends 父类{ } 由刚才我们的实验 会发现 ADC类型中并没有定义 name属性和发育的方法,但是在测试的类中会发现 我们的adc引用可以调用name属性和发育方法由此 可以证明,子类在继承父类的时候会自动的拥有父类的 成员(成员变量、成员方法)
b,继承中的成员变量 如果在继承的时候父类与子类都有成员变量如果成员变量的 名字不一样那么好处理,如果成员变量的名字一样该如何处理。 如果成员变量的名字一样 实验得到 他会给子类的成员变量赋值 但是有的时候 我就需要给父类的成员变量赋值该如何做呢?
我们可以通过使用一个关键字 super他可以指定父类的属性(在 子类中存在和父类有相同属性名的属性) c,继承的优缺点与需要注意的地方 优点: Java继承可以增强代码的复用性。 缺点: 缺点就是类与类之间耦合性变高了。 注意: 重点***** Java中的继承只支持单继承,不支持多继承 这个和我们的现实生活很吻合,一个孩子只能 有一个爸爸。但是一个父类可以有多个子类。 一个爸爸可以有多个孩子。 一个父类可以有多个子类 一个子类只能有一个父类 但是Java支持多重继承 一个类可以有子类也可以有父类 ***** 在Java的类结构中存在一个'祖宗类'该类 是Java中所有类的直接或者间接父类该类的 名字为 java.lang.Object,如果我们在 编写一个类的时候 该类 没人继承任何一个类 那么系统会默认使该类继承Object类。
d,继承中的成员方法 1.子类成员方法和父类的成员方法名不同时 子类在调用成员方法的时候会先去子类中去找 如果子类没有的再从父类中寻找。 如 我们 的 Hero类和ADC类 在测试类中执行 adc.showName()方法时,他会先在子类中寻找有没有 一个方法的名字为 showName的,如果有则调用,如果没有 他则会去父类中寻找有没有,发育同理showName(); 2.特殊情况 子类中的成员方法和父类中的成员方法同名 重写-->重写只发生在父子类中 覆盖 为什么会有重写呢? 父类提供的方法不能够满足子类的要求。 程序在执行的时候肯定会执行重写后的方法。 方法名相同的情况下也会执行子类,如果父类方法有用 可以再执行之前通过super关键字来调用父类的方法做 一些前置的工作。 3.重写的注意事项 子类在重写父类的方法的时候子类的方法名必须要和父类的 方法名保持一致,并且参数列表也要保持一致。而且重写后的 方法访问修饰符的范围不能小于重写前的访问修饰符范围。 private public Java中的几个访问修饰的控制范围 公开的>受保护的>默认>私有的 public>protected>默认不写>private 在Java提供了一个验证方法是否是重写的标签 @Override 写在需要验证的方法上面,如果该方法 的确是一个重写的方法,那么就会编译通过,如果该方法 不是重写父类的方法,那么就会编译不通过。 重载和方法的返回值类型有没有关系? 方法的重载只有参数列表有关,和返回值类型无关!!! 重写和方法的返回值类型有没有关系? 有关系 如果返回值类型是基本数据类型那么子类和父类的返回值 类型必须要保持一致 如果返回值类型是引用数据类型那么子类的方法返回值类型 不能大于父类的方法返回值类型。 重写的方法和异常也有关系(讲到异常的时候再说) 重写总结 ***** 1.子类方法的修饰符>=父类的方法修饰符 2.子类方法的返回值<=父类的方法返回值(仅限引用类型,基本类型要一致) 3.子类与父类的方法 方法名参数列表必须要一致 4.Java提供了一个验证重写标签@Override 5.子类方法抛出的异常范围不能大于父类方法抛出的异常(异常的时候再演示) 下课 自己编写一个子类一个父类 验证 1234 3.抽象类、抽象方法 引入: 比如说现在我们有一个动物类,还有一个狗类,还有一个猫类 所有的动物都会吃东西,所以我们将狗和猫的吃的方法写到了 动物类里面,然后让 狗 和 猫 继承 动物类。 问题: 猫吃鱼 狗吃肉,你告诉我 动物类里面的吃 到底吃什么? Animal{ eat{ } } Cat extends Animal{ } Dog extends Animal{ eat(){ 吃肉 } }
a,抽象方法 在我们的实际开发过程中有时候父类中定义的方法我们根本就不知道 如何实现才能匹配所有子类的需求。所以我们将这类不知道怎么去实现 的方法给他定义成抽象方法。 如果一个类包含了抽象方法,那么该类就必须是一个抽象类。 有抽象方法的类一定是抽象类 c,如何定义抽象类和抽象方法 在需要定义的类或方法前面添加一个修饰符 abstract 在类上面添加 那么该类就是抽象类 在方法上面添加 那么该类就是抽象方法 d,抽象类 抽象类中可以没有抽象方法,如果一个抽象类没有抽象方法 我为什么要定义成抽象类? 那么没有抽象方法的抽象类有意义吗? 有意义,意义在于不让别人new他,不要别人创建该对象 抽象类不能new 抽象类存在的意义就是被继承。 如果一个类继承了抽象类,那么该类就必须要实现所有的抽象方法。 如果不实现除非该类也是一个抽象类。
今天课程内容总结 1.继承 a,继承的语法格式 使用 extends关键字 b,继承的优缺点 c,继承的成员变量的处理(同名,不同名) d,继承的成员方法的处理(同名,不同名) e,方法重写的注意事项(5条) 2.抽象类 a,为什么有抽象方法 b,如何定义抽象类和抽象方法 c,抽象方法与抽象类之间的一些关系 有抽象方法的类一定是抽象类 抽象类中不一定有抽象方法 d,抽象类不能new e,继承一个抽象类必须要实现抽象类里面的所有抽象方法 如果不实现除非该子类也是一个抽象类。
抽象类不能new
继承一个抽象类必须要实现抽象类里面的所有抽象方法