1、重写:
在Java和其他一些高级面向对象的编程语言中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作
2、应用:
重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法时,实际执行的是子类重写父类的方法。
3、重写的规定:
//方法的声明
权限修饰符 返回值类型 方法名(形参列表) throws 异常的类型{
方法体
1 //方法的声明 2 权限修饰符 返回值类型 方法名(形参列表) throws 异常的类型{ 3 方法体 4 }
约定俗称:子类中的叫重写的方法,父类中的叫被重写的方法。
子类重写的方法的方法名和形参列表与父类被重写的方法名和形参列表相同。
子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符。
特殊情况:子类不能重写父类中声明为privite权限的方法。
返回值类型:
父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型只能是void。
父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或A类的子集。
父类被重写的方法的返回值类型是基本数据类型(比如:double),则子类重写的方法的返回值类型必须是相同的基本数据类型。
子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型。
子类和父类中的同名同参数的方法要么都声明为非static的(考虑重写),要么都声明为static的(不是重写)。
4、super关键字:
super关键字的使用:
在子类的成员方法中,访问父类的成员变量。
在子类的成员方法中,访问父类的成员方法。
在子类的构造方法中,访问父类的构造方法。
super和this关键字的区别:
this在本类的成员方法中,访问本类的成员变量。
this在本类的成员方法中,访问本类的另一个成员方法。
this在本类的构造方法中,访问本类的另一个构造方法。
我们可以在子类的构造器中显式的使用“super(形参列表)”的方式,调用父类中声明的指定的构造器。
“Super(形参列表)”的使用,必须声明在子类构造器的首行。
我们在类的构造器中,针对“this(形参列表)”或者“super(形参列表)”只能二选一,不能同时出现。
在构造器的首行,没有显示的声明“this(形参列表)”或者“super(形参列表)”,则默认调用的是父类中空参的构造器。
在类的多个构造器中,至少有一个类的构造器中使用“super(形参列表)”,调用父类中的构造器。
5、实例:
1 //父类 2 package extendsTest; 3 4 public class Father { 5 private String name; 6 private int age; 7 private String sex;//性别 8 9 public Father() { 10 System.out.println("父亲无处不在"); 11 } 12 13 public Father(String name, int age, String sex) { 14 this.name = name; 15 this.age = age; 16 this.sex = sex; 17 } 18 19 public String getName() { 20 return name; 21 } 22 23 public void setName(String name) { 24 this.name = name; 25 } 26 27 public int getAge() { 28 return age; 29 } 30 31 public void setAge(int age) { 32 this.age = age; 33 } 34 35 public String getSex() { 36 return sex; 37 } 38 39 public void setSex(String sex) { 40 this.sex = sex; 41 } 42 43 public void work(){ 44 System.out.println("父亲要开始工作了"); 45 } 46 public void eat(){ 47 System.out.println("父亲要吃饭了"); 48 } 49 }
1 //子类 2 package extendsTest; 3 4 public class Son extends Father { 5 private String IDcard; 6 7 public Son(){ 8 super(); 9 } 10 11 public Son(String name, int age, String sex, String IDcard) { 12 super(name, age, sex);//调用父类中的属性 13 this.IDcard = IDcard; 14 15 } 16 17 public String getIDcard() { 18 return IDcard; 19 } 20 21 public void setIDcard(String IDcard) { 22 this.IDcard = IDcard; 23 } 24 public void eat(){ 25 //eat方法的重写 26 System.out.println("儿子要吃饭了"); 27 super.eat();//调用父类的方法 28 } 29 }
1 //测试 2 package extendsTest; 3 4 public class Test { 5 public static void main(String[] args) { 6 Son son=new Son("tom",23,"男","12345678"); 7 son.eat(); 8 System.out.println("IDcard="+son.getIDcard()+",name="+son.getName()+",age="+son.getAge()+",sex="+son.getSex()); 9 Son son2=new Son(); 10 11 12 } 13 }
重载
重载(overloading) 发生在本类。
定义:方法名必须一致,参数列表必须不同(参数的个数或类型不同),返回值类型可以相同也可以不同。即定义在同一类中的两个或多个方法同名但不同参,这就叫做方法的重载。
1 package day_11_26; 2 3 /** 4 * @author soberw 5 */ 6 public class Overloading { 7 8 /** 9 * 以下方法构成重载 10 */ 11 //初始方法 12 public void sum() { 13 14 } 15 //构成重载,因为参数列表不同 16 public void sum(int i) { 17 18 } 19 //报错,因为参数列表相同 20 // public void sum(int a){ 21 // 22 // } 23 24 //构成重载,因为参数类型不同 25 public void sum(String i) { 26 27 } 28 //报错 重载跟方法有无返回值无关系 29 // public int sum(int i){ 30 // 31 // } 32 //构成重载 ,因为参数列表和长度都不同 33 public void sum(int i,int j){ 34 35 } 36 //报错 重载与修饰符无关 37 protected void sum(int i){ 38 39 } 40 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构