浅谈java的方法覆盖与变量覆盖

简介: 浅谈java的方法覆盖与变量覆盖

首先,我们看看关于重载,和覆盖(重写)的简明定义:

方法重载:如果有两个方法的方法名相同,但参数不一致,哪么可以说一个方法是另一个方法的重载。

方法覆盖:如果在子类中定义一个方法,其名称、返回类型及参数签名正好与父类中某个方法的名称、返回类型及参数签名相匹配,那么可以说,子类的方法覆盖了父类的方法

我们重点说说覆盖问题,以如下代码为例:

[java]  view plain  copy
 print ?
  1. public class People {  
  2.     public String getName() {  
  3.         return "people";  
  4.     }  
  5.   
  6. }  
  7. public class Student extends People {  
  8.       
  9.     public String getName() {  
  10.         return "student";  
  11.     }  
  12.       
  13. }  
  14. public static void main(String[] args) {  
  15.         People p=new People();  
  16.         System.out.println(p.getName());//运行结果为people  
  17.     
  18.         Student s=new Student();  
  19.         System.out.println(s.getName());//运行结果为student  
  20.     
  21.         People pp=new Student();  
  22.         System.out.println(pp.getName());//运行结果为student  
  23.   
  24.     }  

上述结果说明:student类的getName方法成功覆盖了父类的方法

我们再来看看变量的覆盖:

[java]  view plain  copy
 print ?
  1. public class People {  
  2.     protected String name="people";  
  3.   
  4.       
  5. }  
  6. public class Student extends People {  
  7.       
  8.     protected String name="student";  
  9.           
  10. }  
  11. public static void main(String[] args) {  
  12.           
  13.                   
  14.         People p=new People();  
  15.         System.out.println(p.name);//运行结果为people  
  16.           
  17.         Student s=new Student();  
  18.         System.out.println(s.name);//运行结果为student  
  19.           
  20.         People pp=new Student();  
  21.         System.out.println(pp.name);//运行结果为people  
  22.   
  23.     }  


通过运行结果我发现:变量的覆盖实际上与方法的不尽相同.

用我自己的话说:变量的覆盖最多只能算是半吊子的覆盖.
要不然,向上转换与不会发生数据丢失现象

People pp=new Student();
System.out.println(pp.name);//运行结果为people

就我个人的经验来说:变量的覆盖很容易让人犯错误.让人感觉又回到了C++的继承[这里不是指C++带virtual的继承]

最后我们再来看一段代码:

[java]  view plain  copy
 print ?
  1. public class People {  
  2.     protected String name="people";  
  3.     public String getName() {  
  4.         return name;  
  5.     }  
  6. }  
  7. public class Student extends People {  
  8.       
  9.     protected String name="student";  
  10.     public String getName() {  
  11.         return name;  
  12.     }  
  13. }  
[java]  view plain  copy
 print ?
  1. main(String[] args) {  
  2.           
  3.         People p=new People();  
  4.         System.out.println(p.getName());//运行结果为people  
  5.           
  6.         Student s=new Student();  
  7.         System.out.println(s.getName());//运行结果为student  
  8.           
  9.         People pp=new Student();  
  10.         System.out.println(pp.getName());//运行结果为student  
  11.   
  12.     }  


显然,如此的覆盖,才是对我们更有用的覆盖,因为这样才能达到:把具体对象抽象为一般对象的目的,实同多态性

以上只是我个人的看法,有不对的地方欢迎指出来讨论.

相关文章
|
10天前
|
Java 编译器
java“变量 x 可能未被初始化”解决
在Java中,如果编译器检测到变量可能在使用前未被初始化,会报“变量 x 可能未被初始化”的错误。解决方法包括:1. 在声明变量时直接初始化;2. 确保所有可能的执行路径都能对变量进行初始化。
|
10天前
|
算法 Java Linux
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
这篇文章介绍了如何使用Java的Graphics2D类在图片上合成另一个照片,并将照片切割成圆形头像的方法。
21 1
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
|
4天前
|
Java Apache Maven
Java将word文档转换成pdf文件的方法?
【10月更文挑战第13天】Java将word文档转换成pdf文件的方法?
15 1
|
8天前
|
Java 编译器
Java“返回类型为 void 的方法不能返回一个值”解决
在 Java 中,如果一个方法的返回类型被声明为 void,那么该方法不应该包含返回值的语句。如果尝试从这样的方法中返回一个值,编译器将报错。解决办法是移除返回值语句或更改方法的返回类型。
|
8天前
|
Java
让星星⭐月亮告诉你,Java NIO之Buffer详解 属性capacity/position/limit/mark 方法put(X)/get()/flip()/compact()/clear()
这段代码演示了Java NIO中`ByteBuffer`的基本操作,包括分配、写入、翻转、读取、压缩和清空缓冲区。通过示例展示了`position`、`limit`和`mark`属性的变化过程,帮助理解缓冲区的工作原理。
17 2
|
8天前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
14 1
|
8天前
|
Java
让星星⭐月亮告诉你,Java synchronized(*.class) synchronized 方法 synchronized(this)分析
本文通过Java代码示例,介绍了`synchronized`关键字在类和实例方法上的使用。总结了三种情况:1) 类级别的锁,多个实例对象在同一时刻只能有一个获取锁;2) 实例方法级别的锁,多个实例对象可以同时执行;3) 同一实例对象的多个线程,同一时刻只能有一个线程执行同步方法。
9 1
|
13天前
|
Java 编译器
在Java中,关于final、static关键字与方法的重写和继承【易错点】
在Java中,关于final、static关键字与方法的重写和继承【易错点】
19 5
|
10天前
|
存储 算法 Java
java制作海报六:Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题
这篇文章是关于如何在Java中使用Graphics2D的RenderingHints方法来提高海报制作的图像质量和文字清晰度,包括抗锯齿和解决文字不清晰问题的技术详解。
17 0
java制作海报六:Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题
|
13天前
|
Java 编译器 C语言
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
16 3