Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多态性-派生类中的访问说明符已更改_Java_Polymorphism - Fatal编程技术网

Java 多态性-派生类中的访问说明符已更改

Java 多态性-派生类中的访问说明符已更改,java,polymorphism,Java,Polymorphism,嗨,我只是想了解以下行为。。 我在基类和派生类中使用不同的访问权限定义了相同的方法-gg() Class Base { // some thing **private** Integer gg(){ //return something } } Class Derived{ // something **public** Integer gg(){ //return something } } 在我初始化变量时的main方法中 Base

嗨,我只是想了解以下行为。。 我在基类和派生类中使用不同的访问权限定义了相同的方法-gg()

Class Base  
{  
// some thing   
**private** Integer gg(){  
 //return something   
 }  
}

Class Derived{  
// something  
**public** Integer gg(){  
//return something  
}  
}
在我初始化变量时的main方法中

  Base d = new Derived()  
尝试调用d.gg(),它表示Base.gg()是私有的。修改访问说明符是否会使方法调用还原为基类方法?。当我将基类中gg()的访问说明符更改为public时,它会像多态性一样调用派生类中的方法


从我读到的关于多态性的内容来看,在派生类中减少访问说明符的限制是可以的,这里就是这种情况。

通过对基类的引用访问对象意味着您打算通过基类指定的接口访问它。如果您在基类中声明了一个方法
private
,那么您不能通过对基类的引用来访问它

想想如果不是这样的话,接下来会发生什么荒谬的事情:

Base b;

if (some condition) {
    b = new Base();
}
else {
    b = new Derived();
}

b.ggg();  // Ok, or not?

通过对基类的引用访问对象意味着您打算通过基类指定的接口访问它。如果您在基类中声明了一个方法
private
,那么您不能通过对基类的引用来访问它

想想如果不是这样的话,接下来会发生什么荒谬的事情:

Base b;

if (some condition) {
    b = new Base();
}
else {
    b = new Derived();
}

b.ggg();  // Ok, or not?

在Java中,超类的私有成员在派生类中不可见。因此,在派生类中,不可能

  • 引用超类的私有成员-它们在那里,但您无法访问它们,它们是超类的内部细节,不用于派生类
  • 重写私有方法

因此,在您的示例中,
Derived.gg()
方法没有覆盖
Base.gg()
方法
Derived.gg()
只是一个与
Base
类中的方法同名的方法,但它们没有任何共同之处。也没有名称冲突,因为派生类不知道
Base.gg()
方法。

在Java中,超类的私有成员在派生类中不可见。因此,在派生类中,不可能

  • 引用超类的私有成员-它们在那里,但您无法访问它们,它们是超类的内部细节,不用于派生类
  • 重写私有方法

因此,在您的示例中,
Derived.gg()
方法没有覆盖
Base.gg()
方法
Derived.gg()
只是一个与
Base
类中的方法同名的方法,但它们没有任何共同之处。也没有名称冲突,因为
派生的
类不知道
Base.gg()
方法。

不是它们没有继承,只是它们在派生类中不可见。@Oli Charlesworth,你说得对。我不是特别的Enoguth-我改变了措辞。这不是因为它们不是继承的,只是它们在派生类中不可见。@Oli Charlesworth,你是对的。我不是特别的Enoguth-我改变了措辞。我的帖子中的对象d存储了对派生类的引用,对吗?那么,变量类型决定了方法的访问权限,而不是它所指的实际对象吗?好的,我现在明白了。谢谢。我的帖子中的对象d存储了对派生类的引用,对吗?那么,变量类型决定了方法的访问权限,而不是它所指的实际对象吗?好的,我现在明白了。谢谢