【问题标题】:Java Overridden method visibility scopeJava 重写的方法可见性范围
【发布时间】:2021-09-02 17:16:35
【问题描述】:

以下程序如何正确?

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

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

【问题讨论】:

  • 为什么不再公开?它以前是包私有的,这没有改变。
  • 我们可以这样创建抽象类对象吗?
  • 你在哪里改变任何范围?
  • 是的,如您所见。这会创建一个子类的对象。
  • @dan 但这里没有子类,对吧? new Calculate(),不是子类

标签: java inheritance overriding abstract-class visibility


【解决方案1】:

从您的代码中,它一开始并不公开。如果你改变你的 mulyiply 方法,你的 Calculate 类为

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

那就不行了。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      根据您的代码,calculate 方法不在公共范围内,因此您没有更改范围。

      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

      【讨论】:

        猜你喜欢
        • 2013-09-30
        • 2016-08-24
        • 1970-01-01
        • 2014-08-17
        • 1970-01-01
        • 2018-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多