Pointer in Java

dogmi

Mitglied
Hallo ich bin neu hier, normal programmiere ich C und mache Java nur zur Entspannung und wenn ich mal was kleines programmieren will, trotzdem will ich keinen Müll programmieren.
Mein Problem war immer das man keine Pointer hatte, das hat den Nachteil in Java das man, sobald eine Funktion mehr als 1 Rückgabe Wert braucht, eine Klasse schreiben muss oder, wenn es vom gleichen Datentyp ist in eine Liste packen muss und diese zurück gibt. Hab dann mal kurz überlegt, ist es gängig oder vom großen Nachteil wenn man sich einen Pointer schreibt. Hab es so gemacht.(nur ein Beispiel, hab es nicht in einer Arbeitsumgebung geschrieben, kann Syntaxfehler enthalten)

function void calc(String s1[], String s2[]){

if (s1 == null || s2 == null)
return;
s1[0] += "2";
s1[0] += "4";
}

function void egal(){
String s1[] = new String[1];
String s2[] = new String[1];
s1[0]="1+1=";
s2[0]="2+2=";
calc(s1,s2);
System.out.println(s1);
System.out.println(s2);
}

Am Ende kommt "1+1=2" und "2+2=4" raus. Das Beispiel ist blöd es geht nur um das Prinzip. Was passiert da: Ganz einfach ich instanziieren ein Array und übergebe nur den Speicherort bei der Funkion. Die Funktion muss zwangsläufig den gleichen Wert bearbeiten, was bei einer normalen Übergabe nicht der Fall ist.

1. Frage gibt es eine bessere Möglichkeit. (man beachte auch mit Verschiedenen datentypen und es sollte nicht vom Code her nicht viel länger sein).
2. Frage kann man den S***** so machen und was muss man alles beachten.

Ich hab zu dem Thema wenig (eigentlich gar nichts) gefunden. Vielleicht kann mir jemand mal zeigen wie er das dann löst.
 
Zuletzt bearbeitet:

VfL_Freak

Top Contributor
Moin,

Mein Problem war immer das man keine Pointer hatte, das hat den Nachteil in Java das man, sobald eine Funktion mehr als 1 Rückgabe Wert braucht, eine Klasse schreiben muss oder, wenn es vom gleichen Datentyp ist in eine Liste packen muss und diese zurück gibt.
Na, ob das wirklich ein Nachteil ist ???:L
Ist sehe es eher als Vorteil an :)

Hab dann mal kurz überlegt, ist es gängig oder vom großen Nachteil wenn man sich einen Pointer schreibt. Hab es so gemacht.(nur ein Beispiel, hab es nicht in einer Arbeitsumgebung geschrieben, kann Syntaxfehler enthalten)
Java:
function void calc(String s1[], String s2[]){
   if (s1 == null || s2 == null)
       return;
   s1[0] += "2";
   s1[0] += "4";
}

function void egal(){
    String s1[] = new String[1];
    String s2[] = new String[1];
    s1[0]="1+1=";
    s2[0]="2+2=";
    calc(s1,s2);
    System.out.println(s1);
    System.out.println(s2);
}
Am Ende kommt "1+1=2" und "2+2=4" raus.
Erstens hat dies nicht mit den Pointern zu tun, die Du von C/C++ kennst!!
Zweitens wird das so nicht funktionieren, da Du ein String-Array so NICHT mit "println" ausgeben kannst ...
Die Ausgabe wäre hier bspw. so was
[Ljava.lang.String;@1d5b89c
[Ljava.lang.String;@4b0bbb
Was soll überhaupt das Array der Länge 1 ???:L
Warum kein normaler String oder besser StringBuffer ???:L


Hier mal ein korrigiertes Beispiel:
Java:
void calc( StringBuffer s1, StringBuffer s2 )
{
    if( s1 == null || s2 == null )
    {
        return;
    }
	    
    s1.append( "2" );
    s2.append( "4" );
}
// #########################
function void egal()
{
   StringBuffer s1 = new StringBuffer();
   StringBuffer s2 = new StringBuffer();
   s1.append( "1+1=" );
   s2.append( "2+2=" );
   calc( s1, s2 );
   System.out.println( s1.toString() );
   System.out.println( s2.toString() );
}
Wie gesagt, ist normale Werteüber- und Rückgabe und hat nix mit Pointern zu tun!

Gruß
Klaus
 
Zuletzt bearbeitet:

dogmi

Mitglied
Erstens hat dies nicht mit den Pointern zu tun, die Du von C/C++ kennst!!

Sicher, ein Pointer ist auch nichts anderes als ein Zeiger auf eine Adresse, hast ja selber geschrieben:

[Ljava.lang.String;@1d5b89c
[Ljava.lang.String;@4b0bbb

Hast recht muss natürlich heißen::oops:

System.out.println(s1[0]);
System.out.println(s2[0]);

Was soll überhaupt das Array der Länge 1

Das ist ja der Witz an der Sache, damit ich an die Speicheradresse komm. In c macht man & davor, nur hier, mach ich es so.

void calc( StringBuffer s1, StringBuffer s2 )

Das Klingt interessanter. Nur gibt es auch eine Klasse die das Allgemein hinbekommt. Wie sieht es dann mit einem Calendar Object aus? Hab jetzt auf die Schnelle nix gefunden.
 

VfL_Freak

Top Contributor
Moin,

wieso denn jetzt plötzlich Calender ???:L

Du kannst natürlich aus dem Calender-Objekt auch einen formatierten String machen ...

Gruß
Klaus
 

dogmi

Mitglied
1. Frage gibt es eine bessere Möglichkeit. (man beachte auch mit Verschiedenen datentypen und es sollte nicht vom Code her nicht viel länger sein).

hab ich oben geschrieben, hätte vielleicht noch "bzw. Klassen" schreiben sollen
 
Zuletzt bearbeitet:

Barista

Top Contributor
Ich würde Deinen Stil aufgrund der Veränderung des übergebenen Parameters (Seiteneffekt) ablehnen.

Dass es in Java keine eingebauten Tupel wie in Scala gibt stört mich auch.

Du kannst Dir aber einfach Tupel-Klassen schreiben:

Java:
/**
 * Tupel.
 * 
 * @author Heiner Kücker
 */
public final class Tuple2<T0, T1>
{
    public final T0 _0;
    public final T1 _1;
    /**
     * Konstruktor.
     *
     * @param _0
     * @param _1
     */
    public Tuple2( 
            final T0 _0 , 
            final T1 _1 )
    {
        this._0 = _0;
        this._1 = _1;
    }

    /**
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode()
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + ( ( this._0 == null ) ? 0 : this._0.hashCode() );
        result = prime * result + ( ( this._1 == null ) ? 0 : this._1.hashCode() );
        return result;
    }
    
    /**
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals( 
            final Object obj )
    {
        if ( this == obj )
        {
            return true;
        }
        if ( obj == null )
        {
            return false;
        }
        if ( getClass() != obj.getClass() )
        {
            return false;
        }
        final Tuple2<?, ?> other = (Tuple2<?, ?>) obj;
        if ( this._0 == null )
        {
            if ( other._0 != null )
            {
                return false;
            }
        }
        else if ( ! this._0.equals( other._0 ) )
        {
            return false;
        }
        if ( this._1 == null )
        {
            if ( other._1 != null )
            {
                return false;
            }
        }
        else if ( ! this._1.equals( other._1 ) )
        {
            return false;
        }
        return true;
    }

}

Die erschreckend großen Methoden hashCode und equals kannst Du Dir mit Eclipse oder einer anderen IDE generieren lassen.
 
Zuletzt bearbeitet:

X5-599

Top Contributor
Es ist zu beachten, dass es in Java kein wirkliches "Call by Reference" gibt. Ich denke mal das ist das Grundproblem hier.

Ich verstehe es so (wenn es eine bessere Erklärung gibt; nur her damit):
Man bekommt nicht die direkte Referenz des Objektes sondern "lediglich" eine Kopie davon. Man kann also z.B. das Objekt an der Speicherstelle nicht durch ein anderes ersetzen. Man kann aber durchaus Einfluss auf die Eigenschaften des Objektes nehmen.
Ein Beispiel:

Java:
private void methodeA()
{
    MeineKlasse a = new MeineKlasse();
    a.setName("Name A");
    
    methodeB(a);
    
    System.out.println(a.getName());    //Der Name ist immer noch "Name A".
    
    methodeC(a);

    System.out.println(a.getName());    //Der Name ist jetzt "Name C".
}


private void methodeB(MeineKlasse tmp)
{
    tmp = new MeineKlasse();
    tmp.setName("Name B");
}

private void methodeC(MeineKlasse tmp)
{
    tmp.setName("Name C");
}
 

Barista

Top Contributor
Es ist zu beachten, dass es in Java kein wirkliches "Call by Reference" gibt. Ich denke mal das ist das Grundproblem hier.

Ich verstehe es so (wenn es eine bessere Erklärung gibt; nur her damit):
Man bekommt nicht die direkte Referenz des Objektes sondern "lediglich" eine Kopie davon. Man kann also z.B. das Objekt an der Speicherstelle nicht durch ein anderes ersetzen.

Ja, alles genau meiner Meinung.
Mit der Referenz in Java ist es so, dass man die nicht ändern kann.
Der Konstruktor ist der einzige Referenz-Erzeuger.

Man kann aber durchaus Einfluss auf die Eigenschaften des Objektes nehmen.

Ja.

Ich meinte etwas anderes, nämlich dieses "Einfluss auf die Eigenschaften des Objektes nehmen".

Das ist einfach schlecht und darüber gibt es eigentlich jede Menge Literatur und Web-Quellen

Vermeidung globaler Status

Seiteneffekte

funktionale Programmierung.

Besser ist es, die Parameter-Werte unveränderlich zum Erzeugen eines Ergebnisses zu verwenden.

Auf den Overhead an Rechenleistung und Speicher kommt es meist nicht an.
 

dogmi

Mitglied
Auf den Overhead an Rechenleistung und Speicher kommt es meist nicht an.

Kommt drauf an, aber dann würde ich nicht Java nutzen. :lol:

Barista, ich glaube die Lösung sieht brauchbar aus. Das bisschen Code mehr, ist zu verschmerzen und sieht hübscher aus.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Survari Variablen Java Function Pointer Allgemeine Java-Themen 8
Curtis_MC Pointer mit ArrayList vergleichen Allgemeine Java-Themen 6
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
T JasperReports mit Null Pointer Allgemeine Java-Themen 3
R Inputstream lesen mit Pointer Allgemeine Java-Themen 0
T C DLL einbinden und Pointer übergeben Allgemeine Java-Themen 13
B List Pointer zurücksetzen Allgemeine Java-Themen 10
S Null Pointer Exception bei BufferedReader Allgemeine Java-Themen 4
E Queue: Wie kann hier ein null-Pointer Exception auftreten?! Allgemeine Java-Themen 11
M JNA Pointer Allgemeine Java-Themen 2
L null pointer exception Allgemeine Java-Themen 10
J Null Pointer in der compare-Methode des Comparators? Allgemeine Java-Themen 18
knuckles12 null pointer exception bei arrays Allgemeine Java-Themen 6
G Pointer und Referenzen Allgemeine Java-Themen 3
F Pointer oder Reference? Allgemeine Java-Themen 8
B Null Pointer Exception bei Canvas-objekt-Aufruf Allgemeine Java-Themen 12
G Nicht abgefangene Null-Pointer-Exception Allgemeine Java-Themen 2
S Null Pointer Exception Allgemeine Java-Themen 10
T JNI: jcharArray: warning: cast to pointer from integer of. Allgemeine Java-Themen 5
O Pointer/reference on method Allgemeine Java-Themen 10
theJavaMaschine Mitstreiter gesucht: Gemeinsam Java und Android Development lernen! Allgemeine Java-Themen 5
PARAS Karriereberatung benötigt: Wie kann ich ein Java Full Stack Entwickler werden? Allgemeine Java-Themen 7
P Java Access Bridge Allgemeine Java-Themen 5
W ICEpdf PDF-Dateien werden mit Java 21 nicht nicht mehr vollständig dargestellt Allgemeine Java-Themen 3
MiMa Grundsätzliche Frage zur Verwendung von Java Versionen?? Allgemeine Java-Themen 3
OnDemand Java Deployment Vaadin Allgemeine Java-Themen 3
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
Zrebna Wieso sind eigentlich JUnit-Tests in src/test/java platziert - nur Konvention? Allgemeine Java-Themen 7
N LlaMA, KI, java-llama.cpp Allgemeine Java-Themen 39
V Java-Codierungsherausforderung: Navigieren durch die Macken der Datumsmanipulation Allgemeine Java-Themen 2
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
M java: unexpected type Allgemeine Java-Themen 2
harrytut Java Input/Output Tests Junit Allgemeine Java-Themen 3
B Java Discord bot auf ein Root Server? Allgemeine Java-Themen 1
BetziTheRealOne Java PKIX path building failed as non Admin Allgemeine Java-Themen 15
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
KonradN Java 21 Release Allgemeine Java-Themen 5
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
K Java Anwendung machen Anleitung Allgemeine Java-Themen 5
G java.io.listFiles() Allgemeine Java-Themen 3
8u3631984 Frage zu Java Streams min / max Allgemeine Java-Themen 17
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
K Java-Projekt Allgemeine Java-Themen 11
K Java-Projekt Allgemeine Java-Themen 0
ruutaiokwu Welcher Browser unterstützt heutzutage noch Java Applets? Allgemeine Java-Themen 5
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
rode45e Java Threads Allgemeine Java-Themen 4
G java.io.listFiles() Allgemeine Java-Themen 2
N Java Dynamic Proxy Allgemeine Java-Themen 3
N Leichte Java Gegner Ki Allgemeine Java-Themen 10
A Java modul Problem Allgemeine Java-Themen 4
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
V Funktionale Schnittstelle in Java Allgemeine Java-Themen 3
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
berserkerdq2 Wenn ich bei Intelij javafx mit maven importieren will, muss ich das in die pom.xml reintun, aber warum noch in module-info.java? Allgemeine Java-Themen 3
KonradN Java 20 am 21. März Allgemeine Java-Themen 1
O Java Website Stock Bot Allgemeine Java-Themen 3
J Front-/Backend in Java Allgemeine Java-Themen 14
doopexxx JAVA Google Webcrawler Allgemeine Java-Themen 1
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
G java.lang.NoClassDefFoundError: org/aspectj/lang/Signature Allgemeine Java-Themen 2
lalex1491 Java Aktienkurse nachfragen Allgemeine Java-Themen 4
J Class to link Java Allgemeine Java-Themen 4
V Wie funktioniert das Schlüsselwort "final" von Java? Allgemeine Java-Themen 19
mrStudent Inferenz JAVA Allgemeine Java-Themen 6
U URI Rechner (Java Script) Allgemeine Java-Themen 7
TheSkyRider Java Geburtsdatum Textfeld Allgemeine Java-Themen 7
mihe7 Java 19 JavaDocs: Browserintegration Allgemeine Java-Themen 1
Encera Gleichzeitiges Ausführen und verbinden von 2 Java-Klassen über die Eingabeaufforderung und Eclipse Allgemeine Java-Themen 21
H Java Rechner Programmierung der Mathematik Allgemeine Java-Themen 33
Lennox Schinkel Java Kara Auf einen Java Host laufen lassen Allgemeine Java-Themen 17
C Fußnoten von DocX mit Java Allgemeine Java-Themen 2
C Fußnoten in DocX mit Java Allgemeine Java-Themen 1
M Aussagenlogik in Java Programmieren Allgemeine Java-Themen 22
B Per Java Word Dokument schreiben? Allgemeine Java-Themen 8
krgewb Java-Bibliothek für ONVIF Allgemeine Java-Themen 1
KonradN Oracle übergibt (Java Teile der) GraalVM Community Edition an OpenJDK Community Allgemeine Java-Themen 2
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
B Java mit command line und jars benutzen? Allgemeine Java-Themen 18
M Java Überprüfen ob .exe-Datei bereits ausgeführt wird Allgemeine Java-Themen 2
B HTTP Allgemeine Fragen über Suchmaschine nutzen mit Java Allgemeine Java-Themen 20
Mick P. F. Wie kriege ich die Fehlermeldung "java: symbol lookup error: ..." weg? Allgemeine Java-Themen 11
K Nachhilfe Java Allgemeine Java-Themen 11
KonradN Java 19 Allgemeine Java-Themen 11
F IDEA IntelliJ Java Songliste erstellen Allgemeine Java-Themen 6
TheSepp Java bestimmtes Array auf den Wert 0 setzen Allgemeine Java-Themen 32
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
Sachinbhatt Sind alle Methoden in Java implizit virtuell Allgemeine Java-Themen 2
E Java und integrierte Grafikkarten Allgemeine Java-Themen 18
Sachinbhatt Wie wird die Typumwandlung bei Mehrfachvererbung in Java implementiert? Allgemeine Java-Themen 3
Peterw73 Hilfe bei Java gesucht Allgemeine Java-Themen 3
A Java unter Win 10 Allgemeine Java-Themen 1
B Woher kommen die Bildschirmkoordinaten beim java Robot? Allgemeine Java-Themen 14
P9cman java.Lang Klassen fehlen in JRE System Library Allgemeine Java-Themen 1
T Java Robot Class - Bot Allgemeine Java-Themen 3
E Wie Java Heap Space vergrößern? Allgemeine Java-Themen 3
B Java Programm auf virutellem Desktop laufen lassen? Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben