Java 为什么这段代码是正确的(编译器不抱怨它)

Java 为什么这段代码是正确的(编译器不抱怨它),java,Java,我展示了一个我自己写的例子,这是因为我不理解java拼图中的一些东西: public class A { public A foo() {return new A();} } package library; public class C extends A { static class X extends A {} @Override public A foo(){ return new X(); } } package l

我展示了一个我自己写的例子,这是因为我不理解java拼图中的一些东西:

public class A {

    public A foo() {return new A();}

}

package library;

public class C extends A {
    static  class X extends A {}

    @Override
    public A foo(){
        return new X();
    }
}

package library;

public class B extends A {
    public static class Y extends A { }

    @Override
    public A foo(){
        return new Y();
    }

}

package client;

import library.A;
import library.B;
import library.C;

class Client {

    public static void main (String[] args){
        A b = new B();
        A c = new C();

        A bb = b.foo();
        A cc = c.foo();

        cc.hashCode(); // for me, it should causes compile error

    }
}
如您所见,
foo
方法是公共的

acc=c.foo()
-
cc
是非公共类型的实例
X

abb=b.foo()
-
bb
是公共类型的实例
Y

因此,当我们调用
cc.hashCode()
时,我们从来自不同包的非公共类型调用public方法。为什么它是正确的

为什么我这么认为

在java拼图书中,我发现:

您不能合法地从其他用户访问非公共类型的成员 包裹

而且

如果使用反射,可以避免这类问题 仅用于实例化,并使用接口从 类实现它们并提供高级别的类型安全性

有人能解释一下吗?这在人类语言中是什么意思

有人能解释一下吗?这在人类语言中是什么意思

说明:

  • Java难题书可能是指其他东西。(但谁知道呢:你还没有给我们提供背景。)

  • Java拼图书不是为Java语言设计的规范、教科书或教程。因此,我们不应该试图这样使用它。。。我们不应将其解释视为完整或明确

  • 事实上,如果非公共类的方法实现或重写在非公共类的公共超类或接口中声明的方法,则可以调用这些方法

  • 技术上的解释是

    A cc = c.foo();
    
    正在访问
    a
    中声明的
    foo()
    方法。。。这是一个
    公共
    类。
    foo()
    在非公共类中被重写的事实并不使重写方法不可访问。如果真是这样,那就违反了可替代性原则,而这正是多态性发挥作用的原则

    或者更简单地说

  • c
    A
    的一个实例
  • 每个
    A
    都有一个
    foo()
    方法
  • 任何可以看到
    A::foo()
    声明的对象都必须能够在
    A
    的任何实例上看到该方法
  • 如果它能看到它,它就能调用它


  • 严格地说,我们这里讨论的是亚型多态性。LSP也不适用于其他类型的多态性。

    为什么说
    C
    是一种私有方法?它显然不是一个方法,也不是私有的:
    public类C
    。它是公共的,不是私有的,它是一个类,不是一个方法。我犯了很多错误,我在一段时间内纠正了它。“
    cc
    是私有类型的实例
    C
    ”不,
    cc
    是嵌套类
    X
    的实例--“
    bb
    是公共类型的实例
    B
    ”否,
    bb
    是嵌套类的实例
    Y
    ——没有任何地方可以重写从类
    对象
    继承的公共方法
    hashCode()
    ,那么为什么您认为您不应该调用它呢?但是即使
    C
    是私有的,
    hashCode()
    也是
    C
    终极超类
    对象的
    公共成员,这是公共的
    。只有
    C
    本身声明的成员才能访问保持冷静?我们很平静。你是不是在抱怨我们把你的问题看得太快了?如果是这样,在你准备好之前不要发布。原来的问题充满了胡说八道,我们无法理解你想问什么。