1

I have trouble understanding why this boolean b = new A() {} instanceof A; is a valid statement and not boolean b = new A() instanceof A; and why the former is true knowing that A is an abstract class.

closed as off-topic by gnat, Bart van Ingen Schenau, David Arno, amon, Deduplicator Apr 5 at 10:06

This question appears to be off-topic. The users who voted to close gave this specific reason:

  • "Questions asking for assistance in explaining, writing or debugging code are off-topic here. These can be asked on Stack Overflow if they include the desired behavior, a specific problem or error, and the shortest code necessary to reproduce it in the question (see Minimal, Complete, and Verifiable Example)." – gnat, amon, Deduplicator
If this question can be reworded to fit the rules in the help center, please edit the question.

16

The instanceof A has nothing to do with whether the statement is valid or not, so your question is simpler if you leave it off from both statements:

A a = new A() {};
A a = new A();

The second statement isn't valid because A is abstract and you can't call new on any abstract class. If you could instantiate it, it would be an instance of A, but you can't.

The first statement is valid because it creates an anonymous class that extends A. This anonymous class isn't abstract (assuming A doesn't define any abstract methods), and so it can be instantiated. It's an instance of A because all subclasses are instances of their parent classes, abstract or not. It's basically a shortcut for saying:

public class AnonymousNameIDontCareAbout extends A {}
A a = new AnonymousNameIDontCareAbout();

Not the answer you're looking for? Browse other questions tagged or ask your own question.