Java frage Unterschied Methode und Objektmethode?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet
(...) aber was wenn man die Objektmethode auch ohne Objekt aufrufen kann? Ist es dann immer noch ne Objekt Methode?

Das geht nicht.

Es gibt zwei Formen von Methoden: Objektgebundene (Instanzmethoden) und objektungebundene (statische Methoden).

public void doSomething() {
}

public static void doSomethingElse() {
}

Erstere Form kann nur über ein Objekt aufgerufen werden. Dieses Objekt wird implizit in die Methode gereicht, dann kannst du mit this auf dieses zugreifen.

Zweitere Form wird über den Klassennamen aufgerufen. Daher hat sie keinen Zugriff auf ein Objekt, welches ihr nicht explizit als Parameter hineingereicht wird (oder als statisches Attribut im Sichtbarkeitsbereich ist).

(...) kann ein Parameterloser konstruktor Aufruf auch ein Objekt erzeugen???

Ja.

Mittels jedem verfügbaren, sichtbaren Konstruktor kann ein Objekt der Klasse erstellt werden.

class SomeClass {
  public SomeClass() {
  }

  public SomeClass(int someParameter) {
  }
}

// main:
SomeClass someObject = new SomeClass(); // << object
SomeClass otherObject = new SomeClass(123); // << object

Wenn der Standardkonstruktor überschrieben wird, also ein parameterloser Konstruktor nicht verfügbar ist, kann er nicht genutzt werden.

Beispiel:

class SomeClass {
  public SomeClass(int someParameter) {
  }
}

// main:
SomeClass someObject = new SomeClass(); // << error
Nichtsnutz12 
Fragesteller
 10.12.2019, 20:06

Ok danke verrückte Frage: Ist es möglich das ein konstruktor einen anderen konstruktor aufruft womit dann halt 2 Objekte erzeugt werden obwohl man nur einmal den konstrukor aufgreift hat?

0
regex9  10.12.2019, 20:35
@Nichtsnutz12

Ja, so:

class SomeClass {
  private SomeClass secondInstance;

  public SomeClass() {
    secondInstance = new SomeClass(1);
  }

  public SomeClass(int someParameter) {
  }

  public SomeClass getSecondInstance() {
    return secondInstance;
  }
}

// main:
SomeClass firstInstance = new SomeClass();
SomeClass secondInstance = firstInstance.getSecondInstance();

Wie du siehst, habe ich hierfür eine weitere Konstruktorüberladung definiert. Die ist notwendig, denn ein Aufruf des selben Konstruktors im Konstruktor würde zu einer Rekursion führen.

public SomeClass() {
  new SomeClass(); // recursion
}

Alternativ könnte man auch mit einem boolschen Attribut arbeiten:

class SomeClass {
  private SomeClass secondInstance;

  private static boolean firstTime = true;

  public SomeClass() {
    if (firstTime) {
      firstTime = false;
      secondInstance = new SomeClass();
    }
  }

  public SomeClass getSecondInstance() {
    return secondInstance;
  }
}

Da es statisch ist, teilen sich alle Instanzen diesen Attributwert. Beim ersten Aufruf wird sein Zustand geprüft (Abbruchbedingung) und der Wert invertiert, damit der nächste Konstruktoraufruf nicht erneut den Code im if ausführt.

2

Deine Fragen sind etwas durcheinander. Es wäre sowieos besser gewesen, einzelne Fragen zu stellen!

Trotz des Chaos, mein Versuch zu antworten.

"die normale Methode kann man auch ohne Objekt aufrufen" - nein, man muss!

"was wenn man die Objektmethode auch ohne Objekt aufrufen kann?" Geht nicht, es muss ein Objekt da sein!

"kann ein Parameterloser konstruktor Aufruf auch ein Objekt erzeugen???" - selbstverständlich! Gibt einfach keinen Parameter an!

Nichtsnutz12 
Fragesteller
 10.12.2019, 18:11

Ok danke also Objekte erzeugt man nur mit konstruktor aufrufen anders gehts gar net?

0
Schmarotzer2014  10.12.2019, 18:28
@Nichtsnutz12

Um präzise zu sein: Objekte erzeugt man mit "new" und nur damit!

Ein parameterloser Konstruktor wird als "Standard"-Konstruktor bezeichnet. Den muss man übrigens noch nicht mal definieren, der existiert automatisch (leer!) durch die Klasse. Aber nur, wenn er der einzige Konstruktor ist. Gibt es mindestens einen weiteren, muss der Standard-Konstruktor vorhanden sein!

Es ist an und für sich eine Frage des sauberen Stils, wenn man auch einen Strandard-Konstruktor angibt, wenn der einzige ist für diese Klasse.

1
Nichtsnutz12 
Fragesteller
 10.12.2019, 20:06
@Schmarotzer2014

Ok danke verrückte Frage: Ist es möglich das ein konstruktor einen anderen konstruktor aufruft womit dann halt 2 Objekte erzeugt werden obwohl man nur einmal den konstrukor aufgreift hat?

0
Schmarotzer2014  10.12.2019, 20:46
@Nichtsnutz12

Konstruktor der selben Klasse?

Was genau willst Du machen? Oder ist das nur hypothetisch?

Ich hatte geschrieben, dass Du "new" verwenden musst. Also im Konstruktor irgendwas mit "new" machen,

Nicht böse sein, aber Du kannst diese Sachen einfach mal eingeben und der Compiler sagt Dir dann schon, ob er das kann oder will!

1
den Unterschied zwischen einer Methode und einer Objektmethode

Was du hier wohl meinst sind Objektmethoden und Klassenmethoden.

Objektmethode:

Methoden die in an einem erzeugten Objekt hängen. Sie sind nur mit Hilfe eines Objekts aufrufbar.

Klassenmethode:

Methoden können auch ohne das Erzeugen eines Objekts aufgerufen werden. Sie gehören zu der Klasse. In Java werden diese Klassenmethoden mit "static" gekennzeichnet, weswegen man sie auch statische Methoden nennt.

Beispiel:

public class Rechteck {
	
	private static String klassenvariable = "Ich bin eine statische Variable";
	private int a;
	
	//Konstruktor
    public Rechteck() {
  	}
  	
    // Klassenmethode
  	public static String gibKlassenvariable() {
  		return klassenvariable;
  	}
  
    //Objektmethode
  	public int getA() {
  		return a;
  	}
  
    //Objektmethode
  	public void setA(int a) {
  		this.a = a;
  	}
  }

Die Methode "gibKlassenvariable()" könntest du nun aufrufen ohne ein "Rechteck" erstellt zu haben, die Methoden "getA()" und "setA(int a)" jedoch nicht.

kann ein Parameterloser konstruktor Aufruf auch ein Objekt erzeugen???

Ja das kann er.
Wenn du in einer Klasse gar keinen Konstruktor definierst, dann wird automatisch ein parameterloser Konstruktor "erzeugt". Es gibt also keine "normale" Klasse ohne Konstruktor.

Woher ich das weiß:Berufserfahrung – Java Entwickler
Nichtsnutz12 
Fragesteller
 10.12.2019, 20:06

Ok danke verrückte Frage: Ist es möglich das ein konstruktor einen anderen konstruktor aufruft womit dann halt 2 Objekte erzeugt werden obwohl man nur einmal den konstrukor aufgreift hat?

0
Eismensch  10.12.2019, 21:51
@Nichtsnutz12

Kann man aus einem Konstruktor einen weiteren Konstruktor aufrufen? - Die Antwort ist ja, das kann man machen. Dies nennt sich "constructor chaining".
Allerdings erzeugst du damit nicht mehrere Objekte, sondern führst nur die Logik aus.

Du kann hier mehr dazu lesen und auch was man alles beachten muss: Link

Edit: Wenn du die Konstruktor so verkettest wie Regex es in seiner Antwort beschrieben hat, kannst du natürlich mehrere Objekte erstellen^^
Du hättest dann aber eben ein Objekt im Objekt.

1