1

代码片段如下:

    interface Demo {   
        void incrementCount();  
        int getCount();  
     }    

    class ChildDemo implements Demo {   
        public int count = 10; 

        private void incrementCount() {    
             count++;   
        }   

        public int getCount(){    
             return count;   
        }       

        public static void main(String[] args){    
             int res;    
             Demo  ob= new ChildDemo ();    
             res = ob.getCount();    
             System.out.println(res);   
        }  
    }

而且,我得到的输出如下:

    Compilation Error:incrementCount() in ChildDemo cannot implement incrementCount() in Demo; attempting to assign weaker access privileges to the method.

我想澄清几点:
1. 为什么会出错?什么试图分配较弱的访问权限?
2. 将其更改为private- 该方法incrementCount()仍然可以执行其计算吗?
3. 应该做哪些改变才能得到输出

10


4. 应进行哪些更改以获得输出:

11

提前致谢。

4

4 回答 4

1

默认情况下,接口中声明的所有方法都是公共的和抽象的。所以你需要在实现类中定义这些方法,或者你必须将类声明为抽象类。

您必须了解覆盖方法的规则才能消除此错误。其中一条规则说,被覆盖的方法不能具有较弱的访问说明符。因此,您不能在被覆盖的方法中将公共方法设为私有或受保护。公开您的Child 类重写方法,您的代码应该可以正常工作。

于 2013-05-02T06:00:26.673 回答
1

一件事是根据规范不允许这样做,但是如果您可以授予该方法private访问权限,那么它将不再可见,从而违反了接口的合同。在您的示例中,您永远不会调用incrementCount(),因此count变量的值将保留10

于 2013-05-02T05:55:52.817 回答
1

因为您将方法访问限制为private.

接口中的所有方法都是隐式公共的,无论您是否显式声明它。

http://docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html

公共访问说明符表示该接口可以被任何包中的任何类使用。如果您没有指定接口是公共的,那么您的接口将只能被定义在与接口相同的包中的类访问。

于 2013-05-02T05:56:42.200 回答
1

接口内声明的方法是隐式public的,接口中声明的所有变量都是隐式的公共静态最终(常量)。

但是,您正在使用private访问权限

private void incrementCount(){    
    count++;   
} 

所以解决方法是将public关键字添加到方法中

public void incrementCount(){    
count++;   
} 
于 2013-05-02T05:57:44.837 回答