这是一个有趣的代码片段:

public class Superclass {

public static void main (String[] args){

Superclass obj = new Subclass();

obj.doSomething(); #prints"from Superclass"

}

private void doSomething(){System.out.println("from Superclass");}

}

class Subclass extends Superclass {

private void doSomething(){System.out.println("from Subclass");}

}

我知道子类不会继承其父级的私有成员,但是obj设法调用它应该没有访问权限的方法。 在编译时,obj的类型为Superclass,在运行时类型为Subclass。

这可能与doSomething()的调用发生在驱动程序类中的事实有关,这恰好是它自己的类(以及为什么可以首先调用doSomething())。

所以问题归结为,obj如何访问其父级的私有成员?

有趣的是看看子方法公开时会发生什么。 我已经做到了,它说:"来自Superclass"有趣的是,它没有超越它

私有方法仅适用于所有者。

甚至不是所有者的孩子,亲戚或朋友。

你自己回答了。由于私有方法不是继承的,因此超类引用会调用自己的私有方法。

如果通过"reference"表示存储在变量obj中的指针引用的Subclass实例,则它是一个循环答案。 该实例仍然是Subclass类型,它不应该访问父项私有成员。

关键是你将它分配给超类引用。 并且该方法是私有的,它不会被子类实现覆盖。 该引用只知道一个doSomething方法,它位于超类中。

Superclass obj = new Subclass();

此时,obj是事物,Subclass和Superclass对象。在变量声明中使用Superclass这一事实只是一个问题。

执行:obj.doSomething()时,您告诉编译器调用obj的私有方法doSomething()。因为您是从Superclass内的主静态方法执行的,所以编译器可以调用它。

如果您使用Subclass的main方法而不是Superclass中的方法,则无法访问该方法,因为正如您所说,它既不是继承的,也不是Subclass定义的一部分。

所以基本上你正确理解了继承。问题与私有方法的可见性有关。

它的工作原理是因为您从Superclass的方法中转换为Superclass。在该上下文中,编译器可以使用Superclass.doSomething。

如果要将超级和子类更改为两个不同的任意类A和B,与包含main方法的类无关,并尝试相同的代码,编译器会抱怨无法访问该方法。

由于对象obj的引用类型是Superclass,因此对doSomething()的调用尝试访问Superclass本身中定义的私有方法(不能覆盖私有方法)。

由于doSomething()可在Superclass内访问,main方法可以调用doSomething()而不会给出任何错误。

希望这可以帮助! :-)

当你使用这一行时:

Superclass obj = new Subclass();

您将Subclass转换为超类对象,该对象仅使用超类的方法和相同的数据。如果将它转换回子类,则可以再次使用Subclass方法,如下所示:

((Subclass)obj).doSomething(); #prints"from Subclass"

给定OP代码,((Subclass)obj).doSomething(); #prints"from Subclass"不会编译,因为您正在访问其类Subclass之外的私有方法。

why it's possible to invoke doSomething() in the first place?

为什么不? obj是Subclass和Superclass的实例,并且doSomething()在Superclass中声明并且obj中使用了doSomething(),因此您可以访问Superclass.doSomething(),您可以尝试重命名您的方法(例如:doAnotherThing()),您仍然可以访问它。

how does obj have access to a private member of its parent?

私有方法没有父/子,并且obj也是Superclass的类型,因此它可以访问在其中声明的所有私有方法/字段,因为在此类中使用了obj。如果您不在Superclass之外或者具有Superclass作为成员的类(嵌套类),您将失去此访问权限。

所以呢?

Superclass的私有方法和Subclass的私有方法之间没有关系/继承,即使它们具有相同的名称和签名,来自Java语言规范,Java SE 8版:

A private method and all methods declared immediately within a final

class (§8.1.1.2) behave as if they are final, since it is impossible

to override them.

要理解这个问题,您可以将私有方法与超类和子类的成员变量相关联。

所以我们知道成员变量不会在子类中被覆盖。

例如:

Class A{

int i = 10;

}

Class B extends A{

int i = 11;

}

Class C extends A {

int i = 12;

}

A a1 = new B();

print(a1.i) // Will print 10

A a2 = new B();

print(a2.i) // Will print 10

类似的方式,当没有继承引用变量时,将考虑超类。

您想通过显示最后两行代码来说明什么? 它们与前面的直线相同吗?

是的,他们是相同的..我只给了两个子类而不是一个..我认为一个应该没问题。

当我们在派生类中定义具有相同名称的私有方法时,它将成为一个新方法,因为派生类不会继承私有成员。

由于私有方法在类外部甚至不可见,我们永远不能从派生类调用基类私有方法,它会抛出一个编译错误:

线程"main"中的异常java.lang.Error:未解决的编译问题:

类型为Base的方法aPrivateMethod()不可见

我们可以使用向下转换到父类引用来调用派生类私有方法,该方法只能在该派生类中访问。

java可以继承私有的,关于java:继承中的私有方法相关推荐

  1. Java 8:声明接口中的私有方法和受保护的方法

    引入Java 8时,我们可以在接口中使用默认方法. 此功能的主要驱动程序是允许扩展接口,同时保留对旧接口版本的向后兼容性. 一个示例是在现有Collection类中引入stream()方法. 有时,当 ...

  2. 在java中私有方法能被重载吗_我可以在Java中重载私有方法吗?

    重载是实现多态的一种机制,其中,一个类包含两个具有相同名称和不同参数的方法. 每当您调用此方法时,方法主体都将基于参数与方法调用绑定. 重载私有方法 是的,我们可以在Java中重载私有方法,但是您可以 ...

  3. Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法?

    文章目录 前言 一.私有方法在本类中直接调用 1.1.在本类中实例化,调用私有方法 1.2.尝试在其他类直接调用私有方法(错误示范) 二.使用反射实例化类强制调用私有方法 2.1.使用类加载器加载被调 ...

  4. java mysbatis select_java相关:详解Mybatis中的select方法

    java相关:详解Mybatis中的select方法 发布于 2020-7-3| 复制链接 摘记: selectById方法根据id,查询记录 ```java public void updateRe ...

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

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

  6. java 访问私有成员,在Java中访问私有方法?

    how to implement such a functionality to access private members ? Java checks access permissions dur ...

  7. java junit 私有方法_有没有办法在Junit5中的另一个方法中模拟私有方法调用

    下面是我想测试的方法,但据我所知Junit5不支持PowerMockito.那么有什么方法可以在另一个方法内部模拟私有方法调用吗? public Class MyClass { private voi ...

  8. java遍历list删除数据,遍历删除List中的元素方法

    red hat enterprise linux 8到图书 129.9元 (需用券) 去购买 > 1.通过增强的for循环删除符合条件的多个元素 /** * 使用增强的for循环 * 在循环过程 ...

  9. Java 9 接口私有方法

    Java 9 接口私有方法 Java 9已经发布,并且已经发生了很多变化.今天我们将研究接口中Java 9私有方法的变化. 目录[ 隐藏 ] 1接口中的Java 9私有方法 1.1 Java 7接口 ...

最新文章

  1. 在C#中应用哈希表(Hashtable)
  2. Kafka manager安装 (支持0.10以后版本consumer)
  3. Oracle索引失效问题
  4. NIO详解(四):NIO编程
  5. 以后开药的时候,最后一定问一句,哪些药有激素
  6. 十大面试问题解惑,秒杀一切HR、技术面试。iOS程序员必读!
  7. javascript Date日期类
  8. C#中生成随机数的方法和语句
  9. Java中使用POI导出excel文件
  10. 听说你是程序员,请问你知道龙书、虎书、鲸书、魔法书、犀牛书...指的是哪些书么?...
  11. 钱钟书论“反者道之动”
  12. Power按键流程分析
  13. C语言入门,编写程序,输出两个整数中的较大值。
  14. 如何在高德地图windowInfo弹窗中使用VUE组件
  15. CUDA以及NVCC编译流程
  16. 基于JSP的物流信息管理系统(MySQL版)
  17. read函数---------详解
  18. 前端阿里矢量图的使用步骤
  19. android判断解锁,android判断手机SIM状态
  20. 网络变压器是干什么用的?(以太网 网络 LAN 局域网 通讯隔离滤波器)生产工厂/产品原理图/常用产品/价格影响因素

热门文章

  1. linux得到低权shell,oracle低权限下获取shell
  2. android+php最佳实践视频,Android和PHP开发最佳实践 PDF 第2版
  3. python pip3 pip_Python:pip 和pip3的区别
  4. deep linux 看视频卡,在Deepin 20等Linux系统下用Chrome看虎牙直播经常卡的处理
  5. arduino蜂鸣器音乐代码青花瓷_教你用 Arduino 制造简易金属探测器
  6. baq在聊天中啥意思_职场中的“老实人”如何实现逆袭,得到领导的重用?
  7. 数组维度超过了支持的范围_数组公式基础:多值和单值结果_
  8. 国内设计灵感网站,设计师学习必备
  9. jmap 定时生成linux,linux – 创建heapdumps的替代方案,性能比jmap更高?
  10. C++ Lambda表达式demo