Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding > Coding Tutorials
You last visited: Today at 09:23

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[Java] Polymorphie im Detail

Discussion on [Java] Polymorphie im Detail within the Coding Tutorials forum part of the General Coding category.

Reply
 
Old   #1
 
XxharCs's Avatar
 
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,228
Post [Java] Polymorphie im Detail

Hallo!

Wer sich mit Java beschäftigt sollte wissen was Polymorphie ist und wie sie funktioniert.
Hiermiet ergreife ich die Initiative euch die Polymorphie so gut wie möglich "beizubringen" (lol, das Wort ist ja mal so ein Jaein )
================================================== ============

1. Polymorphie

1.1. Definition

Der Begriff Polymorphismus[1] kommt aus der griechischen Sprache. Diese Eigenschaft ist eine der Grundbegriffe[2] objektorientierter Programmierung.


1.2. Adhoc-Polymorphie
1.2.1. Typanpassung

Es kommt recht häufig vor, dass Datentypen konvertiert werden müssen. Java unterscheidet hier 2 Arten der Typanpassung:

1.2.1.1. Automatische oder implizite Typanpassung

Daten von einem kleineren Datentyp können ohne Datenverlust in einen größeren Datentyp umgewandelt werden.
Beispiele:
Code:
byte bValue=30; 
short sValue=bValue; 
int iValue=sValue+5; 
long lValue=11111111111111L; 
float fValue=lValue; 
double dValue=fValue;
Einige Sonderfälle sind dabei zu beachten!
Da es kein Byte-Literal gibt, sichert der Compiler, dass das Integerliteral
im Wertebereich [-128,127] bleibt.
Bei der impliziten Konvertierung von long in float oder double können
aufgrund der unterschiedlichen Speicherung Genauigkeitsfehler eintreten.

1.2.1.2. Explizite Typanpassung

Einer Variablen mit einem kleineren Datentyp kann ein Ausdruck eines größeren Typs mit möglichem Verlust von Informationen zugewiesen werden. Dies wird explizit mittels Casting erreicht.
Beispiele:
Code:
double dValue=1234.5E27; 
byte bValue=(byte) dValue; 
short sValue=(short) dValue; 
int iValue=(int) dValue+5; 
long lValue=11111111111111L; 
float fValue=(float) lValue;
Je nach Datentyp kann der Informationsverlust gering (long in float) oder beträchtlich (double in byte) sein.

1.2.2. Überladen

Eine Methode ist gekennzeichnet durch Rückgabewert, Name, Parameter und unter Umständen durch Ausnahmefehler, die sie auslösen kann. Ein wichtiger Begriff in diesem Zusammenhang ist die Signatur einer
Methode.
Die Signatur einer Methode ist der Name der Methode und die Typen in
ihrer Parameterliste:
Code:
public static void irgendeineMethode( int i, double d, String s){ 

}
Der Rückgabetyp ist kein Bestandteil der Signatur. Die Namen der Parameter spielen keine Rolle, nur die Typen und ihre Reihenfolge!

Java erlaubt es, den Namen der Methode gleich zu lassen, aber andere Parameter einzusetzen. Eine überladene Methode ist eine Methode mit dem gleichen Namen wie eine andere Methode, unterscheidet sich aber durch eine unterschiedliche Parameterliste.
Das ist auf zwei Arten möglich:
  • Eine Methode hat für den Compiler unterscheidbare Typen.
  • Eine Methode akzeptiert eine unterschiedliche Anzahl von Parametern.
Beispiele:
Code:
public static int max( int i, int j ) { 
      return Math.max( i, j ); 
} 
public static int max( double d, int i){ 
    return (int) Math.max(d, (double)i); 
} 
public static int max(int[] a){ 
    int ret=a[0]; 
    for(int i=1;i<a.length;i++) 
      if(a[i]>a[i-1]) ret=a[i]; 
    return ret; 
} 
public static int max(int i,int j, int k){ 
    return  max( i, max(j, k) );  
}
Beachte: Der Datentyp des Rückgabewertes darf nicht das einzige Unterscheidungskriterium sein!

1.3. Universelle Polymorphie
1.3.1. Laufzeitpolymorphie

Beispiel:
Code:
public class A { 
  static void print(String s) { System.out.println(s); } 
  void p(char a) { print(""+'a'); } 
  void p(int a)  { print("Aah!"); }   
} 
 
public class B extends A { 
   void p(int b) { // overrides second p 
       print("Beh!"); 
} 
 
public static void main(String[] args) { 
    A a = new A(); 
    a.p(1); // print  „Aah!“ 
    a = new B(); 
    a.p(1); // print  „Beh!“ 
  } 
}
a.p(1); legt in diesem Fall nicht fest, welche Methode sich hinter dem Namen p verbirgt, dies wird vielmehr vom dynamischen Typ von a abhängig gemacht!

Gewählt wird dynamisch die Methode des Objekttyps, nicht statisch die des Variablentyps. Man spricht daher auch von dynamischem Binden.

Die Methode p ist sozusagen „vielgestaltig“, polymorph. Diese Art der an die Vererbung (oder auch an die Implementierung einer Schnittstelle!) gebundene Polymorphie heißt auch Einschlusspolymorphie oder Inklusionspolymorphie.

1.3.1. Generizität

Die Generizität wird auch parametrisierte Polymorphie genannt. Ein und dieselbe Methode, Klasse, soll für Daten verschiedener Typen verwendbar sein.
Durch den Einsatz von formalen Typparametern wird diese Vielgestaltigkeit erreicht.

1.3.1.1. Generische Klassen

Aufgabenstellung String:
In einer Klasse soll ein Wert gespeichert werden, welcher über den Konstruktor übergeben wird. Dieser Wert kann ausgelesen bzw. mit einem Setter neugesetzt werden.
Dieser Wert soll vom Typ String sein:
Code:
public class WrapperString  { 
  private String value; 
  public WrapperString(String t){ 
    this.value=t; 
  } 
  public String getValue() { 
    return value; 
  }
  public void setValue(String value) { 
    this.value = value; 
  } 
  @Override 
  public String toString(){ 
    return ""+getValue(); 
  } 
  public static void main(String[] a){ 
    WrapperString s=new WrapperString("1"); 
    System.out.println(s.toString()); 
     
  } 
}

Aufgabenstellung Integer:

In einer Klasse soll ein Wert gespeichert werden, welcher über den Konstruktor übergeben wird. Dieser Wert kann ausgelesen bzw. mit einem Setter neugesetzt werden.
Dieser Wert soll vom Typ Integer sein:
Code:
public class WrapperInteger  { 
  private Integer value; 
  public WrapperInteger(Integer t){ 
    this.value=t; 
  } 
  public Integer getValue() { 
    return value; 
  } 
  public void setValue(Integer value) { 
    this.value = value; 
  } 
  @Override 
  public String toString(){ 
    return ""+getValue(); 
  } 
  public static void main(String[] a){ 
    WrapperInteger s=new WrapperInteger(2); 
    System.out.println(s.toString()); 
     
  } 
}

Aufgabenstellung Double:

In einer Klasse soll ein Wert gespeichert werden, welcher über den Konstruktor übergeben wird. Dieser Wert kann ausgelesen bzw. mit einem Setter neugesetzt werden.
Dieser Wert soll vom Typ Double sein:
Code:
public class WrapperDouble  { 
  private Double value; 
  public WrapperDouble(Double t){ 
    this.value=t; 
  } 
  public Double getValue() { 
    return value; 
  } 
  public void setValue(Double value) { 
    this.value = value; 
  } 
  @Override 
  public String toString(){ 
    return ""+getValue(); 
  } 
  public static void main(String[] a){ 
    WrapperDouble s=new WrapperDouble(3.6); 
    System.out.println(s.toString()); 
    s.setValue(4.4); 
    System.out.println(s.toString()); 
  } 
}
Wie aus dem o.a. Beispiel gut ersichtlich ist, sind die Unterschiede nur im Datentyp des Wertes (value). Bei einer generischen Klasse wird nun der Datentyp durch einen Typparameter ersetzt. Dadurch haben wir eine generische (multifunktionale) Klasse.
Beispiel:
Code:
public class Wrapper<T>  { 
  private T value; 
   
  public Wrapper(T t){ 
    this.value=t; 
  } 
  public T getValue() { 
    return value; 
  } 
  public void setValue(T value) { 
    this.value = value; 
  } 
  @Override 
  public String toString(){ 
    return ""+getValue(); 
  } 
  public static void main(String[] a){ 
    Wrapper<String> s=new Wrapper<String>("1"); 
    System.out.println(s.toString()); 
    Wrapper<Integer> i=new Wrapper<>(2); 
    System.out.println(i.toString()); 
    Wrapper<Double> d=new Wrapper<>(3.6); 
    System.out.println(d.toString()); 
    d.setValue(4.4); 
    System.out.println(d.toString()); 
  } 
}
Der Typparameter wird in spitzen Klammern <T> geschrieben. Bei der Erstellung von Objekten muss der Typ (z.B.: Wrapper<Integer>) bekannt gemacht werden. Mithilfe des new-Operators (new Wrapper<>(2)) wird ein Wrapper-Objekt mit dem Datentyp Integer erstellt.

Seit Java 7 ist auf der Seite des new-Operators die erneute Nennung des Datentyps nicht mehr notwendig. Aufgrund der graphische Darstellung von <> spricht auch (fälschlich) vom „Diamond-Operator“ obwohl es sich hier um keinen Operator sondern um eine verkürzte Schreibweise handelt!

Der „Diamond-Operator“ darf überall dort verwendet werden, wo der Compiler eindeutig den Typ ermitteln kann. Die Schreibweise mit der expliziten Angabe des Typs (new Wrapper<Integer>(2)) ist weiter möglich und gültig.

1.3.1.2. Generisches Interface

Wie auch eine Klasse kann auch ein Interface generisch definiert werden.
Beispiel:
Code:
public interface MyQueue<Item> { 
  public void append(Item i); 
  public Item remove(); 
  public int length(); 
}
Der Typparameter ist in diesem Beispiel <Item>. Es handelt sich hier nicht um eine Klasse!
Eine Implementierung könnte folgendermaßen aussehen:
Code:
public class MyLinkedQueue<Item> implements MyQueue<Item> { 
  private class Cell { 
    private Item value; 
    private Cell next; 
    public Cell(Item i) { 
      value = i; 
    } 
  } 
 
  private Cell front, rear; 
 
  @Override 
  public MyQueue<Item> append(Item i) { 
    Cell c = new Cell(i); 
    … 
    return this; 
  } 
 
  @Override 
  public Item remove() { 
    Item ret=null; 
    if (front!=null){ 
    … 
    } 
    return ret; 
  } 
 
  @Override 
  public int length() { 
    … 
    return ret; 
  } 
  public static void main(String[] a){ 
    MyLinkedQueue<Integer> q= new MyLinkedQueue<Integer>(); 
    System.out.println("Size: "+q.length()); 
    q.append(4).append(5).append(7); 
    System.out.println("Size: "+q.length()); 
    int i=1; 
    while(q.length()>0) 
      System.out.println("Cell: "+(i++)+ ":"+q.remove()); 
  } 
}
Die MyLinkedQueue enthält nur <Item> verträgliche Elemente!

1.3.1.3. Objekterzeugung

Die Anzahl der aktuellen Parameter muss gleich der Anzahl der formalen Parameter sein.
Code:
MyLinkedQueue<Integer> q= new MyLinkedQueue<Integer>();
In diesem Fall wird ein Typparameter <Item> durch einen aktuellen Parameter
<Integer> ersetzt.
Probleme und mögliche Fehler bei der Erstellung:
Code:
public class Fehler<T> { 
  T t=new T();          // unexpected type: forbidden 
  T[] t2=new T[2];        // generic array creation: forbidden 
  List<String>[] list=new List<String>[3]; // generic array creation: forbidden 
}
Fehler in der Vererbung:
Code:
public class Fehler { 
 
  public static void main(String[] args) { 
     Number[] a = new Integer[1]; 
     a[0] = new Double( 3.14 );  // <-- no compiler error, but runtime exception! 
 
     ArrayList<Number> a = new ArrayList<Integer>();  // <-- compiler error 
  } 
}
Die Ableitungsbeziehung zwischen Typargumenten überträgt sich nicht auf generische Klassen. Dadurch ist (anders als bei Arrays) Typsicherheit gewährleistet.
Fehler in statischen Teilen:
Code:
public class MyList<T> { 
  private T head; 
  private List<T> tail; 
 
  public static void main(String[] args) { 
    List<T> list = new List<T>(); 
  } 
}
Die Aktualisierung der formalen Typparameter erfolgt für jedes Objekt individuell.
Daher darf in statischen Teilen einer generischen Klasse Nicht auf die formalen Typparameter der Klasse Bezug genommen werden!

Wichtig:

Generics sind per "Type Erasure" implementiert: Die Typen werden zur Kompilierzeit überprüft und anschließend wird die Typinformation entfernt.

Achtung:
Es gibt generische Klassen, aber keine „generischen Objekte“! Jedes Objekt hat den bei seiner Erzeugung festgelegten Typ.

1.3.1.4. Generische Methoden

Neben Interfaces und Klassen können auch Methoden generisch sein. Sehr praktisch sind solche Methoden in Utility-Klassen.
Beispiel:
Code:
public final static  <T> T random( T m, T n ) {  
    return Math.random() > 0.5 ? m : n;  
  }
Der Typparameter <T> wird vor dem Datentyp T des Rückgabewertes angegeben. Auch in der Parameterliste kann der Typ verwendet werden.

1.3.1.5. Beschränkte Generizität

Falls die Typparameter nicht eingeschränkt werden, ist jede Klasse (bzw. Interface) als aktueller Parameter möglich.
Beispiel:
Code:
public final static <T extends Comparable<T>> T max( T a, T b) { 
    return (a.compareTo(b)>0)?a:b; 
  }
Damit in der generischen Methode eine Methode zum Vergleich verwendet werden kann, wird das Interface Comparable beim Einsatz der Methode vorausgesetzt.

Schranken und Wildcards:
<?> beliebiger Typ (vermeidet Warnung: „unbounded wildcard“)
<? super X> Superklasse von X: „lower bounded wildcard“ ist erlaubt
<? extends X> Von X (Klasse oder Interface) abgeleiteter Typ („upper
bounded wildcard“)
<? extends X & Y & Z> Subtyp von mehreren Typen (außer dem ersten Typ
nur Interfaces erlaubt) „multiple bounds“

Unterschied zwischen <? extends X> und <T extends X> ?

Wenn der Typ <T> weiter zum Beispiel innerhalb der Klasse oder Methode benötigt wird, muss die zweite Form gewählt werden. Ansonsten sollte die erste Variante bevorzugt werden.


================================================== ============
[1] [duden.de] polymorph: in verschiedenerlei Gestalt, Form vorhanden, vorkommend; vielgestaltig, verschiedengestaltig
[2] Grundbegriffe objektorientierter Programmierung: Datenkapselung, Vererbung und Polymorphie.
================================================== ============

Ich hoffe ich konnte euch Polymorphie erklären können und viel Spaß beim lernen!
XxharCs is offline  
Thanks
3 Users
Old 10/17/2013, 01:01   #2
 
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
Quote:
Originally Posted by XxharCs View Post
Die Signatur einer Methode ist der Name der Methode und die Typen in ihrer Parameterliste [...]
Der Rückgabetyp ist kein Bestandteil der Signatur.
Der Rückgabetyp ist Bestandteil der Signatur, nur kann er nicht (allein) überladen werden. Sonst wäre (statische) Typsicherheit nicht gewährleistet. Daher ist der Rückgabetyp von überschreibenden Methoden entsprechend eingeschränkt.
Noch zu erwähnen wäre, dass die Überladung statisch bestimmt wird, auch wenn das in Java keine Rolle spielt. Das könnte sich aber ändern...

Quote:
Originally Posted by XxharCs View Post
Aufgabenstellung String:
Code:
  public static void main(String[] a){ 
    WrapperString s=new WrapperString("1"); 
    System.out.println(s.toString()); 
     
  }
Aufgabenstellung Integer:
Code:
  public static void main(String[] a){ 
    WrapperInteger s=new WrapperInteger(2); 
    System.out.println(s.toString()); 
     
  }
Aufgabenstellung Double:
Code:
  public static void main(String[] a){ 
    WrapperDouble s=new WrapperDouble(3.6); 
    System.out.println(s.toString()); 
    s.setValue(4.4); 
    System.out.println(s.toString()); 
  }
Warum so unterschiedlich?

Quote:
Originally Posted by XxharCs View Post
Fehler in statischen Teilen:
Code:
public class MyList<T> { 
  private T head; 
  private List<T> tail; 
 
  public static void main(String[] args) { 
    List<T> list = new List<T>(); 
  } 
}
Die Aktualisierung der formalen Typparameter erfolgt für jedes Objekt individuell.
Daher darf in statischen Teilen einer generischen Klasse Nicht auf die formalen Typparameter der Klasse Bezug genommen werden![B]
Vielleicht sollte da noch der Fehler aufgezeigt werden und der (scheinbare) Widerspruch mit 1.3.1.4 gelöst werden.

Quote:
Originally Posted by XxharCs View Post
Unterschied zwischen <? extends X> und <T extends X> ?
Wenn der Typ <T> weiter zum Beispiel innerhalb der Klasse oder Methode benötigt wird, muss die zweite Form gewählt werden. Ansonsten sollte die erste Variante bevorzugt werden.
Wenn ich den Typ gar nicht brauche, wozu dann generisch? Könntest du vielleicht noch ein Beispiel dafür angeben?
Tasiro is offline  
Old 10/17/2013, 10:01   #3
 
XxharCs's Avatar
 
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,228
Quote:
Originally Posted by Tasiro View Post
Der Rückgabetyp ist Bestandteil der Signatur, nur kann er nicht (allein) überladen werden. Sonst wäre (statische) Typsicherheit nicht gewährleistet. Daher ist der Rückgabetyp von überschreibenden Methoden entsprechend eingeschränkt.
Noch zu erwähnen wäre, dass die Überladung statisch bestimmt wird, auch wenn das in Java keine Rolle spielt. Das könnte sich aber ändern...
Der Methodenname, die Parameter und die Typen der Parameter definieren die Signatur einer Methode – der Rückgabetyp gehört nicht dazu.
Das ist in C(++) anders. Dort ist die Signatur einer Funktion auch durch den Rückgabetyp definiert.

Quote:
Originally Posted by Tasiro View Post
Warum so unterschiedlich?
Das sollten nur Beispiele sein(zur Vorstellung) um dann das Code-Beispiel welches Generische Klassen erklärt, zu machen.
Ich zittiere kurz die Stelle aus meinen Post dazu:
Quote:
Originally Posted by XxharCs View Post
Wie aus dem o.a. Beispiel gut ersichtlich ist, sind die Unterschiede nur im Datentyp des Wertes (value). Bei einer generischen Klasse wird nun der Datentyp durch einen Typparameter ersetzt. Dadurch haben wir eine generische (multifunktionale) Klasse.
Beispiel:
...
...
Quote:
Originally Posted by Tasiro View Post
Vielleicht sollte da noch der Fehler aufgezeigt werden und der (scheinbare) Widerspruch mit 1.3.1.4 gelöst werden.
Steht eigentlisch schon da, also die Erklärung zum Fehler und somit die Auflösung dazu.
Aber hier nochmal, aber anders formuliert (Diese Formulierung kann Verwirrung hervorrufen!):

Man kann keine Generische Typparameter einer Klasse in statischen Methoden oder in statischen Feldern verwenden. Die Typparameter der Klasse sind nur im Umfang/Umfeld für Instanz Methoden und Instanz Felder. Für statische Felder und statische Methoden, werden diese über alle Instanzen der Klasse verteilt, sogar Instanzen von unterschiedlichen Typparametern.

Quote:
Originally Posted by Tasiro View Post
Wenn ich den Typ gar nicht brauche, wozu dann generisch? Könntest du vielleicht noch ein Beispiel dafür angeben?
Der Typparameter des '?' Wildcards ist beliebig.
Die Wildcard beschreibt also die Eigenschaft eines Typparameters. Wenn (es zum Beispiel)

Code:
LottoSchein<? extends LottoZahlen> ls;
heißt, dann können in dem LottoSchein ls alle möglichen LottoZahlen-Objekte sein.
XxharCs is offline  
Old 10/17/2013, 23:11   #4
 
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
Quote:
Originally Posted by XxharCs View Post
Der Methodenname, die Parameter und die Typen der Parameter definieren die Signatur einer Methode – der Rückgabetyp gehört nicht dazu.
Das ist in C(++) anders. Dort ist die Signatur einer Funktion auch durch den Rückgabetyp definiert.
Laut C++-Spezifikation gehört der Rückgabetyp in C++ genau dann zur Signatur, wenn es sich um ein Funktionstemplate oder eine Funktionstemplatespezialisierung handelt. Nach der Java-Spezifikation scheint die Funktionssignatur ebenfalls den Rückgabetyp nicht zu beinhalten, auch wenn in den relevanten Absätzen noch explizit der Rückgabetyp angeführt wird (abstrakte Methoden, Repräsentation von Methodennamen etc.) oder implizit verwendet wird (z. B. bei Prüfung der Gleichheit zweier Signaturen).

Quote:
Originally Posted by XxharCs View Post
Diese Formulierung kann Verwirrung hervorrufen!
Das lässt sich nicht leugnen.

Quote:
Originally Posted by XxharCs View Post
Man kann keine Generische Typparameter einer Klasse in statischen Methoden oder in statischen Feldern verwenden. Die Typparameter der Klasse sind nur im Umfang/Umfeld für Instanz Methoden und Instanz Felder. Für statische Felder und statische Methoden, werden diese über alle Instanzen der Klasse verteilt, sogar Instanzen von unterschiedlichen Typparametern.
Für statische Felder und Methoden auf Instanzen (von unterschiedlichen Typparametern) verteilte Typparameter? Hat das etwas mit "verschmierter Aufenthaltswarscheinlichkeit" zu tun? Oder möchtest du darauf hinweisen, dass Typparameter zu nicht mehr als Typüberprüfung führen und ansonsten im Prinzip nichts anderes als Object sind?

Quote:
Originally Posted by XxharCs View Post
Der Typparameter des '?' Wildcards ist beliebig.
Die Wildcard beschreibt also die Eigenschaft eines Typparameters. Wenn (es zum Beispiel)

Code:
LottoSchein<? extends LottoZahlen> ls;
heißt, dann können in dem LottoSchein ls alle möglichen LottoZahlen-Objekte sein.
Danke, genau so ein Beispiel meinte ich; der Kontext, in dem dieses Fragezeichen stehen darf, war unklar, deine Ausführungen ließen auf den Kontext einer Methode jener generischen Klasse schließen.


Ich glaube, du hast meine Intension missverstanden...
Tasiro is offline  
Old 10/18/2013, 10:16   #5
 
XxharCs's Avatar
 
elite*gold: 34
Join Date: Apr 2011
Posts: 1,475
Received Thanks: 1,228
Quote:
Originally Posted by Tasiro View Post
Für statische Felder und Methoden auf Instanzen (von unterschiedlichen Typparametern) verteilte Typparameter? Hat das etwas mit "verschmierter Aufenthaltswarscheinlichkeit" zu tun? Oder möchtest du darauf hinweisen, dass Typparameter zu nicht mehr als Typüberprüfung führen und ansonsten im Prinzip nichts anderes als Object sind?
Typparameter sind Objekte, falls du es nicht aus dem Text entnommen hast, hier noch einmal:
Quote:
Originally Posted by XxharCs View Post
Daher darf in statischen Teilen einer generischen Klasse Nicht auf die formalen Typparameter der Klasse Bezug genommen werden!

Wichtig:
Generics sind per "Type Erasure" implementiert: Die Typen werden zur Kompilierzeit überprüft und anschließend wird die Typinformation entfernt.

Achtung:

Es gibt generische Klassen, aber keine „generischen Objekte“! Jedes Objekt hat den bei seiner Erzeugung festgelegten Typ.
Ich verstehe nicht genau, was du da nicht verstehst. Die Antwort findet sich im Text.

Quote:
Originally Posted by Tasiro View Post
Ich glaube, du hast meine Intension missverstanden...
Ja kann gut sein!
XxharCs is offline  
Old 10/18/2013, 22:47   #6
 
elite*gold: 0
Join Date: Jan 2012
Posts: 759
Received Thanks: 416
Das Tutorial liest sich ja fast so wie Guttenbergs Doktorarbeit.
dowhile is offline  
Thanks
2 Users
Reply


Similar Threads Similar Threads
[JAVA Error] Could not create the java virtual machine
07/21/2013 - Technical Support - 10 Replies
Schönen Abend! Leider hat es sich aus einem unerfindlichen Grund ergeben, dass sobald ich die Minecraft.exe starten will die Errormeldung kommt. Die Tips auf Minecraft.net habe ich schon ohne Erfolg befolgt. Hoffe ihr könnt mir weiterhelfen... Mein PC:
recompile Problem (Block.java, item.java)
04/13/2013 - Minecraft - 1 Replies
Guten Morgen liebe Com (: Ich versuche etwas neues in Minecraft.. für mich einzubauen.. neuer Block + das Item dazu, des eingepflanzt werden muss.. wie bei einer Karotte oder einer Kartoffel. Ich zeige euch den Inhalt meiner BlockOnion.java package net.minecraft.src;
[Java] Could not create the Java virtual machine
06/22/2011 - Minecraft - 1 Replies
hallo ihr minecraftler ^^ habe seit heute das problem das wenn ich minecraft starte original als auch cracked das diese fehlermeldung kommt: Java virtual machine Launcher Could not create the Java virtual machine



All times are GMT +1. The time now is 09:24.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.