最近在学习到Java的继承和多态时遇到了这样的一个问题:关于继承链中子类对父类的私有方法是否可以覆盖的问题,在此记录一下自己对这个问题解决以后的一些心得。

首先要明确:子类是不能够覆盖(重写)父类的私有方法的。比较直观的理由是,子类要能够重写父类的方法的前提条件是继承,子类对父类的私有方法并不继承,也没有访问权限,自然也是不能重写的。接下来看一个例子:

[java] view plaincopy

public class Test {

public static void main(String[] args) {

new A().printPerson();

new B().printPerson();

}

}

class A {

public void printPerson() {

System.out.println(getInfo());

}

private String getInfo() {

return "A";

}

}

class B extends A{

public String getInfo() {

return "B";

}

}

运行结果是 A A。如果将private修饰词去掉,换成protected和public修饰,运行结果是A B这是毫无疑问的,因为那正是B重写了父类A的getInfo方法;而加上了private修饰词以后,父类A的getInfo和子类B的getInfo实际上就是两个无关的方法,因为私有方法是不能被子类重写的,私有方法并不是父类接口的一部分,只是隐藏在父类中的一段程序代码。

可是为什么使用子类B的实例调用printPerson,结果是打印A呢?要注意到printPerson方法是在父类A中定义的,因此刚执行new B().printPerson()这行代码时,编译器在子类B中无法找到匹配的printPerson方法,于是到父类A中去寻找;此时在父类A中找到了匹配的printPerson方法,并调用该方法。

此处需要提及一下子类在继承父类时对父类的成员变量及方法继承的问题。对于使用protected或者public修饰的成员变量及方法,会被子类继承,且可通过子类直接调用,那么,对于子类不可见的private成员,以及没有修饰词修饰的成员(若子类与父类在不同的包中,这一类成员也是对子类不可见的),他们不被子类继承,那么在子类的实例所代表的内存空间中,这些成员是否存在呢?答案是肯定的,父类的私有变量及方法虽然不会被子类继承,对于子类来说不可见,但当创建了子类的实例的时候,这些成员一样会被加载入内存,并“隐藏”在内存当中。

因此,通过子类B的实例调用printPerson方法,会在父类的成员中寻找匹配的printPerson方法,找到以后,进入printPerson的方法体,调用getInfo方法,程序回到上层去寻找getInfo方法的匹配,并在内存空间中寻找到了A中的getInfo方法,同时由于该getInfo方法是私有的,无法被重写,因此不会触发java的动态绑定机制,于是直接调用该方法。因此,通过B的实例调用printPerson,打印的结果也是A了。

============================================

最近学习继承,从书中看到子类继承父类,子类拥有父类所有的属性和方法,于是使用程序去验证,发现父类的私有属性和私有方法,子类是不能访问的,当然一些父类的私有属性可能可以通过相应的方法访问到,但是私有的方法似乎不能简单的访问,这里暂不考虑Java反射机制,于是我分析,子类不能继承父类私有的属性及方法,但是分析了内存后,我发现我是错的,在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象。所以所谓的继承使子类拥有父类所有的属性和方法其实可以这样理解,子类对象确实拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能使用。就像有些东西你可能拥有,但是你并不能使用。所以子类对象是绝对大于父类对象的,所谓的子类对象只能继承父类非私有的属性及方法的说法是错误的。可以继承,只是无法访问到而已。

当子类覆盖父类的成员变量时,父类方法使用的是父类的成员变量,子类方法使用的是子类的成员变量

(1)子类覆盖父类的方法,必须有同样的参数返回类型,否则编译不能通过

(2)子类覆盖父类的方法,在jdk1.5后,参数返回类可以是父类方法返回类的子类

(3)子类覆盖父类方法,可以修改方法作用域修饰符,但只能把方法的作用域放大,而不能把public修改为private

(4)子类方法能够访问父类的protected作用域成员,不能够访问默认的作用域成员

(5)子类的静态方法不能隐藏同名的父类实例方法

不能继承,子类只能在父类中写一个public的getXXX的方法来获取父类中的private属性,子类就调用父类的getXXX来获取private属性

父类中的公有方法和域(属性),在类继承中将会被子类继承,但是私有的将不能被继承。

那么在继承中子类如何才能继承到父类的私有域呢?

答案是:在子类的构造方法中通过super()方法调用父类的构造方法。

也就是,在构造子类的同时,为子类构造出跟父类相同的域。如此就在子类的对象中,也拥有了父类声明的域了。

并且我们也应该这样做。

[html] view plaincopy

public class Person{

private String name;

public Person(String name){

this.name = name;

}

public void setName(String name){

this.name = name;

}

public String getName(){

return name;

}

}

[html] view plaincopy

public class Student extends Person{

public Student(String name){

super(name);

}

}

[html] view plaincopy

public class TestStudent{

public static void main(String[] args){

Student mStudent = new Student("abc");

String mName = mStudent.getName();

System.out.println("Name is : " + mName);

mStudent.setName("efg");

mName = mStudent.getName();

System.out.println("Name is : " + mName);

}

}

打印结果为:

Name is : abc

Name is efg

============================================

Java-子类没有继承父类的私有变量和私有方法

在Java子类有没有继承父类的私有变量?关于这个问题在网上找了很久,也没有一个明确的答案。于是综合大家的观点,自己总结了一下。

java子类可以修改父类成员吗_子类重写父类成员方法相关推荐

  1. qt 子类调用父类的函数_子类调用父类方法

    当有相同的属性或者方法是this子类表示调用自己的属性或者方法, super调用父类的属性或者方法. 当子类调用的属性方法在子类中不存在时,那么this和super都是调用父类的属性或者方法 1.方式 ...

  2. qt 子类调用父类的函数_子类中调用父类的方法

    父类名 . __init__(self, ...) 可以将父类中的init中的属性重复调用,减少代码的重复 class Vehicle: def __init__(self, name, speed, ...

  3. java 不能同时修改一条记录_【免费毕设】JAVA+SQL离散数学题库管理系统(源代码+论文+外文翻译)...

    点击上方"蓝字"关注我们目录 系统设计 本章主要介绍离散数学题库管理软件中后台数据库的结构设计.数据库结构设计是继需求分析和确定开发工具后的重要阶段,是管理型软件开发设计的核心和重 ...

  4. java限制只能修改一次订单_面试官再问你怎么修改订单,就把这篇甩给他

    从下单开始.支付.发货,收货,每一个环节,都少不了更新订单,每一次更新又需要同时更新好几张表. 这些操作可能被随机分布到很多台服务器上执行,服务器有可能故障,网络有可能出问题. 那么如何才能保证订单服 ...

  5. php子类没有构造函数父类有构造函数_如何向父类构造函数传递参数,如果父类中存在构造函数并且需要参数,子类在造对象的时候也应该传入相应的参数( )...

    [单选题]六个基本视图的投影规律是"主俯仰后:长对正;( ):高平齐; 俯左仰右:宽相等." [单选题]儿童文学无论是什么文体,都强调什么? [单选题]正在治疗的学生肺结核病患者可 ...

  6. java不可以修改的修饰语_【填空题】在java程序中,用关键字___修饰的常量对象创建后就不能再修改了。...

    下列物质长期放置在敞口容器中,质量不变的是A.氢氧化钠固体B.石灰水C.浓硫酸D.大理石 学习和生活中的下列变化,属于化学变化的是()A.雪糕慢慢融化B.吃进的食物被消化C.氢氧化钠潮解D.敞口放置的 ...

  7. java 子类的同名方法_子类父类拥有同名的方法时……

    子类父类拥有同名的方法时-- (这个程序是不能运行的) packageyanzheng; public classParentChildTest { public static voidmain(St ...

  8. java子类和父类有相同成员_Java -- 父类和子类拥有同名的成员变量的情况

    Java – 父类和子类拥有同名的成员变量取值情况 参考文章 结论: 当子类的成员变量与父类同名时,若对该成员变量进行操作的方法继承于父类,则改变和获取的是父类的成员变量.若对该成员变量进行操作的方法 ...

  9. java子类访问父类私有成员_Java中子类可以继承父类的私有成员,但是不能(直接)访问!!!...

    今天学习Java三大特征之一:继承的时候,产生了一些疑问,最后通过网上查找和各位网友的帮助,终于拔开云雾见日出.下面进入正题: 首先:子类对象拥有父类中的所有属性和方法:在这里,很多人会问构造器可以继 ...

最新文章

  1. iOS开发中用到的一些第三方库
  2. 首次发现:你的大脑“指纹”,全球独一份
  3. Oracle字符集的查看查询和Oracle字符集的设置修改
  4. python处理声音
  5. asp.net 发布程序到iis后无法连接到oralce数据库问题
  6. Hadoop Streaming二次排序
  7. nginx不记录指定文件类型的日志
  8. RH033 Unit 2 Linux Usage Basics
  9. centos8 apache php,centos6.8安装php7 for Apache2
  10. 搭建 S3C6.410 开发板的 测试环境
  11. SLAM Evaluation 之轨迹对齐论文翻译Closed-Form Solution of Absolute Orientation Using Orthonormal Matrices
  12. python实现对图片的一些简单处理
  13. 笔记-微信订阅号开发
  14. dva脚手架创建的项目目录结构分析
  15. MAYA如何做3D logo
  16. 虚拟机服务器双通道和四通道,双通道和四通道区别
  17. 【Vscode】解决报错 An SSH installation couldn‘t be found
  18. Java的Io模型你了解多少?linuxmysql安装位置
  19. 计算机组成原理mips描述,计算机组成原理与接口技术:基于MIPS架构/华中科技大学教学改革建设教材...
  20. 浅谈Prim,Kruskal最小生成树算法

热门文章

  1. 猫和老鼠欢乐互动辅助材料 游戏玩法脚本挂机技巧
  2. Don’t Shave Yaks,别给耗牛剪毛_kiteseas_新浪博客
  3. python学习之表白的爱心图形
  4. R语言数据可视化 | 绘制帕累托图
  5. python利用百度云接口实现文字OCR功能
  6. 什么是网络安全CTF有何意义?该如何入门?
  7. 【MFC】自制版洛克人X展示
  8. 实验6 多表连接查询
  9. python挂机脚本阴阳师_记一次阴阳师挂机脚本开发
  10. 微软正式发布 Visual Studio 2022