Java 重写的方法可见范围

Java Overridden method visibility scope

下面的程序如何正确?

abstract class Calculate  
{  
    abstract int multiply(int a, int b);  
}  
   
public class Main  
{  
    public static void main(String[] args)  
    {  
        int result = new Calculate()  
        {      
            @Override  
            int multiply(int a, int b)  
            {  
                return a*b;  
            }  
        }.multiply(12,32);  
        System.out.println("result = "+result);  
    }  
}  

我们正在更改覆盖方法的范围 here.It 不再是 public 并且它应该默认 scope.Is 允许覆盖方法的范围更改?

从你的代码来看,乘法不是 public 开始的。如果你改变你的 mulyiply 方法你的计算 class 到

public abstract int multiply(int a, int b); 

那就不行了

您在当前代码中创建了一个匿名子类,但您非常接近拥有一个功能接口。让我们把它改成那样,比如

@FunctionalInterface
interface Calculate {
    int multiply(int a, int b);
}

现在您有一个 单一抽象方法 并且可以使用花哨的 lambda。喜欢,

public static void main(String[] args) {
    Calculate calc = (a, b) -> a * b;
    int result = calc.multiply(12, 32);
    System.out.println("result = " + result);
}

请注意,这与您的原始示例完全一样,只是添加了 Java 8.

的语法糖

根据您的代码,计算方法不在 public 范围内,因此您没有更改范围。

abstract class Calculate {
     public abstract int multiply(int a, int b);
}

public class MyClass {

    public static void main(String[] args) {
        int result = new Calculate() {
            @Override
             public int multiply(int a, int b) {
                return a * b;
            }
        }.multiply(11,11);
        System.out.println("result = " + result);
    }

}

访问级别不能比重写方法的访问级别更严格。例如:如果声明了 super class 方法 public 那么 subclass 中的覆盖方法既不能是私有的也不能是受保护的。

现在 java 中引入了一个单独的作用域作为默认作用域,因此您可以将其称为包私有作用域。

对于 java 中的覆盖规则,您可以遵循 Link