前言
为什么要有继承?
提高代码的重用性,减少一些重复代码的书写
一.继承
1.什么是继承
Java中提供了一个关键字extends,用这个关键字,可以让一个类和另一个类建立起父子关系
子类能继承父类的非私有成员(成员变量,成员方法)
子类的对象是由子类和父类共同完成的,既包含了父类数据,也包含了子类数据
public class People {
//父类
private String name;
private char sex;
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//子类
public class Teacher extends People{
private String skill;
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
}
//咨询师类 子类
public class Consultant extends People{
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
private int number;
}
public class Text {
public static void main(String[] args) {
//目标:认识继承优点
//1.创建对象,封装老师数据
//子类对象其实是由子类和父类多张设计图共同创建出来的对象
//故子类对象是完整的
//之后的存取和调用都用set和get方法
Teacher t = new Teacher();
t.setName("小王");
t.setSex('男');
t.setSkill("java");
}
}
二.权限修饰符
1.含义
就是用来限制类中的成员(成员变量,成员方法,构造器)能够被访问的范围
private:只能本类
缺省(不带任何修饰符):本类,同一个包中的类
protected:本类,同一个包中的类,子孙类中
public:任意位置
注:一般来说,中间两个很少用到,要求看到之后知道如何访问即可;一般来说只用private和public,而private一般限制成员变量(如:姓名,性别),public一般限制成员方法
三.继承的特点
- 单继承:Java是单继承模式,即一个类只能继承一个直接父类
- 多层继承:Java不支持多继承,但支持多层继承
- 祖宗类:Java中所有的类都是Object类中的子类
- 就近原则:先子类局部范围找,然后子类成员范围找,都没有才会访问父类,如果父类范围内还没有找到则报错

如果子父类中,出现了重名的成员,会优先使用子类的,如果此时一定要在子类中使用父类
可以通过super关键字,指定访问父类的成员
super.父亲成员变量/父亲成员方法
public class Text2 {
public static void main(String[] args) {
//目标2:继承后子类的访问特点,就近原则
Zi zi = new Zi();
zi.show();
}
}
class Fu{
String name = "fu的name";
}
class Zi extends Fu{
String name = "zi的name";
public void show(){
System.out.println(name);//show 的name
System.out.println(this.name);//zi的name
System.out.println(super.name);//fu的name
}
}
四.方法重写
1.含义
当子类觉得父类中的某个方法不好用,或者无法满足自己的需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法。
意思就是外面的部分要一样,里面的可以自己改写。
public class Text {
public static void main(String[] args) {
//目标:认识方法重写,在搞清楚场景
}
}
class cat extends Animal{
//方法重写
@Override //方法重写的校验注解(标志):要求方法名称和形参列表必须与被重写的方法一致,否则会报错,更安全且可读性好,更优雅
public void cry(){
System.out.println("猫会喵喵叫");
}
}
class Animal{
public void cry(){
System.out.println("动物会叫");
}
}
2.注意事项
子类重写父类方法时,访问权限必须大于or等于父类该方法的权限(public>protected>缺省)
重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小
私有方法、静态方法不能被重写,否则报错
3.应用场景
子类重写Object类的toString()方法,以便返回对象的内容,不然会输出对象的地址信息,就不是我们想要看到的数据。

五.子类构造器
1.特点
子类的全部构造器,都会先调用父类的构造器,再执行自己
用super可以调用父类的有参构造器

子类构造器是如何实现调用父类构造器的:
默认情况下,子类全部构造器的第一行代码都是super()(这个写不写都有的),它会调用父类的无参构造器
如果父类没有无参构造器,则我们必须在子类构造器的第一行手写super(...),指定去调用父类的有参数构造器
2.应用场景
可以把子类继承自父类这部分的数据完成初始化赋值

补充知识:this(...)调用兄弟构造器
任意类的构造器中,是可以通过this(...)去调用该类的其他构造器的

注意:super(...)this(...)必须写在构造器的第一行,而且两者不能同时出现,只能有一个,不然就会调用两次父类
六.多态
1.含义
多态是在继承/实现情况下的一种现象,表现为:对象多态,行为多态
people p1 = new student();
p1.run();
people p2 = new teacher();
p2.run();


方法:编译看左边,运行看右边
成员变量:编译和运行都看左边
因为多态只强调对象和行为的多态,没有强调成员变量的多态
既然强调了行为的多态,那么方法一定要去找右边重写的方法才能实现
2.多态的前提
- 有继承/实现关系
- 存在父类引用子类对象
- 存在方法重写
3.多态的注意事项
多态是对象、行为的多态,Java中的属性(成员变量)不谈多态
4.多态的好处
在多态形式下,右边对象是解耦合的,更便于扩展和维护
解耦合的大白话解释:就是给程序里的各个功能 “划清界限”,让它们不用 “互相盯着对方怎么干活”,只需要知道 “我要给你什么”“你要给我什么” 就行。这样改一个功能时,其他功能不受影响,代码也更抗造、好维护。
定义方法时,使用父类类型的形参,可以接受一切子类对象,扩展性更强,更便利
5.多态的坏处
多态下不能使用子类的独有功能
6.多态下的类型转换
作用:解决多态下不能使用子类的独有功能
自动类型转换:父类 变量名 = new 子类();
强制类型抓换:子类 变量名 = (子类)父类变量
people p = new teacher();
teacher t = (teacher)p;
强制类型转换的注意事项
存在继承/实现关系就可以在编译阶段进行强制类型转换,编译阶段不会报错
运行时,如果发现对象的真实类型与强转后的类型不同,就会报类型转换异常(ClassCastException)的错误出来
所以强转前,建议使用instanceof关键字,判断当前对象的真实类型,再进行强转
1314

被折叠的 条评论
为什么被折叠?



