开发者社区> 问答> 正文

(Java)为什么这段带default方法接口的实现的代码会报错??报错

package wu;
interface InterfaceA                            // 定义一个接口
    {
        public static String INFO = "static final." ;      // 全局常量
        public void print() ;                        // 抽象方法
        default public void otherprint()               // 带方法体的默认方法
        {
            System.out.println("print default1 methods InterfaceA!");
        }
    }
    class InterfaceAB implements InterfaceA          //子类InterfaceAB实现接口InterfaceA
    {
        public void print()                        //覆定接口中的抽象方法
        {
            System.out.println("print abstract methods InterfaceA!");
            System.out.println(INFO);  
        }
    }
  public class Interfacedefault 
    {
        public static void main(String[] args) 
        {
            InterfaceAB ab=new InterfaceAB();       //实例化子类对象
            ab.print();                            //调用覆写过的抽象方法
            ab.otherprint();                        //调用接口中的默认方法
            System.out.println(InterfaceA.INFO);      //输出接口中的常量
        }
    }

展开
收起
爱吃鱼的程序员 2020-06-06 09:57:55 616 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
                        <p>楼主所示的JAVA代码没错。用 <img height="189" src="https://oscimg.oschina.net/oscnet/ac2d557124095ac505fbef0174a5719e923.jpg" width="843">编译、运行都在掌控之中,不会报错。</p>
                    
    
                        <p>default方法是Java8提供的新特性,如果你的Eclipse使用的jdk低于8,或者配置工程Java语法检查低于javase-1.8,那么可能会出现这个错误,一个Java Compile配置界面如下图。</p> 
    

                        default和public不能同时修饰  java8接口写只能用default
                    
    
                        <p>含有抽象方法的类,必定是冠以关键字 abstract 的抽象类。极端情况,如果在一个类的定义中,包含的全部是抽象方法,那就只有是接口 interface。换言之,接口就是抽象类的极端情况。但是,这种说法,仅在 jdk1.8之前,成立。<br> jdk 1.8 对接口又有了新规定:可以包括 冠以 关键词 default 的 缺省/默认方法。换言之,jdk 1.8 允许 给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法。</p> 
    

    楼主的接口 interface interfaceA 里含有 缺省/默认 default 的带方法体的方法 otherprint(),编译报错。那楼主一定用的是 jdk1.8 之前的版本来编译的。

    比如下列代码,如果用jdk1.8以前的版本编译,就通不过。我用jdk1.8,就会成功通过编译,并顺利运行。

    interface A {
    	default void print(){
    		System.out.println("顺应天意");
    	}
    	
    	void print1();
    }
    public class T implements A {
      public void print1(){
      	System.out.println("了却凡尘 ");
      }
        public static void main(String[] args) {
        	T t = new T();
        	t.print();
        	t.print1();
           
        }
    }

     

    输出:

    D:\java\test\OS_China>javac T.java
    
    D:\java\test\OS_China>java T
    顺应天意
    了却凡尘
    
    D:\java\test\OS_China>java -version
    java version "1.8.0_162"
    Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
    Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)
    
    D:\java\test\OS_China>

     

                        <p>jdk环境问题,检查eclipse的编译环境,工程jdk版本,或者用maven的话pom里的编译插件等等;代码在jdk8+是没有问题的</p>
    
    2020-06-06 09:58:12
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载