如何解决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);
}
}
我们在这里改变覆盖方法的范围。它不再是公共的,它应该是默认范围。是否允许覆盖方法的范围改变?
解决方法
您在当前代码中创建了一个匿名子类,但您非常接近拥有一个功能接口。让我们把它改成那样,比如
@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 中添加了语法糖。
,从你的代码来看,它的乘法一开始就不是公开的。如果您将您的 mulyiply 方法更改为您的计算类
public abstract int multiply(int a,int b);
那就不行了。
,根据您的代码,计算方法不在公共范围内,因此您不会更改范围。
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);
}
}
访问级别不能比重写方法的访问级别更严格。例如:如果超类方法声明为 public,则子类中的覆盖方法既不能是私有的,也不能是受保护的。
现在在 java 中引入了一个单独的作用域作为默认作用域,因此您可以将其称为包私有作用域。
对于 Java 中的覆盖规则,您可以遵循 Link
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。