Java继承避坑:super()与this()不能共存?方法重写与重载的区别一次性讲清

发布时间:2026/7/13 21:51:04
Java继承避坑:super()与this()不能共存?方法重写与重载的区别一次性讲清 前言为什么要有继承提高代码的重用性减少一些重复代码的书写一.继承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等于父类该方法的权限publicprotected缺省重写的方法返回值类型必须与被重写方法的返回值类型一样或者范围更小私有方法、静态方法不能被重写否则报错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关键字判断当前对象的真实类型再进行强转