【问题标题】:inheritance and protected class java继承和保护类java
【发布时间】:2016-04-18 11:16:59
【问题描述】:

错误: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;
                }
        }

【问题讨论】:

  • “这里的错误”到底是什么意思?
  • System.out.println(obj.mul(2,4)) 无法访问自己的方法..它被覆盖了..!
  • ImplimentPkgMultiplication 是否在不同的包中?如果是,则发生错误是因为mul 受到保护,您无法从其他包访问它。
  • 为什么我们不能访问其他包??如果我没记错的话,我们可以使用带有 procted 方法的继承吗?

标签: java


【解决方案1】:

Java tutorial 说:

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

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

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

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

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() 方法可以在子类中的任何地方访问,但不能在其他类中访问。顺便说一句,你不应该使用 protected static 方法,请参阅reasons here

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

【讨论】:

    【解决方案2】:

    在自己的 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;
        }
    }
    

    乘法.java

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

    【讨论】:

    • 我在不同的包中这样做。我想要那样。请问有什么问题吗?
    • 如果它们在不同的包中,那么你不能使用定义的保护。您必须改用 public。
    • @Leo 这不是 Pushpak 所要求的答案。
    猜你喜欢
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2010-09-14
    • 2010-10-26
    相关资源
    最近更新 更多