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
下面的程序如何正确?
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