首页 > 解决方案 > Java 重写的方法可见性范围

问题描述

以下程序如何正确?

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);  
    }  
}  

我们在这里更改覆盖方法的范围。它不再是公共的,它应该是默认范围。是否允许覆盖方法的范围更改?

标签: javainheritanceoverridingabstract-classvisibility

解决方案


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

@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 中添加了语法糖。


推荐阅读