Java 为什么这段代码是正确的(编译器不抱怨它)
我展示了一个我自己写的例子,这是因为我不理解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
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拼图书中,我发现:
您不能合法地从其他用户访问非公共类型的成员
包裹
而且
如果使用反射,可以避免这类问题
仅用于实例化,并使用接口从
类实现它们并提供高级别的类型安全性
有人能解释一下吗?这在人类语言中是什么意思
有人能解释一下吗?这在人类语言中是什么意思
说明:
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
本身声明的成员才能访问保持冷静?我们很平静。你是不是在抱怨我们把你的问题看得太快了?如果是这样,在你准备好之前不要发布。原来的问题充满了胡说八道,我们无法理解你想问什么。