Вони насправді різні за тим, де ви можете їх використовувати. A.classпрацює під час компіляції, тоді як a.getClass()вимагає екземпляр типу Aта працює під час виконання.
Також може бути різниця в продуктивності. Хоча A.classкомпілятор може бути вирішений, оскільки він знає фактичний тип A, a.getClass()це виклик віртуального методу, що відбувається під час виконання.
Для довідки, компілятор, орієнтований на байт-код, зазвичай видає такі інструкції для Integer.getClass():
aload_1
invokevirtual #3; //Method java/lang/Object.getClass:()Ljava/lang/Class;
і наступне для Integer.class:
//const #3 = class #16; // java/lang/Integer
ldc_w #3; //class java/lang/Integer
Перший, як правило, передбачає відправлення віртуального методу, і тому, ймовірно, потрібно більше часу для виконання. Це врешті-решт залежить від JVM.
A.class.getClass()?