this.irgendetwas



  • moin, moin

    kann mir jemand von euch in einfachen und verständlichen worten erklären, was es mit dem this auf sich hat?

    besten dank
    J



  • Hi

    da java bekantlicher weise mit objekten arbeitet. ist this das Objekt in dem du dich gerade befindest. Man kann this auch weglassen, nur find ich das nicht so schön, dan weiss man nie ist es jetzt eine objekt element oder eine lokale variable.

    gruss



  • Termite schrieb:

    Hi

    da java bekantlicher weise mit objekten arbeitet. ist this das Objekt in dem du dich gerade befindest. Man kann this auch weglassen, nur find ich das nicht so schön, dan weiss man nie ist es jetzt eine objekt element oder eine lokale variable.

    gruss

    Hallo und danke erstmal,

    aber kannst du mir das vielleicht an einem bsp. veranschaulichen?

    grüsse



  • Hi

    ähm ja lass mal überlegen

    class Obst
    {
       private String name ; // innerhalb deses Objektes / klassendeklaration 
                             // über this.name erreichbar
    
       public Obst(String name)
       {
           this.name = name; // hier wird der übergebene string dem 
                             // private in der klasse hinterlegten zugewiesen.
                             // da beide gemeinerweise den gleichen namen haben
                             // muss vor das erste this. sonst macht es nicht das 
                             // was wir wollen 
                             // nambensgebung war natürlich abicht ;)  
                             // normalerweise sollte man sowas erst garnicht machen
          }
    
       public String getName()
       {
          return this.name;   // hir wird der name des obstes ausgegeben.
                              // hir könnte man auch this weglassen.
       }
    }
    

    was dümmeres ist mir grad nicht eingefallen. und was passiert wenn ich name = name im constructor schreibe hab ich grad nicht ausprobiert. nur sicher nichts gutes.

    gruss



  • aha, das heißt also das der Konstruktor sozusagen den namen der neuen Instanz aufgreift und ihn zur klasse befördert? kommt das so in etwa hin?



  • Termite schrieb:
    und was passiert wenn ich name = name im constructor schreibe hab ich grad nicht ausprobiert. nur sicher nichts gutes.

    Ganz einfach: NIX, du belegst eine Variable mit sich selbst. Der Compiler bringt dir dann so eine Meldung hier.

    "The assignment to variable name has no effect"

    Und J

    THIS ist ein "Zeiger" auf die eigene Klasse.

    class Dichte
    {
    	private long density = 0.43;
    	public static void main(String[] args)
    	{
    		System.out.println(density);
    		System.out.println(this.density);
    		System.out.println(Dichte.density);
    	}
    }
    

    Alle drei Ausgaben werden die gleiche Ausgabe liefern.

    Wenns aber jetzt SO aussieht

    class Dichte
    {
    	private long density = 0.43;
    	public static void main(String[] args)
    	{
    		density = 4.43;
    		System.out.println(density);
    		System.out.println(this.density);
    		System.out.println(Dichte.density);
    	}
    }
    

    Die erste Ausgabe wird dann 4.43 statt 0.43 ausgeben. This und Dichte sind in dem Fall gleichgestellt. This ist hier ein Substitut für Dichte.

    Ich hoffe so gehts J.

    Gruß

    Markus Seidl



  • Hi Angren Aldaron

    Dichte.density sollte meiner meinung nach nicht funktionieren, da du damit auf ein statisches elment der Klasse zugreifen willst, und nicht auf element eines Objektes. Klassenelemente sind elemente, die unabhängig von einer instanz dieser klasse existieren. sowas wie globale variablen, nur das sie einer klasse zugeordnet sind.

    und selbst wenns funktioniert. sollte man das nicht machen, da das hinterher unschön zu lesen ist.

    gruss



  • Da hast Du recht, aber das kann man sich später noch anschauen, die Spezialfälle. Ich lern das ganze auch erst seit neuem, und teilweise sind Erklärungen sehr schwierig zu verstehen.

    Im übrigen. Ich habs im Eclipse ausprobiert. "IntelliSense" gibt mir diese Möglichkeit. Wenn du die Variable static deklarierst funktioniert das auch. Ich hab halt versucht, die Erklärung so einfach wie möglich zu halten. Das ist wie im Karate. Je weiter man kommt, desto schwieriger werden die einzelnen Schläge und Tritte. Man versucht zuerst, das Ganze so einfach wie möglich zu halten. Sorry wenns bei mir hin und wieder im Detail hakt :p aber danke für den Hinweis. Werds mir merken.

    Gruß

    Markus Seidl



  • In jedem Konstruktor und jeder Methode einer Klasse existiert eine Referenz mit dem Namen "this", die auf das aktuelle Exemplar einer Klasse zeigt. Diese Referenz wird in anderen objektorientierten Programmiersprachen auch als "me" oder "self" bezeichnet. In Java gibt es 2 Fälle wo "this" benutzt werden muss.

    1. Wenn lokale Variablen Objectvariablen verdecken. z.B.

    public class Test {
        public int var;
    
            Test( int var ) {
                this.var = var;
            }
    
            public static void main( String[] args ) {
                Test t = new Test( 2 );
                System.out.println( t.var );
            }
    
            public void actionPerformed( ActionEvent ae ) {
                ......
            } 
    }
    

    Kompiliert man das obere Programm und führt es aus so wird "2" ausgegeben. Ohne "this" also "var = var" würde das Programm zwar fehlerfrei und warnungsfrei Übersetzt. Führt man es jedoch aus so wird "0" ausgegeben, da die Zuweisung keine Auswirkung hat und Objektvariablen von Typ int mit 0 initialisiert werden.

    2. Wenn innerhalb eines Konstruktors oder Methode einer Klasse die eigene Referenz (das aktuelle Objekt) an eine anderes Objekt übergeben werden muss.

    public class ControlPanel extends JPanel implements ActionListeren {
    
        private JButton start;
    
        public ControlPanel() {
    
           start = new JButton( "Start" ) ;
           start.addActionListener( this );
        }
    }
    
    // Klasse ist nicht vollständig
    

    Grade bei der GUI-Programmierung muss sehr oft das aktuelle Objekt bei anderen Objekten (Listener, Observer....) registriert werden.



  • Oder Cunstructor Chaining.

    class Foobar 
    {
      private negNumber;
    
      public Foobar() {
        this(-1);
      }
    
      public Foobar(int n) {
        if(n>=0)
          throw new IllegalArgExc();
        negNumber = n
      }
    }
    

Anmelden zum Antworten