Code Stück



  • asdff schrieb:

    k wird nicht deklariert,

    case 1: int k;break;
    

    Und was ist das?



  • nee ich mein ja bloss case 1 wird ja nie erreicht 🙂 Aber der Compiler geht da wohl trotzdem mal rein :)a



  • Kann mir mal einer sagen wir man Objekte in einem array initialisert ?

    Hab da eine Klasse Player und es gibt einen Konstruktor der Player(String name)

    Jetzt will ich sowas machen

    Player [] array = new Player[5];
    

    Wie läuft das jetzt mit dem Konstruktor ????



  • Auf gut deutsch will ich wissen wo man die Konstruktor Argumente beim Array anlagen angeben muss 🙂



  • Du scheinst dem Irrtum zu unterliegen, dass beim Anlegen des Arrays auch gleich Player-Objekte erzeugt werden. Das ist nicht der Fall.



  • Aso ich erzeuge praktisch nur ein Array mit 5 Player Referenzen .
    Ich muss also noch eine Schleife aufsetzen die dann Objekte anlegt.

    for(int i = 0 ; i < array.length();i++)
    {
         array[i] = new Player("Name");
    }
    

    Anders gehts wohl nicht?!



  • Oder Streams:

    Player[] array = Stream.iterate(new Player("Name"), p -> new Player("Name")).limit(5).toArray(Player[]::new);
    


  • Wie macht das eigentlich in Java am besten wenn man ein Objekt kopieren möchte ?
    Das einfachste ist natürlich alle Instanzvariablen nach einander per value kopieren. Und Instanzvariablen die auch wieder Objekte sind auch wieder die Werttypen kopieren. Dann hat man alle Referenzen eliminiert. Ich würde mir dann in der Klasse eine Methode copyByValue anlegen und die erzeugt mir dann eine deep copy. Oder gibts andere Möglichkeiten ?



  • Schreib dir nen Copy-Konstruktor !



  • Objekte können mit clone() kopiert werden, das geschieht byte für byte. Referenzen werden so auch nur kopiert, die dahinterliegende objekte jedoch nicht. Enthält das objekt also referenzen auf objekte, enthält das neue genau die gleichen referenzen auf die selben objekte. Man kann die clone()-methode überschreiben, um eine tiefe kopie zu erzeugen.



  • wie wird eigentlich sowas vom Compiler gehandelt.

    if(3.1234567888888 == 3.1234567888889)
    

    { // hier wird true ausgegeben}

    Die Zahlen werden die standardmäßig in einen double or float gespeichert ?
    Es gibt ja auch diese explizite Schreibweise mit:
    3.1234567888888f oder 3.1234567888888d obwohl ich jetzt nicht weiss ob es "d" überhaupt gibt.



  • Es meldet sich ja keiner mehr 😞

    Mal noch so nee frage.

    Wieso funktioniert der Shift Operator nicht bei double Zahlen sondern nur bei int ?

    Würde doch bei double auch Sinn machen ??



  • Peter_Mueller schrieb:

    Würde doch bei double auch Sinn machen ??

    Echt? Was ist denn

    6.022140857e23>>5
    

    ?



  • Lol bei meinem Beispiel klappt das 🙂

    Zahl: 1011,101=11,625
    Anwendung Shift Operator: >>1 (Verschiebung nach rechts)
    Ergibt diese Zahl: 101,1101 = 5, 8125

    wobei 5,8125 * 2 = 11,625 ist . Folglich hat der Shift Operator funktioniert 🙂



  • volkard schrieb:

    Echt? Was ist denn

    6.022140857e23>>5
    

    ?

    Sollte doch bei deinem Beispiel auch klappen ??!!

    Wird halt dann zu 0.00006022140857e23



  • Also rein logisch macht es keinen Sinn, wie kann man ein Bit beispielsweise um 1,5 Stellen nach Rechts verschieben?



  • häh. Es geht doch nur darum Bits zu verschieben. Klar müsste man beim double noch etwas mehr durchführen wenn man z.B. die nullen hinter dem Komma entfernen möchte und dann noch den Exponent ändern, aber grundsätzlich funktioniert das !



  • Ah, ich dachte eben du meinst sowas:

    a >> 1.5
    

    Sorry.



  • volkard schrieb:

    Echt? Was ist denn

    6.022140857e23>>5
    

    ?

    Kann mal einer dazu was sagen. Wieso sollte das keinen Sinn ergeben ?

    0.000060221408e23 ??? Stimmt das nicht ??


  • Mod

    @Peter_Mueller: Die Bitshift-Operatoren sind genau das, was der Name aussagt: Operatoren, um Bits zu shiften. Bei Ganzzahlen kannst Du damit durch 2^n teilen oder mit 2^n multiplizieren, weil die interne Darstellung der Ganzzahlen dazu fuehrt, dass das in diesem Fall aequivalent ist. Bei Fliesskommazahlen gibt es diese Aequivalenz aber nicht. Recherchier mal, wie Fliesskommazahlen intern repraesentiert werden und dann ueberleg Dir, was Du Dir in diesem Fall von einem Bitshift-Operator versprichst.

    Generell kann man das Multiplizieren/Dividieren mit 2^n mittels Bitshoftoperatoren auch schon als eine Art von Missbrauch des Operators ansehen. Man macht das, weil man meint, besonders schlau zu sein, insbesondere schlauer als der Optimierer des Compilers. Eigentlich sollte man den Operator aber eher nur dann nutzen, wenn es einem nicht um den Wert der Ganzzahl im Gesamten geht, sondern um die einzelnen Bits, die diese Zahl ausmachen. Diese Operatoren sind nuetzlich, wenn man in einer Ganzzahl eigentlich eine Folge von boolschen Variablen speichern moechte und diese manipulieren moechte.


Anmelden zum Antworten