我有一个关于OOP的问题。我需要你的帮助!

时间:2010-07-22 11:50:53

标签: oop

请参阅以下代码:

package bk;

public class A { 
    protected void methodA() {
        System.out.println("Calling the method A !");
    }
}

// And I have an another package :   

package com;
import bk.A;

public class B extends A {
    public void methodB() {
        System.out.println("Goi phuong thuc B !");
    }

    public static void main(String[] args) {
         A a = new B();
         a.methodA();

    }
}

如何允许a拨打methodA()

3 个答案:

答案 0 :(得分:6)

原因methodA()受保护,只能在派生类中调用。如果您想像这样调用它,请将其更改为公开

答案 1 :(得分:0)

受保护的方法只能从类本身或派生类中调用。

a变量声明为A类型的变量。类A本身没有公开methodA,因此您无法调用它。

是的,您为B变量分配了一个新的a实例,a.methodA()语句位于派生的B类中,但编译器只看到a 1}}属于A类型。它也可以是 A的任何其他子类,在这种情况下,您仍然无法访问methodA

您必须告诉编译器a变量实际上是B类型。然后,您就可以拨打methodA,因为您是在课程B内拨打的。

B a = new B();

答案 2 :(得分:0)

您正试图访问methodA(),因为它是公开的。在B类中简单地声明methodA()很好,但你不能a.methodA()

相反,如果它不是一种方法而只是protected int a; 你可以做到

课程a = 1;

中的

B

但是

A a = new A();
a.a = 1;

不合法

继承类可以看到protected方法,甚至不是同一个包的一部分。包范围(默认)方法不是。这是受保护范围和包范围之间的唯一区别。

理论上,有人使用protected访问权限扩展您的课程,而不是仅仅使用public访问权限的人知道他们所做的事情。他们还需要更多访问你班级的内部工作。除此之外,protected的行为类似于默认包访问。