# Pakete und Wiederverwendung



## thor_norsk (5. Jan 2022)

Guten Tag, irgendwie kann ich die Aufgabe nicht lösen.
Aufgabestellung: Erstellen Sie eine wiederverwendbare Klasse Rechnungen mit Klassenmethoden in einem Paket* javaauf4 *.
Die erste Methode quadrat() der Klasse soll das Quadrat einer übergebenen Zahl berechnen und die zweite Methode wurzel() die Quadratwurzel einer
übergebenen Zahl.
Für das Berechnen der Quadratwurzel können Sie die Methode sqrt() aus der Klasse  *Math *verwenden.
Die Methode erwartet einen double - Typ als Argument und liefert einen double - Typ zurück. Eine Import - Anweisung ist für die Klasse nicht erforderlich, da die zum
Paket *java.lang* gehört. 
Erstellen Sie von der Methode quadrat() jeweils eine Version, die int - Typen verarbeitet und einen int - Typ zurück liefert, und eine Version, die double - Typen verarbeitet und einen double - Typ zurückliefert. Der Aufruf soll aber nur durch den Namen quadrat() erfolgen. Welcher Typ verarbeitet werden soll, muss die Funktion selbst anhand des Arguments feststellen können.
Erstellen Sie dann eine Klasse in einem Projekt in einem anderen Arbeitsbereich, die in einer main() - Methode die Klassenmethoden aus der Klasse Rechnungen 
jeweils mit einem int- und einem double - Wert aufruft. Nehmen Sie die Klasse Rechnungen dabei über einen Verweis in das Projekt mit der Testklasse auf.

Lösungsansatz:

[CODE lang="java" title="Pakete und Wiederverwendung"]package javaauf4;
import java.lang.Math;   // laut Aufgabestellung nicht erforderlich ???

public class Rechnungen {


    int quadrat(int eingabe) {

        int ergebnis = eingabe * eingabe;
        return ergebnis;
    }

    double quadrat(double eingabe) {

        double ergebnis = eingabe * eingabe;
        return ergebnis;
    }

    double wurzel(double eingabe) {

        double ergebnis  = Math.sqrt(eingabe);
        return ergebnis;       
    }
}    [/CODE]

Und als nächstes habe ich die Klasse Rechnungen importiert.

[CODE lang="java" title="Pakete und Wiederverwendung"]package javaauf4;
import javaauf4.Rechnungen;

public class TestAuf4 {

    public static void main(String[] args) {

        System.out.println(quadrat(10));

    }
}[/CODE]

Fehlermeldung: Es wird angezeigt, dass die Methode quadrat(10) nicht für den Typ TestAuf4 nicht definiert ist, trotz Import vom javaauf4.Rechnung ??? 
Ich habe erst Mal mit quadrat(10) versuch gestartet, um zu testen, ob Fehlermeldungen auftauchen.


----------



## Robert Zenz (5. Jan 2022)

thor_norsk hat gesagt.:


> Es wird angezeigt, dass die Methode quadrat(10) nicht für den Typ TestAuf4 nicht definiert ist, trotz Import vom javaauf4.Rechnung ???


Na woher soll denn der Compiler wissen dass du die Methode von der Klasse "Rechnungen" meinst, du musst das schon hinschreiben. Ohne Qualifizierer wird immer die aktuelle Klasse angenommen.


```
import AnotherClass;

public class Example {
    public void doSomething() {
        action();
        this.action(); // Beide sind aequivalent, aktuelle Klasse (Example).
        
        AnotherClass.action(); // Aufruf auf der anderen Klasse (statisch).
        new AnotherClass().action(); // Aufruf auf der anderen Klasse (instanz).
    }
}
```


----------



## Robert Zenz (5. Jan 2022)

Der Vollstaendigkeit halber, es gibt die Moeglichkeit von "Wildcard-Imports", wo die Methoden automatisch in den aktuellen Scope gezogen werden. Zum Beispiel:


```
import AnotherClass.*;

public class Example {
    public void doSomething() {
        action(); // Aufruf direkt der Methode "AnotherClass.action()" wenn diese in der aktuellen Klasse nicht existiert.
    }
}
```

Aber mach' das bitte nie! Wildcard-Imports sind (zusammen mit `package-private`) der Teufel!


----------



## Jw456 (5. Jan 2022)

In der Klasse „TestAuf4“ in der „main“ Methode musst du erstmal ein Objekt der Klasse „Rechnungen“ erstellen. 
Und auf diesem Objekt oder mit dieser Instanz kannst du auf deine Methoden zugreifen.

Willst du direkt zugreifen müssten die Methoden „static“  sein.


----------



## thor_norsk (5. Jan 2022)

Da in der Aufgabestellung, wenn ich richtig verstanden haben von statische Methoden die Rede ist, habe ich die Aufgabe so gelöst:
( zusätzlich Methoden auf statisch gesetzt)

[CODE lang="java" title="Pakete und Wiederverwendung"]package javaauf4;
import javaauf4.Rechnungen.*;

public class TestAuf4 {

    public static void main(String[] args) {

        System.out.println("-----------------------------------------------------");

            System.out.println("Quadrat Ihre Eingabe lautet:"+Rechnungen.quadrat(10)+"\t\t\t-----");

                System.out.println("Quadrat Ihre Eingabe lautet:"+Rechnungen.quadrat(20.5)+"\t\t-----");

                     System.out.println("Wurzel Ihre Eingabe lautet:"+ Rechnungen.wurzel(9)+"\t\t\t-----");

                          System.out.println("Wurzel Ihre Eingabe lautet:"+Rechnungen.wurzel(245.555)+"\t-----");

                              System.out.println("-----------------------------------------------------");
    }
}
[/CODE]


----------



## thor_norsk (5. Jan 2022)

haben -n = habe ( habe mich verschrieben)


----------



## Mart (5. Jan 2022)

du kannst auch static imports machen wie zb



> import static System.out;


nur so nebenbei mal rein geworfen


----------



## Jw456 (5. Jan 2022)

thor_norsk hat gesagt.:


> haben -n = habe ( habe mich verschrieben)


das habe ich auch so verstanden


----------



## Jw456 (5. Jan 2022)

Mart hat gesagt.:


> du kannst auch static imports machen wie zb
> 
> 
> nur so nebenbei mal rein geworfen


Static Import ermöglicht nur den zugriff ohne den Klassen Namen. 
Wenn die Methoden oder Argumente static sind . 
Was sie am Anfang  nicht waren. 
Da hätte ihm der Static Import auch nichts gebracht.


----------



## Mart (5. Jan 2022)

Jw456 hat gesagt.:


> Static Import ermöglicht nur den zugriff ohne den Klassen Namen.
> Wenn die Methoden oder Argumente static sind .
> Was sie am Anfang  nicht waren.
> Da hätte ihm der Static Import auch nichts gebracht.


deswegen nur nebenbei rein geworfen dass es das auch gibt..


----------



## thor_norsk (6. Jan 2022)

Zuerst möchte ich mich bedanken. Ich habe die Methoden in der Klasse Rechnungen auf static gesetzt und in der main() z.B. Rechnungen,quadrat(10) aufgerufen. So funktioniert einwandfrei. Jetzt versuche ich einfach die Aufgabe mit Instanzen zu lösen.


----------



## Jw456 (6. Jan 2022)

thor_norsk hat gesagt.:


> Zuerst möchte ich mich bedanken. Ich habe die Methoden in der Klasse Rechnungen auf static gesetzt und in der main() z.B. Rechnungen,quadrat(10) aufgerufen. So funktioniert einwandfrei. Jetzt versuche ich einfach die Aufgabe mit Instanzen zu lösen.


genau das ist der richtige weg.


----------



## thor_norsk (6. Jan 2022)

Jetzt der 2 Versuch mit Instanzen. 

[CODE lang="java" title="Pakete und Wiederverwendung"]package javaauf41;

public class Rechnungen1 {

    int quadrat(int eingabe) {

        int ergebnis = eingabe * eingabe;
        return ergebnis;
    }

    double quadrat(double eingabe) {

        double ergebnis = eingabe * eingabe;
        return ergebnis;
    }

    double wurzel(double eingabe) {

        double ergebnis  = Math.sqrt(eingabe);
        return ergebnis;       
    }

    public void ausgeben() {

        System.out.println("Quadrat Ihre Eingabe lautet:"+quadrat(10));
        System.out.println("Quadrat Ihre Eingabe lautet:"+quadrat(10.2));
        System.out.println("Quadratwurzel Ihre Eingabe lautet:"+wurzel(16.5));
    }
}
[/CODE]

Und natürlich main()

[CODE lang="java" title="Pakete und Wiederverwendung"]package javaauf41;
import javaauf41.Rechnungen1.*;

public class TestAuf41 {

    public static void main(String[] args) {

        Rechnungen1 berechnung1 = new Rechnungen1();
        berechnung1.ausgeben();
    }
}[/CODE]


----------

