Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 抽象方法的异常行为_Java_Interface_Javac - Fatal编程技术网

Java 抽象方法的异常行为

Java 抽象方法的异常行为,java,interface,javac,Java,Interface,Javac,我是一名java初学者,正在学习使用接口。据我所知,实现接口的类必须给出其抽象方法的定义,如果它是一个具体的类。但我按照以下步骤做了,结果错误地得到了一个非常不寻常的行为。下面是我所做的 首先,我创建了一个名为Printable的接口,并将其保存在文件Printable.java中: public interface Printable{ public void print(); public void show(); default void defaultMethod

我是一名java初学者,正在学习使用接口。据我所知,实现接口的类必须给出其抽象方法的定义,如果它是一个具体的类。但我按照以下步骤做了,结果错误地得到了一个非常不寻常的行为。下面是我所做的

首先,我创建了一个名为Printable的接口,并将其保存在文件Printable.java中:

public interface Printable{
    public void print();
    public void show();
    default void defaultMethod(){
        System.out.println("default method is called");
    }
}
然后我创建了两个类ClassA和ClassB,它们实现了可打印性,如下所示:

public class Test{
    public static void main(String args[]){
        ClassA a1 = new ClassA();
        a1.print();
        ClassB b1 = new ClassB();
        b1.print();
        a1.defaultMethod();
    }
}
harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.java  ClassB.java  Printable.java  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
./ClassA.java:1: error: ClassA is not abstract and does not override abstract method show() in Printable
public class ClassA implements Printable{
       ^
./ClassB.java:1: error: ClassB is not abstract and does not override abstract method show() in Printable
public class ClassB implements Printable{
       ^
2 errors
harsh@harsh-Inspiron-3558:~/java/upload$ 
public interface Printable{
    public void print();
    //public void show();
    default void defaultMethod(){
        System.out.println("default method is called");
    }
}
harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.class  ClassA.java  ClassB.class  ClassB.java  Printable.class  Printable.java  Test.class  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ java Test 
object of class A is created
print called from class A
Object of class B is created
print called from class B
default method is called
harsh@harsh-Inspiron-3558:~/java/upload$
public interface Printable{
    public void print();
    public void show();
    default void defaultMethod(){
        System.out.println("default method is called");
    }
}
harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.class  ClassA.java  ClassB.class  ClassB.java  Printable.class  Printable.java  Test.class  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
harsh@harsh-Inspiron-3558:~/java/upload$ java Test 
object of class A is created
print called from class A
Object of class B is created
print called from class B
default method is called
harsh@harsh-Inspiron-3558:~/java/upload$ 
A类:

public class ClassA implements Printable{
    public ClassA(){
        System.out.println("object of class A is created");
    }
    public void print(){
        System.out.println("print called from class A");
    }
}
B类:

public class ClassB implements Printable{
    public ClassB(){
        System.out.println("Object of class B is created");
    }
    public void print(){
        System.out.println("print called from class B");
    }
}
我创建了一个名为test的测试类,如下所示:

public class Test{
    public static void main(String args[]){
        ClassA a1 = new ClassA();
        a1.print();
        ClassB b1 = new ClassB();
        b1.print();
        a1.defaultMethod();
    }
}
harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.java  ClassB.java  Printable.java  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
./ClassA.java:1: error: ClassA is not abstract and does not override abstract method show() in Printable
public class ClassA implements Printable{
       ^
./ClassB.java:1: error: ClassB is not abstract and does not override abstract method show() in Printable
public class ClassB implements Printable{
       ^
2 errors
harsh@harsh-Inspiron-3558:~/java/upload$ 
public interface Printable{
    public void print();
    //public void show();
    default void defaultMethod(){
        System.out.println("default method is called");
    }
}
harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.class  ClassA.java  ClassB.class  ClassB.java  Printable.class  Printable.java  Test.class  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ java Test 
object of class A is created
print called from class A
Object of class B is created
print called from class B
default method is called
harsh@harsh-Inspiron-3558:~/java/upload$
public interface Printable{
    public void print();
    public void show();
    default void defaultMethod(){
        System.out.println("default method is called");
    }
}
harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.class  ClassA.java  ClassB.class  ClassB.java  Printable.class  Printable.java  Test.class  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
harsh@harsh-Inspiron-3558:~/java/upload$ java Test 
object of class A is created
print called from class A
Object of class B is created
print called from class B
default method is called
harsh@harsh-Inspiron-3558:~/java/upload$ 
我知道在编译上面的类时,我会出错,因为我故意没有给出类A和B中可打印接口的抽象方法show()的定义,我编译该类如下:

public class Test{
    public static void main(String args[]){
        ClassA a1 = new ClassA();
        a1.print();
        ClassB b1 = new ClassB();
        b1.print();
        a1.defaultMethod();
    }
}
harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.java  ClassB.java  Printable.java  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
./ClassA.java:1: error: ClassA is not abstract and does not override abstract method show() in Printable
public class ClassA implements Printable{
       ^
./ClassB.java:1: error: ClassB is not abstract and does not override abstract method show() in Printable
public class ClassB implements Printable{
       ^
2 errors
harsh@harsh-Inspiron-3558:~/java/upload$ 
public interface Printable{
    public void print();
    //public void show();
    default void defaultMethod(){
        System.out.println("default method is called");
    }
}
harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.class  ClassA.java  ClassB.class  ClassB.java  Printable.class  Printable.java  Test.class  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ java Test 
object of class A is created
print called from class A
Object of class B is created
print called from class B
default method is called
harsh@harsh-Inspiron-3558:~/java/upload$
public interface Printable{
    public void print();
    public void show();
    default void defaultMethod(){
        System.out.println("default method is called");
    }
}
harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.class  ClassA.java  ClassB.class  ClassB.java  Printable.class  Printable.java  Test.class  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
harsh@harsh-Inspiron-3558:~/java/upload$ java Test 
object of class A is created
print called from class A
Object of class B is created
print called from class B
default method is called
harsh@harsh-Inspiron-3558:~/java/upload$ 
所以我想在Printable中注释方法show()的声明,我这样做了,并将文件保存如下:

public class Test{
    public static void main(String args[]){
        ClassA a1 = new ClassA();
        a1.print();
        ClassB b1 = new ClassB();
        b1.print();
        a1.defaultMethod();
    }
}
harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.java  ClassB.java  Printable.java  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
./ClassA.java:1: error: ClassA is not abstract and does not override abstract method show() in Printable
public class ClassA implements Printable{
       ^
./ClassB.java:1: error: ClassB is not abstract and does not override abstract method show() in Printable
public class ClassB implements Printable{
       ^
2 errors
harsh@harsh-Inspiron-3558:~/java/upload$ 
public interface Printable{
    public void print();
    //public void show();
    default void defaultMethod(){
        System.out.println("default method is called");
    }
}
harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.class  ClassA.java  ClassB.class  ClassB.java  Printable.class  Printable.java  Test.class  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ java Test 
object of class A is created
print called from class A
Object of class B is created
print called from class B
default method is called
harsh@harsh-Inspiron-3558:~/java/upload$
public interface Printable{
    public void print();
    public void show();
    default void defaultMethod(){
        System.out.println("default method is called");
    }
}
harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.class  ClassA.java  ClassB.class  ClassB.java  Printable.class  Printable.java  Test.class  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
harsh@harsh-Inspiron-3558:~/java/upload$ java Test 
object of class A is created
print called from class A
Object of class B is created
print called from class B
default method is called
harsh@harsh-Inspiron-3558:~/java/upload$ 
现在重新编译时,错误消失了,输出如下:

harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.class  ClassA.java  ClassB.class  ClassB.java  Printable.class  Printable.java  Test.class  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ java Test 
object of class A is created
print called from class A
Object of class B is created
print called from class B
default method is called
harsh@harsh-Inspiron-3558:~/java/upload$
到目前为止一切正常,但现在我决定删除Printable中声明show()的注释,并将其保存如下:

public class Test{
    public static void main(String args[]){
        ClassA a1 = new ClassA();
        a1.print();
        ClassB b1 = new ClassB();
        b1.print();
        a1.defaultMethod();
    }
}
harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.java  ClassB.java  Printable.java  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
./ClassA.java:1: error: ClassA is not abstract and does not override abstract method show() in Printable
public class ClassA implements Printable{
       ^
./ClassB.java:1: error: ClassB is not abstract and does not override abstract method show() in Printable
public class ClassB implements Printable{
       ^
2 errors
harsh@harsh-Inspiron-3558:~/java/upload$ 
public interface Printable{
    public void print();
    //public void show();
    default void defaultMethod(){
        System.out.println("default method is called");
    }
}
harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.class  ClassA.java  ClassB.class  ClassB.java  Printable.class  Printable.java  Test.class  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ java Test 
object of class A is created
print called from class A
Object of class B is created
print called from class B
default method is called
harsh@harsh-Inspiron-3558:~/java/upload$
public interface Printable{
    public void print();
    public void show();
    default void defaultMethod(){
        System.out.println("default method is called");
    }
}
harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.class  ClassA.java  ClassB.class  ClassB.java  Printable.class  Printable.java  Test.class  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
harsh@harsh-Inspiron-3558:~/java/upload$ java Test 
object of class A is created
print called from class A
Object of class B is created
print called from class B
default method is called
harsh@harsh-Inspiron-3558:~/java/upload$ 
现在我重新编译了它,希望再次得到错误,但是这次在重新编译时javac没有给出任何错误,但是它应该给出错误,因为没有给出方法show()的实现。它成功地编译如下:

public class Test{
    public static void main(String args[]){
        ClassA a1 = new ClassA();
        a1.print();
        ClassB b1 = new ClassB();
        b1.print();
        a1.defaultMethod();
    }
}
harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.java  ClassB.java  Printable.java  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
./ClassA.java:1: error: ClassA is not abstract and does not override abstract method show() in Printable
public class ClassA implements Printable{
       ^
./ClassB.java:1: error: ClassB is not abstract and does not override abstract method show() in Printable
public class ClassB implements Printable{
       ^
2 errors
harsh@harsh-Inspiron-3558:~/java/upload$ 
public interface Printable{
    public void print();
    //public void show();
    default void defaultMethod(){
        System.out.println("default method is called");
    }
}
harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.class  ClassA.java  ClassB.class  ClassB.java  Printable.class  Printable.java  Test.class  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ java Test 
object of class A is created
print called from class A
Object of class B is created
print called from class B
default method is called
harsh@harsh-Inspiron-3558:~/java/upload$
public interface Printable{
    public void print();
    public void show();
    default void defaultMethod(){
        System.out.println("default method is called");
    }
}
harsh@harsh-Inspiron-3558:~/java/upload$ ls
ClassA.class  ClassA.java  ClassB.class  ClassB.java  Printable.class  Printable.java  Test.class  Test.java
harsh@harsh-Inspiron-3558:~/java/upload$ javac Test.java 
harsh@harsh-Inspiron-3558:~/java/upload$ java Test 
object of class A is created
print called from class A
Object of class B is created
print called from class B
default method is called
harsh@harsh-Inspiron-3558:~/java/upload$ 

我无法理解为什么编译器没有再次给出错误,我确实在做了任何修改后保存了每个文件。请提供帮助,并为任何错误感到抱歉。

您每次只需重新编译
Test.java
。如果您尝试重新编译所有内容,您将再次看到错误


我真的不记得关于
javac
如何计算重新编译内容的细节——它是检查源文件还是类文件时间戳,还是只编译没有类文件的代码,而不是您指定的源文件。我不打算查找它,因为我认为依赖它不是一个好主意:每次都重新编译所有内容。

每次只重新编译
Test.java
。如果您尝试重新编译所有内容,您将再次看到错误


我真的不记得关于
javac
如何计算重新编译内容的细节——它是检查源文件还是类文件时间戳,还是只编译没有类文件的代码,而不是您指定的源文件。我不打算查找它,因为我认为依赖它不是一个好主意:每次都重新编译所有内容。

在运行之前重新编译所有类,我建议您开始使用编辑器,这样您就不会在不知不觉中犯这些错误。您确实需要学习如何使用像
Maven
Gradle
这样的生成系统。在运行之前,请重新编译所有类,我建议您开始使用编辑器,这样您就不会在不知不觉中犯这些错误。您确实需要学习如何使用像
Maven
Gradle
这样的构建系统。