Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 0
  • 40

Odpowiedź (1)

  • 0

Metoda getDeclaringClass zwraca obiekt Class reprezentujący klasę w której bieżąca klasa jest zdefiniowana.

Metoda getEnclosingClass zwraca obiekt Class reprezentujący bezpośrednią klasę zewnętrzną dla bieżącej klasy.

Rzeczywiście w wielu przypadkach wyniki obu metod będą identyczne. Różnica uwidoczni się w przypadku użycia klasy wewnętrznej i klasy anonimowej. Wyjaśnia to poniższy przykład:

package pl.altkom;

public class A {
	
  // klasa wewnętrzna
  public class B {
    public void test() {
      Class<? extends A.B> c = getClass();
      System.out.println("test() from B class");
      System.out.println("\tdeclaring class: "+ c.getDeclaringClass()); 
      System.out.println("\tenclosing class: " + c.getEnclosingClass());
    }
  }

  public static void main(String[] args) {
    A a = new A();
    B b = a.new B();
    b.test();
		
    // klasa anonimowa
    new A() {
      public void test() {
        Class<? extends A> c = getClass();
        System.out.println("\ntest() from anonymous class");
        System.out.println("\tdeclaring class: "+ c.getDeclaringClass()); 
        System.out.println("\tenclosing class: " + c.getEnclosingClass()); 
      }  
    }.test();
  }

}

Wynik działania programu przedstawia się następująco:

test() from B class
	declaring class: class pl.altkom.A
	enclosing class: class pl.altkom.A

test() from anonymous class
	declaring class: null
	enclosing class: class pl.altkom.A

W obu przypadkach klasą zewnętrzną jest klasa A, ale tylko w przypadku klasy anonimowej nie ma sensu pojęcie klasy deklarującej.

 

 

  • Odpowiedział
  • @ | 21.11.2015
  • TRENER MODERATOR ALTKOM AKADEMII