13.4.15 abstract Methods

Changing a method that is declared abstract to no longer be declared abstract does not break compatibility with pre-existing binaries.

Changing a method that is not declared abstract to be declared abstract will break compatibility with pre-existing binaries that previously invoked the method, causing an AbstractMethodError. If the example program:


class Super { void out() { System.out.println("Out"); } }

class Test extends Super {
	public static void main(String[] args) {
		Test t = new Test();
		System.out.println("Way ");
		t.out();
	}
}

is compiled and executed, it produces the output:


Way
Out

Suppose that a new version of class Super is produced:


abstract class Super {
	abstract void out();
}

If Super is recompiled but not Test, then running the new binary with the existing binary of Test results in a AbstractMethodError, because class Test has no implementation of the method out, and is therefore is (or should be) abstract. (An early version of Java incorrectly produced the output:

Way

before encountering an AbstractMethodError while invoking the method out, incorrectly allowing the class Test to be prepared even though it has an abstract method and is not declared abstract.)