继承
1、复习
一、构造方法。二、方法重载。三、this关键字。
四、包和访问权限。五、static
一、构造方法。二、方法重载。三、this关键字。
四、包和访问权限。五、static
2、新内容
一、继承:extends
1、什么是继承:
现实世界中,就是儿子继承了老子的东西。
面向对象的世界中,就是一个类得到了另一个类的成员属性和成员方法。
1、什么是继承:
现实世界中,就是儿子继承了老子的东西。
面向对象的世界中,就是一个类得到了另一个类的成员属性和成员方法。
class Student extends Person {
}
Person 父类
Student 子类
extends:一个类可以用extends另一个类,那么这个类可以使用父类的所有方法和属性
(前提是父类的方法和属性不是private)
★注意:一个类只能继承一个类(单继承)
Person 父类
Student 子类
extends:一个类可以用extends另一个类,那么这个类可以使用父类的所有方法和属性
(前提是父类的方法和属性不是private)
★注意:一个类只能继承一个类(单继承)
2、为什么要使用继承
面向对象的终极目标:减少程序里的重复代码!
因为:引入了继承之后,实现了代码的重用,实现递增式程序设计(扩展)。
面向对象的终极目标:减少程序里的重复代码!
因为:引入了继承之后,实现了代码的重用,实现递增式程序设计(扩展)。
继承的好处:能扩展,示例不继承的情况下扩展
3、继承的基本语法特点
写法:class Teacher extends Person{}
写法:class Teacher extends Person{}
练习:
写一个人类(姓名,性别,年龄,跑步行为)
写一个学生(专业,和考试行为)类继承人类
写一个老师(工资,和上课行为)类继承人类
写一个测试类(main方法):要求能打印出老师和同学的属性
二、子类实例化过程和Super的用途
★继承中构造方法的执行顺序:
实例化类的对象的时候,先调用父类的构造方法然后调用子类的构造方法。
构造方法是从这个类,最早的祖先的构造方法开始执行。
★继承中构造方法的执行顺序:
实例化类的对象的时候,先调用父类的构造方法然后调用子类的构造方法。
构造方法是从这个类,最早的祖先的构造方法开始执行。
在子类构造方法中,必须调用父类的构造方法!为什么?(不写默认调用无参的构造函数,第一行!)
因为:由于子类继承了父类的成员变量,子类无法继承构造函数,在赋值时候会产生重复代码。
虽然不能继承父类的构造函数,但是可以使用super来调用父类构造函数,
解决成员变量赋值产生重复代码问题。
注意:对super的调用必须是构造方法的第一句
因为:由于子类继承了父类的成员变量,子类无法继承构造函数,在赋值时候会产生重复代码。
虽然不能继承父类的构造函数,但是可以使用super来调用父类构造函数,
解决成员变量赋值产生重复代码问题。
注意:对super的调用必须是构造方法的第一句
★Super的用途
super的两种用途:
第一种用法:用来调用父类的构造方法。(当父类的构造方法需要传值的时候用super()代表父类的构造方法) 使用super去执行父类的构造方法时,一定要放在子类构造方法的第一行
Java规定:父类的构造方法是不能被子类继承的。
super的两种用途:
第一种用法:用来调用父类的构造方法。(当父类的构造方法需要传值的时候用super()代表父类的构造方法) 使用super去执行父类的构造方法时,一定要放在子类构造方法的第一行
Java规定:父类的构造方法是不能被子类继承的。
三、继承机制下方法覆盖override(函数的复写)
方法覆盖:在类的继承机制中,如果子类的方法出现了和父类方法一样的方法,
那么就认为子类的方法覆盖了父类的方法。
方法一样体现在:返回值一样,方法名一样,参数也一样,参数类型一样。参数数量一样。
(但是方法中的内容可以不一样)
//override 复写、覆盖、重写
//1、在具有父子关系的两个类中
//2、父类和子类各有一个方法,这两个方法的定义完全相同。(返回值类型、函数名、参数列表)
//1、在具有父子关系的两个类中
//2、父类和子类各有一个方法,这两个方法的定义完全相同。(返回值类型、函数名、参数列表)
★注意:在方法覆盖中。通过子类的对象调用的是子类的方法。
方法覆盖和方法重载:
方法覆盖:一定是出现在继承的体系结构。
方法重载:继承并不是必须,只要满足重载的条件即可
方法覆盖:一定是出现在继承的体系结构。
方法重载:继承并不是必须,只要满足重载的条件即可
★Super的第二种用法:当子类的属性和方法跟父类的属性和方法名字相同的时候,
使用super点来区别调用父类的方法和属性还是子类的方法和属性
(例如 super.eat()调用的是父类的eat()方法)
使用super点来区别调用父类的方法和属性还是子类的方法和属性
(例如 super.eat()调用的是父类的eat()方法)
四、多态概念(一种类型,多种表现状态)
★多态:继承前提下,父类的引用指向子类的实体,调用被重写的方法
人、学生,在信息学院是学生,走在大街上就是人,上车就是乘客,
走进新一佳就是顾客,到饭店就是吃货。
引用转型:
通过变量名去获取变量中空间的数据(引用:拿过来用用)
父类(基类)的引用指向子类(派生类)的实体。
第一:父类的引用指向那个子类的实体,那么久调用那个子类的方法。
第二:调用同一个方法,但是却可以得到不同的效用,这称之为java中的多态
多态:
1.父类中的引用指向子类的实体(动态多态)
条件:要有继承以及方法覆盖。
2.方法重载(在没有运行的时候我就知道了要调用哪一个方法),也称之为(静态多态)
3。父类的引用只能调用子类的覆盖方法,不能调用其他方法。
1.父类中的引用指向子类的实体(动态多态)
条件:要有继承以及方法覆盖。
2.方法重载(在没有运行的时候我就知道了要调用哪一个方法),也称之为(静态多态)
3。父类的引用只能调用子类的覆盖方法,不能调用其他方法。
五、对象的转型
对象的向上转型:将子类的对象赋值给父类的引用
笔记本电脑 extends 电脑(){}
笔记本电脑 b1 = new 笔记本电脑();
电脑 d1 = b1;
Student s = new Student();
//1、Student 继承 Person 2、将Student对象赋值给Person引用
Person p = s //对象的向上转型
见示例:JavaOOP_03
向上转型时:(向上转型是不可能失败的)
★一个引用能调用哪些成员(属性和方法),取决于这个引用的类型(定义了什么才能够使用什么)。
★父类和子类都有这个方法和属性,一个引用调用的是哪个方法和属性,取决于这个引用指向的对象。
对象的向上转型:将子类的对象赋值给父类的引用
笔记本电脑 extends 电脑(){}
笔记本电脑 b1 = new 笔记本电脑();
电脑 d1 = b1;
Student s = new Student();
//1、Student 继承 Person 2、将Student对象赋值给Person引用
Person p = s //对象的向上转型
见示例:JavaOOP_03
向上转型时:(向上转型是不可能失败的)
★一个引用能调用哪些成员(属性和方法),取决于这个引用的类型(定义了什么才能够使用什么)。
★父类和子类都有这个方法和属性,一个引用调用的是哪个方法和属性,取决于这个引用指向的对象。
对象的向下转型:将父类的对象赋值给子类的引用
Student s1 = new Student();
Person p = s1; //先把一个对象向上转型
Student s2 = (Student)p; //向下转型
瞎折腾?吃饱撑着?方便面,酱包,料包都是包着的?吃的时候要打开,为啥还要包呢?
Student s1 = new Student();
Person p = s1; //先把一个对象向上转型
Student s2 = (Student)p; //向下转型
瞎折腾?吃饱撑着?方便面,酱包,料包都是包着的?吃的时候要打开,为啥还要包呢?
【练习】:
写一个飞机类(有起飞和降落的方法)
写一个战斗机(有起飞和降落的方法)
写一个直升机(有起飞和降落的方法)
写一个测试类(用父类的引用去指向子类的实体(对象))然后分别调用起飞和降落的方法
优点:在保证了父类的基本特征之上,能去使用子类强大的方法和功能。
写一个飞机类(有起飞和降落的方法)
写一个战斗机(有起飞和降落的方法)
写一个直升机(有起飞和降落的方法)
写一个测试类(用父类的引用去指向子类的实体(对象))然后分别调用起飞和降落的方法
优点:在保证了父类的基本特征之上,能去使用子类强大的方法和功能。