区分Java的方法覆盖与变量覆盖

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

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

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

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

public class People {
 public String getName() {
  return "people";
 } 

}
public class Student extends People { 

 public String getName() {
  return "student";
 } 

}
public static void main(String[] args) {
  People p=new People();
 System.out.println(p.getName());//运行结果为people 

  Student s=new Student();
 System.out.println(s.getName());//运行结果为student 

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

 } 

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

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

public class People {
 protected String name="people"; 

}
public class Student extends People { 

 protected String name="student"; 

}
public static void main(String[] args) { 

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

  Student s=new Student();
  System.out.println(s.name);//运行结果为student 

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

 }

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

用我自己的话说:变量的覆盖最多只能算是半吊子的覆盖。

要不然,向上转换与不会发生数据丢失现象

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

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

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

public class People {
 protected String name="people";
 public String getName() {
  return name;
 }
}
public class Student extends People { 

 protected String name="student";
 public String getName() {
  return name;
 }
}
main(String[] args) { 

  People p=new People();
  System.out.println(p.getName());//运行结果为people 

  Student s=new Student();
  System.out.println(s.getName());//运行结果为student 

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

 } 

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

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

(0)

相关推荐

  • 在JDK和Eclipse下如何编写和运行Java Applet

    Java Applet的源代码如下: import java.applet.*; import java.awt.*; public class HelloWorldApplet extends Applet { public void paint(Graphics g){ g.drawString("Hello,world",40,60); } } 在Eclipse下,可以在编好程序后直接点击Run-->Run即可运行Java Applet程序. 在JDK环境下,要在自己的Ja

  • 解析Java的JVM以及类与对象的概念

    Java虚拟机(JVM)以及跨平台原理 相信大家已经了解到Java具有跨平台的特性,可以"一次编译,到处运行",在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的. 那么,跨平台是怎样实现的呢?这就要谈及Java虚拟机(Java Virtual Machine,简称 JVM). JVM也是一个软件,不同的平台有不同的版本.我们编写的Java源码,编译后会生成一种 .class 文件,称为字节码文件.Java虚拟机就是负责将字节码文件翻译成特定平

  • 完整java开发中JDBC连接数据库代码和步骤

    JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的静态方法forName(String className)实现. 例如: try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ; }catch(ClassNotFoundException e){ Sys

  • 区分Java的方法覆盖与变量覆盖

    首先,我们看看关于重载,和覆盖(重写)的简明定义: 方法重载:如果有两个方法的方法名相同,但参数不一致,哪么可以说一个方法是另一个方法的重载. 方法覆盖:如果在子类中定义一个方法,其名称.返回类型及参数签名正好与父类中某个方法的名称.返回类型及参数签名相匹配,那么可以说,子类的方法覆盖了父类的方法 我们重点说说覆盖问题,以如下代码为例: public class People { public String getName() { return "people"; } } public

  • Java的方法重载与变量作用域简介

    方法的重载 上面使用的max方法仅仅适用于int型数据.但如果你想得到两个浮点类型数据的最大值呢? 解决方法是创建另一个有相同名字但参数不同的方法,如下面代码所示: public static double max(double num1, double num2) { if (num1 > num2) return num1; else return num2; } 如果你调用max方法时传递的是int型参数,则 int型参数的max方法就会被调用: 如果传递的事double型参数,则doub

  • Java中final作用于变量、参数、方法及类该如何处理

    Java中方法用final修饰参数的作用 在方法参数前面加final关键字就是为了防止数据在方法体重被修改. 主要分为两种情况:第一,用final修饰基本数据类型:第二,用final修饰引用数据类型. 第一种情况,修饰基本数据类型,这时参数的值在方法体内是不能被修改的,即不能被重新赋值.否则编译就不通过. 第二种情况,修饰引用类型.这时参数变量所引用的对象是不能被改变的.但是对于引用数据类型,如果修改其属性的话是完全可以的. 所以,final这个关键字,想用的话就用基本数据类型,还是很有作用的.

  • Java中方法的重写与成员变量的隐藏

    这篇文章讨论了Java面向对象概念中一个基本的概念–Field Hiding(隐藏成员变量) 在讨论这个问题之前,我们看一段特别特别简单的代码,请问一下方法的数据结果是什么? /** * @author Hollis 17/9/27. */ public class FieldOverriding { public static void main(String[] args) { Sub c1 = new Sub(); System.out.println(" c1.s : " +

  • PHP和JAVA中的重载(overload)和覆盖(override) 介绍

    重载:同一个类中,函数名一样,返回值或者参数类型,个数不一样的叫做重载. 覆盖:同名函数,同返回值类型,同参数的叫做覆盖.指的是子类对父类中方法的覆盖. PHP不支持方法和操作符重载.JAVA不支持操作符的重载(但是"+"实际上是一种操作符重载). 复制代码 代码如下: <?php Class Father { public function fmeth1() { echo "fmeth1()...<br>"; } //public functio

  • PHP中的变量覆盖漏洞深入解析

    1.extract()变量覆盖 1.extract() extract() 函数从数组中将变量导入到当前的符号表. 该函数使用数组键名作为变量名,使用数组键值作为变量值.针对数组中的每个元素,将在当前符号表中创建对应的一个变量. 该函数返回成功设置的变量数目. extract(array,extract_rules,prefix) 参考引用:https://www.runoob.com/php/func-array-extract.html eg: <?php extract($_GET); e

  • Java使用贪心算法解决电台覆盖问题(示例详解)

    java使用贪心算法解决电台覆盖问题 代码实现 /** * 贪心算法实现集合覆盖 */ public class Demo { public static void main(String[] args) { // 创建电台和地区集合 HashMap<String, HashSet<String>> broadcasts = new HashMap<>(); // 创建各个电台 HashSet<String> k1 = new HashSet<>

  • Java构造器方法深入理解

    目录 重载 1.构造器的重载 2.方法的重载(overload) 重写 重载 1.构造器的重载 因为构造器的名字必须与类名相同,所以同一个类的所有构造器名肯定相同,构成重载:为了让系统能区分不同的构造器,多个构造器的参数列表必须不同. class Person{ int age; String name; public Person(){ } public Person(int age){ this.age = age; } public Person(int age,String name){

  • Java基础知识之成员变量和局部变量浅显易懂总结

    目录 引言 java变量分类 JVM中的主要内存空间 三大变量内存分配情况 三区介绍 栈区 堆区 方法区 基本介绍 成员变量 局部变量 变量使用 总结 引言 成员变量和局部变量在每种编程语言中都有涉及,如果之前了解过其他语言的成员变量或者局部变量,那么在学习java中的成员变量和局部变量时可以看看有那些联系和不同,这一块的东西也不能说难,如果第一次接触可能会感觉有点乱,所以接下来我先把java中总结的成员变量和局部变量的部分内容先列出来,带着这些内容学起来会轻松很多! java变量分类 JVM中

  • Java中方法重写与重载的区别

    目录 一.重写(Override) 二.重载(Overload) 三.总结 Java方法重写(Override)与重载(Overload)的区别(超详细) 首页在我们要学习这个知识点之前,应该要先了解什么是多态? 在最初学习java的时候,人们都知道,java这种面向对象的语言,一共有三大特征,分别是:封装.继承.多态. 多态是同一个行为具有多个不同表现形式或形态的能力. 举个例子,比如大多数动物(抽象类)会叫,但是狗(实现类)就是汪汪汪,猫(实现类)就是喵喵喵. 多态实现的必要条件 子类必须继

随机推荐