在java中,不同的子类对父类的方法是否有不同的可见性

在java中,不同的子类对父类的方法是否有不同的可见性,java,design-patterns,inheritance,visibility,Java,Design Patterns,Inheritance,Visibility,是否可能不同的子类对父类的方法具有不同的可见性。假设有一个类a定义了10个方法。它有两个不同的子类B和子类C。ClassB和ClassC是否有可能访问ClassA的不同方法。像ClassB只能访问ClassA中定义的10个方法中的6个,ClassC只能访问ClassA中的其他4个方法?ClassB和ClassC在同一个包中 谢谢, Asit您可以使用接口来实现这一点,但不能使用具体的类 我认为上课是不可能的。要分离功能,应该使用接口,而不是扩展类 如果您需要像那样划分方法,那么类A很可能违反了

是否可能不同的子类对父类的方法具有不同的可见性。假设有一个类a定义了10个方法。它有两个不同的子类B和子类C。ClassB和ClassC是否有可能访问ClassA的不同方法。像ClassB只能访问ClassA中定义的10个方法中的6个,ClassC只能访问ClassA中的其他4个方法?ClassB和ClassC在同一个包中

谢谢,
Asit

您可以使用接口来实现这一点,但不能使用具体的类

我认为上课是不可能的。要分离功能,应该使用接口,而不是扩展类

如果您需要像那样划分方法,那么类A很可能违反了

然后看看如何使用它从简单的类组成复杂的类。还可以看一看

将您的功能划分为如下界面-

public interface IFlyable
{
    void FlapWings();

    void Fly();
}

public interface IHuntingAnimal
{
    void Hunt();
}
然后像这样实现您的类-

public class Duck : IFlyable { ...

public class Eagle : IFlyable, IHuntingAnimal { ...

public class Tiger : IHuntingAnimal { ..

注意:这个例子是用C语言编写的。您需要计算出java等价物。

从您编写的代码中,我想您得到的是

package first;
class A {
    protected methodA() {...}
    private methodB() {...}
    public methodC() {...}
    methodD() {...}
}

package second;
class B extends A {...}
class C extends A {...}
在本例中,B和C将只看到类A中的方法methodA和方法C

methodB是私有的,因此无法访问


方法是包保护,也就是说,在同一个PACGGAE中,以一种奇怪的方式来限制一个等价于C++的朋友关键词,我现在意识到了,因此,首先不能在Pigge之外看到。

< P>不理解你的意思……/P> 父类的方法通常可能具有不同的访问修饰符作为可能的固有类。但有一个条件引用自lang spec:

重写或隐藏方法的访问修饰符必须提供至少与重写或隐藏方法相同的访问权限,否则会发生编译时错误


您不能约束类的可用性,也就是说,如果类a中的方法受到保护,那么您可以将类B中的重写方法声明为public。但是它不起作用,反之亦然

这个答案取决于你对child类这个词的使用 简短回答否 更长的答案 在这种情况下: 类基类有以下方法:method1、method2、method3 使用Java无法设置以下情况: 类Derived1该类扩展了类基,可以访问method1和method2,但不能访问method3。 类Derived2该类扩展了类基,可以访问method1、method2和method3。 两个类都在同一个包中。 在Java中,当一个类扩展另一个类时,这些东西始终适用:

派生类可以调用基类的每个公共方法。 派生类可以调用基类的每个受保护方法。 派生类不能调用基类的任何私有方法。 如果派生类与基类在同一个包中, 派生类可以调用基类的每个包访问方法。
我不知道你问题的来龙去脉,所以我不能评论你的设计是否合理,你的动机是否合理。由于其他人已经采取了需要重构的立场,我将做相反的事情,并假设它是一个合理的类,具有一个明确定义的目的,并且不需要细分

在这种情况下,为什么不使用对象适配器模式来实现您的目标呢?通过实现将调用转发给ClassA适配器的包装器方法,可以公开希望在ClassB和ClassC适配器中使用的ClassA方法。当然,您可以选择扩展这些方法。

或模式将对您有所帮助