脸打肿都不要忘了呀,Java 重写时应当遵守的 11 条规则!!(1)

简介: 脸打肿都不要忘了呀,Java 重写时应当遵守的 11 条规则!!

CSDN 的小伙伴们,大家好,我是沉默王二。


重写(Overriding)算是 Java 中一个非常重要的概念,理解重写到底是什么对每个 Java 程序员来说都至关重要,这篇文章就来给大家说说重写过程中应当遵守的 12 条规则。


01、什么是重写?


重写带来了一种非常重要的能力,可以让子类重新实现从超类那继承过来的方法。在下面这幅图中,Animal 是父类,Dog 是子类,Dog 重新实现了 move() 方法用来和父类进行区分,毕竟狗狗跑起来还是比较有特色的。


image.png


重写的方法和被重写的方法,不仅方法名相同,参数也相同,只不过,方法体有所不同。


02、哪些方法可以被重写?


规则一:只能重写继承过来的方法。


因为重写是在子类重新实现从父类继承过来的方法时发生的,所以只能重写继承过来的方法,这很好理解。这就意味着,只能重写那些被 public、protected 或者 default 修饰的方法,private 修饰的方法无法被重写。


Animal 类有 move()、eat() 和 sleep() 三个方法:


public class Animal {

   public void move() { }


   protected void eat() { }

 

   void sleep(){ }

}



Dog 类来重写这三个方法:


public class Dog extends Animal {

   public void move() { }


   protected void eat() { }


   void sleep(){ }

}



OK,完全没有问题。但如果父类中的方法是 private 的,就行不通了。


public class Animal {

   private void move() { }

}



此时,Dog 类中的 move() 方法就不再是一个重写方法了,因为父类的 move() 方法是 private 的,对子类并不可见。


public class Dog extends Animal {

   public void move() { }

}



03、哪些方法不能被重写?


规则二:final、static 的方法不能被重写。


一个方法是 final 的就意味着它无法被子类继承到,所以就没办法重写。


public class Animal {

   final void move() { }

}



由于父类 Animal 中的 move() 是 final 的,所以子类在尝试重写该方法的时候就出现编译错误了!


image.png


同样的,如果一个方法是 static 的,也不允许重写,因为静态方法可用于父类以及子类的所有实例。


public class Animal {

   final void move() { }

}


重写的目的在于根据对象的类型不同而表现出多态,而静态方法不需要创建对象就可以使用。没有了对象,重写所需要的“对象的类型”也就没有存在的意义了。


image.png


04、重写方法的要求


规则三:重写的方法必须有相同的参数列表。


public class Animal {

   void eat(String food) { }

}


Dog 类中的 eat() 方法保持了父类方法 eat() 的同一个调调,都有一个参数——String 类型的 food。


public class Dog extends Animal {

   public void eat(String food) { }

}


一旦子类没有按照这个规则来,比如说增加了一个参数:


public class Dog extends Animal {

   public void eat(String food, int amount) { }

}


这就不再是重写的范畴了,当然也不是重载的范畴,因为重载考虑的是同一个类。


规则四:重写的方法必须返回相同的类型。


父类没有返回类型:


public class Animal {

   void eat(String food) { }

}



子类尝试返回 String:


public class Dog extends Animal {

   public String eat(String food) {

       return null;

   }

}



于是就编译出错了(返回类型不兼容)。



相关文章
|
6月前
|
存储 Java Go
【Java】(3)8种基本数据类型的分析、数据类型转换规则、转义字符的列举
牢记类型转换规则在脑海中将编译和运行两个阶段分开,这是两个不同的阶段,不要弄混!
323 2
|
6月前
|
安全 Java
Java异常处理:程序世界的“交通规则
Java异常处理:程序世界的“交通规则
373 98
|
Java 编译器
在Java中,关于final、static关键字与方法的重写和继承【易错点】
在Java中,关于final、static关键字与方法的重写和继承【易错点】
267 5
|
Java 编译器 数据安全/隐私保护
Java 重写(Override)与重载(Overload)详解
在 Java 中,重写(Override)和重载(Overload)是两个容易混淆但功能和实现方式明显不同的重要概念。重写是在子类中重新定义父类已有的方法,实现多态;重载是在同一类中定义多个同名但参数不同的方法,提供多种调用方式。重写要求方法签名相同且返回类型一致或为父类子类关系,而重载则关注方法参数的差异。理解两者的区别有助于更好地设计类和方法。
1238 2
|
Java 程序员
java基础(5)标识符命名规则和命名规范
Java标识符命名规则包括只能使用数字、字母、下划线\_、$,且数字不能开头,不能使用关键字命名,且严格区分大小写。命名规范建议类名、接口名首字母大写,变量名、方法名首字母小写,常量名全大写。
647 2
|
Java
Java源文件声明规则详解
Java源文件的声明规则是编写清晰、可读且符合语法规范的Java程序的基础。这些规则包括文件名必须与公共类名相同、包声明位于文件顶部、导入声明紧跟其后、类声明需明确访问级别,并允许使用注释增强代码可读性。一个源文件可包含多个类,但只能有一个公共类。遵循这些规则有助于提升代码质量和维护性。
432 28
|
Java
描述 Java 中的重载和重写
【8月更文挑战第22天】
148 0
|
存储 Java 索引
【Java基础面试二十二】、为什么要重写hashCode()和equals()?
这篇文章解释了为什么需要重写`hashCode()`和`equals()`方法:因为Object类的`equals()`默认使用`==`比较,这在业务中通常是不够的,我们需要根据对象内容来比较相等性;同时,为了保持`hashCode()`与`equals()`的联动关系,一旦重写了`equals()`,通常也需要重写`hashCode()`。
【Java基础面试二十二】、为什么要重写hashCode()和equals()?
下一篇
开通oss服务