继承和受保护的类java

时间:2016-01-13 12:59:10

标签: java

错误:mul(int,int)在乘法

中具有受保护的访问权限

关于我做错了什么的想法?

public class Multiplication{
            protected int mul(int a,int b){
                return (a*b);
            }
        }

        class ImplimentPkg extends Multiplication {
            public static void main(String args[]){

                Multiplication obj=new ImplimentPkg();
               //Here's the error
                System.out.println(obj.mul(2,4));

            }
            protected int mul(int a,int b){

                    System.out.println("");
                    return 0;
                }
        }

2 个答案:

答案 0 :(得分:2)

Java tutorial说:

  

protected修饰符指定只能在自己的包中访问该成员(与package-private一样),此外,还可以在另一个包中通过其类的子类访问。

您可能认为您已匹配第二种情况(继承)。

Multiplication obj = new ImplimentPkg();
System.out.println(obj.mul(2, 4));

这意味着您正在使用父类乘法的实例。虽然代码在Multiplication的子类方法中。这并不意味着实例obj与继承有关。当然,mul(...)方法是不可见的。您可以做的是:使用关键字超级

public void bar() {
    Multiplication mul = new Multiplication();
    mul.mul(1, 2);  // <- error
    super.mul(1, 2); // correct
    Multiplication.foo(); // correct
}

注意:如果在父类中有受保护的静态方法,例如:

public class Multiplication {
    private String name = "some";

    protected int mul(int a, int b) {
        return (a * b);
    }

    protected static void foo() {
        System.out.println("foo");
    }
}

这里foo()方法可以在子类中的任何地方访问,但不能访问其他类。顺便说一下,您不应该使用受保护的静态方法,请参阅reasons here

您可能会对另一个相关主题感兴趣,请参阅here

答案 1 :(得分:-1)

在自己的Java文件中创建每个类

ImplimentPkg.java

package my;

class ImplimentPkg extends Multiplication {
    public static void main(String args[]) {

        Multiplication obj = new ImplimentPkg();
        System.out.println(obj.mul(2, 4));

    }

    protected int mul(int a, int b) {

        System.out.println("");
        return 0;
    }
}

Multiplication.java

package my;

public class Multiplication {
    protected int mul(int a, int b) {
        return (a * b);
    }
}