Słowa kluczowe this oraz super

 

Słowo kluczowe this

 

Słowo kluczowe this oznacza obiekt, dla którego wywoływana jest dana metoda lub którego argument jest modyfikowany.

Użycie tego słowa pozwala użyć takich samych nazw parametrów metody, jak nazwa atrybutu danej klasy/obiektu.

Przykład, w którym widać, że nie musimy wymyślać dziwnych nazw parametrów, lecz możemy użyć nazw w naturalny sposób pasujących do sytuacji.

public class Człowiek {
    private String imię;
    private String nazwisko;
 
    public Człowiek(String imię, String nazwisko){
        this.imię = imię;
        this.nazwisko = nazwisko;
    }
 
    public void setNazwisko( String nazwisko ){
        this.nazwisko = nazwisko;
    }
}

 

Podczas implementowania kodu nowego konstruktora możemy użyć słowa this razem z nawiasami (i ewentualnymi parametrami wywołania konstruktora), aby wywołać inną wersję konstruktora danej klasy. Ale takie wywołanie może nastąpić wyłącznie w pierwszym wierszu kodu tworzonego konstruktora.

 

 

Słowo kluczowe super

 

Dwie sytuacje:

1. super() lub super( <lista_parametrów> ) jako wywołanie konstruktora

  • jeśli piszemy kod nowego konstruktora i chcemy użyć wywołania konstruktora klasy nadrzędnej (klasy odziedziczonej) - w formie polecenia: super();- możemy to zrobić wyłącznie w pierwszym wierszu kodu tworzonego konstruktora.

oraz

2. super.nazwaMetody( <lista_parametrów> ) - jako wywołanie oryginalnej metody klasy przodka (ancestor class) w kodzie metodzie nadpisanej zdefiniowanej w klasie potomka (klasy odziedziczonej - ang. derived class).

  • jeśli nadpisujemy kod metody, wówczas w nowym kodzie nadpisywanej metody możemy użyć wywołania oryginalnego kodu tej metody, zdefiniowanego w klasie odziedziczonej (klasie przodka). Kod oryginalnej metody wołamy przy użyciu polecenia: super.nazwaMetody( <lista_parametrów> ). Takie wywołanie możemy umieścić w dowolnym miejscu nowego kodu nadpisywanej metody. Widać to w zamieszczonym niżej przykładzie, gdzie metoda przodka super.method() jest wywoływana na początku, w środku i na końcu kodu nadpisanej metody.

 

Przykład demonstrujący obie te sytuacje:

public class SuperTest {
	public static void main( String[] args ) {
		DerivedClass derivedClassObject = new DerivedClass( 1 );	// calling sequence: AncestorClass() -> body of DerivedClass( int param ) constructor
		System.out.println( "____________________________" );
		derivedClassObject.method();

	} 
}


class AncestorClass {
	public AncestorClass( int param ) {
		System.out.println( "AncestorClass object CONSTRUCTED - ( int param ) constructor called" );
	}

	public void method() {
		System.out.println( "method() in AncestorClass called" );
	}
}


class DerivedClass extends AncestorClass {

	public DerivedClass( int param ) {
		super( param );    // wywołanie oryginalnego konstrutora w klasie nadrzędnej - MUSI WYSTĄPIĆ NA SAMYM POCZĄTKU TEGO KONSTRUKTORA
		System.out.println( "DerivedClass( int param ) constructor called" );
	}

	@Override	//to jest adnotacja, która nie ma wpływu na kompilację - używamy dla własnej wygody programisty
	public void method() {
		super.method();    // wywołanie oryginalnej metody method() w klasie nadrzędnej - może wystąpić w dowolnym miejscu metody nadpisanej.
		System.out.println( "method() BreakPoint_1 in DerivedClass" );
		super.method();
		System.out.println( "method() BreakPoint_2 in DerivedClass" );
		super.method();
	}

}