子类不能继承父类的私有属性,但是如果子类中公有的方法影响到了父类私有属性,那么私有属性是能够被子类使用的。

一、示例解释一

/*** 定义父类* @author CBS*/
public class Father {private String name;//私有属性private char sex;public void tell(){System.out.println(name+sex);}private void speak(){System.out.println(name+"is speaking!");}public String getName() {return name;}public void setName(String name) {this.name = name;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}}/*** 定义子类,子类中什么都不写。* @author CBS*/
public class Child extends Father {}/*** 定义测试类* @author CBS*/
public class Test {public static void main(String[] args) {Child c=new Child();c.tell();//tell方法是可以用的//c.speak();//报错,父类的私有方法不可见}}

我们可以看到测试类中即使没有给Child类对象的属性进行赋值,tell方法依旧是可用的。如果Child类中没有继承父类的私有属性,那么tell方法应该会报错。由此得出的结论是,子类会继承父类的所有东西,而修饰符只是影响属性或者方法对外是否可见。

但是个人比较同意Java官方文档的解释:子类不能继承父类的私有属性,但是如果子类中公有的方法影响到了父类私有属性,那么私有属性是能够被子类使用的。

Java中修饰符的作用是封装类中的属性和方法使其对外不可见,官方文档的解释很好的兼顾了Java的继承和封装。继承是为了更好的提高代码的重用性,封装则保护了代码的不可见部分。在编写代码的过程中,我们显然即想提高代码的重用性,也不希望类中的某些域被随意修改。那么这样的继承机制就很合理了。另外就生活中的例子来说,Java官方文档的解释也很契合。比如,我们不可能完全继承父母的一切(如性格等),但是父母的一些无法继承的东西却仍会深刻的影响着我们。

二、示例解释二

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

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

(1)子类覆盖父类的方法,必须有同样的参数返回类型,否则编译不能通过
          (2)子类覆盖父类的方法,在jdk1.5后,参数返回类可以是父类方法返回类的子类
         (3)子类覆盖父类方法,可以修改方法作用域修饰符,但只能把方法的作用域放大,而不能把public修改为private
          (4)子类方法能够访问父类的protected作用域成员,不能够访问默认的作用域成员
         (5)子类的静态方法不能隐藏同名的父类实例方法

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

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

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

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

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

并且我们也应该这样做。

[html] view plain copy
  1. public class Person{
  2. private String name;
  3. public Person(String name){
  4. this.name = name;
  5. }
  6. public void setName(String name){
  7. this.name = name;
  8. }
  9. public String getName(){
  10. return name;
  11. }
  12. }
[html] view plain copy
  1. public class Student extends Person{
  2. public Student(String name){
  3. super(name);
  4. }
  5. }
[html] view plain copy
  1. public class TestStudent{
  2. public static void main(String[] args){
  3. Student mStudent = new Student("abc");
  4. String mName = mStudent.getName();
  5. System.out.println("Name is : " + mName);
  6. mStudent.setName("efg");
  7. mName = mStudent.getName();
  8. System.out.println("Name is : " + mName);
  9. }
  10. }

打印结果为:

Name is : abc

Name is efg

Java 拾遗补阙 ----- 继承私有属性相关推荐

  1. java 反射父类私有属性值_如何在Java中通过反射访问父类的父类的私有字段? - java...

    在一个API中,我使用的是一个抽象类(A类),该类具有一个私有字段(A.privateField). B类在API中扩展了A类. 我需要扩展B类的实现,即C类,但是我需要A类的privateField ...

  2. python私有属性怎么定义_Python中私有属性的定义方式

    Python没有类似于Java的private关键字, 但也可以为类定义私有属性. 只需将属性命名变为以__开头, 例如 __field. 示例代码: class Vector2D(object): ...

  3. 在java继承机制中 父类中的私有_Java中子类能继承父类的私有属性吗?

    前段时间去听老师讲课的时候,老师告诉我子类是可以继承父类所有的属性和方法的.当时我是极其疑惑的,因为之前学校考试时这个考点我记得很清楚:子类只能继承父类的非私有属性和方法.老师给我的解释是这样的--先 ...

  4. JAVA 类的继承(私有属性、自动转型)(入门级小白一看就懂)

    JAVA 类的继承 文章目录 JAVA 类的继承 概述 1. 类的继承 1.1 引言 1.2 继承的定义 1.3 继承的规则 1.4 继承的格式 1.5 类的继承实例分析 2 私有属性 3 自动转型 ...

  5. java可以继承私有的,在java继承中,私有属性能否被继承

    其实在继承中,子类可以继承父类的私有属性的内容空间,但是不能继承父类私有属性的访问权限,下面看代码 父类Animal public class Animal { private String name ...

  6. java 子类 复制_关于java子类继承来的属性与方法究竟是完全复制还是共用使用...

    关于java子类继承来的属性与方法究竟是完全复制还是共用使用 关于java子类继承来的属性与方法究竟是完全复制还是共用使用 今天在学习java的面向对象时,无意间发现一个问题. public clas ...

  7. java mock私有方法_JMockit Mock 私有方法和私有属性

    前面说过 JMockit 因身处前线,所以简直无不可,本节例子演示 JMockit 怎么 Mock 私有方法和私有属性,示例虽然是静态方法和属性,但因采用的是反射手法,所以这种 Deencapsula ...

  8. java中私有属性能不能被继承?

    java中私有属性能不能被继承? 以前的课堂中,老师讲继承的时候说过:子类可以继承父类中的属性和方法.可是当我们写代码的时候却能出现一些不一样的情况. 其原因在什么地方?之后通过代码的验证发现出现在了 ...

  9. 子类到底能不能继承父类的私有属性?

    概念 继承就像是我们现实生活中的父子关系,儿子可以遗传父亲的一些特性,在面向对象语言中,就是一个类可以继承另一个类的一些特性,从而可以代码重用,其实继承体现的是is-a关系,父类同子类在本质上还是一类 ...

  10. Java (1)写一个类,名为Animal, 该类有两个私有属性,name(代表动物的名字),和legs(代表动物的腿的条数);要求为两个私有属性提供public的访问方法。并提供两个重载的构造方法,

    Java (1)写一个类,名为Animal, 该类有两个私有属性,name(代表动物的名字),和legs(代表动物的腿的条数);要求为两个私有属性提供public的访问方法.并提供两个重载的构造方法, ...

最新文章

  1. wordpress安装
  2. Linux 删除和替换文件中某些行的方法
  3. Deformable ConvNets--Part2: Spatial Transfomer Networks(STN)
  4. 矩阵的三维变换(转)
  5. 学习ribbon,进来看看吧
  6. 2010年十大改变电信业的小趋势
  7. java面试题二十四 继承题2
  8. mysql处理时间_MYSQL时间处理  (转)
  9. [html] 说说js代码写到html里还是单独写到js文件里哪个好?为什么?
  10. LeetCode 1814. 统计一个数组中好对子的数目(哈希)
  11. java swing界面工具_Java GUI swing 工具包使用总结
  12. GoF23种设计模式之行为型模式之策略模式
  13. 数据分析师熬夜整理:最全「零售业」数据指标和使用技巧
  14. CCF201609-1 最大波动(100分)
  15. 一文教你如何深入机器学习,从编程基础到完整的项目实战
  16. 如何在Mac上更改声音输出设置呢?
  17. Selenium如何处理类悬浮弹出菜单
  18. os.getcwd()
  19. C++内存汇编逆向安全全集
  20. live2d碰撞_Euclidの基本について

热门文章

  1. 腾讯服务器微信分身,腾讯禁止微信双开应用,为什么还有那么多人“冒死”双开微信呢?...
  2. 记号, 函数空间及不等式
  3. word打印设置相关
  4. matlab 如何设置工作路径
  5. 服务器虚拟化的几种方式,服务器虚拟化究竟应当选择哪种方式?
  6. 计算机新功能,利用win7新功能提升工作效率
  7. 路由器修改html,徒手修改大麦路由器dw33d,变luci中文界面,并开启ssh
  8. 笔记本Win11连接WiFi后显示无Internet访问权限怎么办
  9. php 加密解密函数 sha,使用sha1()函数进行加密-php加密技术
  10. Redis Gossip广播通信 1.gossip原理概述