1.前言

最近在研究Java多态时,发现子类通过继承父类来实现Java中的多态。子类可以继承父类的成员方法和成员变量。子类中如果有同名的成员方法,并且方法的参数和返回值一样,那么这个子类定义的这个方法将覆盖父类的方法。那么如果子类有同名的成员变量呢,情况又会怎么样呢?通过继承可以得到父类的成员变量,子类的成员变量包括从父类继承的成员变量(包括从祖先类中继承的成员变量)以及子类中重新定义的成员变量。本次介绍内容包括:可以继承哪些成员?如果子类和父类出现了相同的成员变量如何处理?

2.可以继承的成员变量

可以继承的成员变量与成员变量的访问控制类型有关,成员变量的访问控制类型包括public、protected、缺省的和private。

子类继承父类之后,可以继承父类的public和protected类型的成员变量。例如:

public class Parent{public int i_public;int i_default;protected int i_protected;private int i_private;}public class Child extends Parent{private int i_child;}

父类的成员变量包括:

  • public int i_public;
  • int i_default;
  • protected int i_protected;
  • private int i_private;

子类的成员变量包括:

  • public int i_public; // 继承自父类
  • protected int i_protected;// 继承自父类
  • private int i_child; //在子类中声明的

3.覆盖父类的成员变量

假设父类中定义了成员变量i并且能够被子类继承,子类中又定义了成员变量i,这样子类中会有两个名字为a的成员变量,如何访问呢?

我们来看下面这个例子:

class Father {int i = 10;public void setI(int i) {this.i = i;}
}class Son extends Father {int i = 20;public void show() {System.out.println("super.i : " + super.i + ";this.i : " + this.i);}
}public class Main {public static void main(String[] args) {Son son = new Son();Father parent = new Son();System.out.println(parent.i);System.out.println(son.i);System.out.println();son.setI(100);son.show();System.out.println(son.i);}
}运行结果:
10
20super.i : 100;this.i : 20
20

首先我们要注意的是:

  1. 从父类继承的成员变量,其访问控制符仍然相同。
  2. 子类定义与父类同名的成员变量,并没有覆盖父类的成员变量,而是两个成员变量共存

即使子类声明了与父类完全一样的成员变量,也不会覆盖掉父类的成员变量。而是在子类实例化时,会同时定义两个成员变量,子类也可以同时访问到这两个成员变量(this.i&super.i),但父类不能访问到子类的成员变量(父类不知道子类的存在)。

而具体在方法中使用成员变量时,究竟使用的是父类还是子类的成员变量,则由方法所在的类决定;即,方法在父类中定义和执行,则访问的是父类的成员变量,方法在子类中定义(包括覆盖父类方法)和执行,则访问的是子类的成员变量。在方法调用中,我们通过java虚拟机JVM的内存模型来分析这个问题,在方法调用中,方法首先通过栈帧压入到虚拟机栈中。然后栈帧中的局部变量表的第一个Slot的值将传入当前对象的引用,如果是父类方法,当前对象的引用传入Father this。如果是子类方法,当前方法的引用传入Son this,如下面所示。

  • 对于 setI 方法,它的原型应该是setI(Father this, int i)
  • 而对于show方法,它的原型应该是show(Son this)

Father parent = new Son();

当存在一个子类对象向上转型为父类引用时候,对parent这个引用的访问成员变量时。访问的是父类成员变量

如何手动的选择对父类成员变量的访问还是对子类成员变量的访问?下面我们来看以下两个例子:

  1. 如果在child类中如何访问自己的成员和父类的成员内,通过super来访问,例如下面的代码:
public int getParentA(){return super.a;
}public int getChildA(){return a;
}
  1. 访问子类的成员变量可以使用this,例如下面的代码:
public int getChildA(){return this.a;
}

Java基础:成员变量的继承与覆盖相关推荐

  1. [JAVA基础] 成员变量和局部变量(一看就懂的总结归纳篇)

    引言 成员变量和局部变量在每种编程语言中都有涉及,如果之前了解过其他语言的成员变量或者局部变量,那么在学习java中的成员变量和局部变量时可以看看有那些联系和不同,这一块的东西也不能说难,如果第一次接 ...

  2. Java基础--成员变量和局部变量(区别、重名问题)

    成员变量和局部变量 注:所有的变量没有赋值是不能使用的!!! 两者的区别:定义的位置不同:成员变量:定义在类中成员位置的变量,称为实例变量 / 类变量,在类中方法外局部变量:定义在类中方法中作用范围不 ...

  3. 谈谈java中成员变量与成员方法继承的问题

    谈谈java中成员变量与成员方法继承的问题 关于成员变量和成员方法的的继承问题,我也可以做一个小测试,来看看结果. 首先我们先创建一个父类: 其次再创建一个子类,子类中要比父类中少一个成员方法: 这样 ...

  4. 【零基础学Java】—成员变量和局部变量(九)

    [零基础学Java]-成员变量和局部变量(九)

  5. Java基础以及变量和运算符、包机制、javadoc生成

    Java基础以及变量和运算符.包机制.javadoc生成 注释.标识符.关键字 注释 标识符 关键字 标识符注意点 数据类型 强类型语言 弱类型语言 Java的数据类型 基本类型(primitive ...

  6. java基础之类变量和类方法:程序员成长之路

    java基础之类变量和类方法: 一.类变量(静态变量): 1.基本介绍: 类变量也叫静态变量.静态属性,是该类的所有对象共享的变量,任何一个该类的对象去访问它时,渠道的都是相同的值,同样任何一个该类的 ...

  7. java中成员变量和全局变量的区别_成员变量与全局变量的区别

    全局变量:也叫成员变量,是指在类中定义的变量:它在整个类中都有效 全局变量又可分为:类变量和实例变量 1.类变量:又叫静态变量  用static修饰  它可以直接用类名调用  也可以用对象调用   而 ...

  8. java 中成员变量的名字和类的方法的名字可以一样.

    java 中成员变量的名字和类的方法的名字可以一样. public class fourone {public static void main(String[] args) {int first[] ...

  9. java 反射 成员变量_java基础--反射(成员变量)

    这里介绍通过反射获取对象的成员变量,以及修改成员变量. package Reflect.field; public class Point { int y; public int getY() { r ...

最新文章

  1. Spark的RDD依赖关系
  2. Java魂斗罗1234合集_《魂斗罗》正统续作1234部介绍,别再搞错喽!
  3. html任务3 模拟滚动条,vue3系列:vue3.0自定义虚拟滚动条V3Scroll|vue3模拟滚动条组件...
  4. 《苏醒之路》制作人王鲲:独立游戏如何成功出海?
  5. 鸿蒙升级后能恢复安卓吗,升级了鸿蒙系统怎么卸载鸿蒙系统?升级了鸿蒙还能用安卓吗?...
  6. 查看计算机ping,通过ping命令检测主机的存活性
  7. 二阶高通有源滤波器设计与仿真测试
  8. 智能计算机与应用期刊,智能计算机与应用期刊是省级期刊吗
  9. python 字符串时间带有月份简写 星期简写 时区, 格式化为其他样式
  10. 洛克人java下载_洛克人5-布鲁斯的阴谋
  11. 基于echarts+html+css+jq的数据可视化大屏展示炫酷看板[附源码]
  12. 设置Mysql数据库的默认编码为utf8
  13. 携程、同程、QQ音乐、天猫...等14款APP被点名:涉嫌过度收集用户信息
  14. Arty A7开发板 + PULPino开源处理器折腾笔记
  15. 企业微信监控服务器数据接入,如何在alertmanager报警中添加企业微信监控报警
  16. nas 软件 性能测试,理论读写性能测试
  17. 【JavaSE 第八天】
  18. qrc路径_QT中添加的资源文件qrc时的路径问题小结
  19. 游戏建模初学者必看的游戏人物模型贴图制作方法及制作小技巧
  20. N - DAG优化SDUT

热门文章

  1. 需求工程阅读笔记01
  2. Android—将Bitmap图片保存到SD卡目录下或者指定目录
  3. 第7课第2节_Binder系统_c++实现_编译测试
  4. 用Anko和Kotlin实现Android上的对话框和警告提示(KAD 24)
  5. ORA-600(qerltcInsertSelectRop_bad_state)错误
  6. FusionCharts Free(3)
  7. 有一种道理叫“实践”
  8. Linux系统编程之查看文件大小的方法(lseek and stat)
  9. Python语言编程之正则表达式模式
  10. 工业机器人行业研究报告