Zugriff auf Methodenergebnisse?

eine Variable ist nur ein reservierter Speicherbereich in den man schreiben kann. Wieviele Pointer-Zugriffe auf dem Weg dorthin stehen ist irrelevant. Und du wirst mir doch nicht sagen wollen, dass öffentliche Klassenvariablen nicht im Speicher stehen, oder?
 
Original geschrieben von squeaker
eine Variable ist nur ein reservierter Speicherbereich in den man schreiben kann. Wieviele Pointer-Zugriffe auf dem Weg dorthin stehen ist irrelevant. Und du wirst mir doch nicht sagen wollen, dass öffentliche Klassenvariablen nicht im Speicher stehen, oder?

Eine Variable in der Programmierung ist viel mehr als das. In der Programmierung kommen
eine Sichtbarkeit und ähnliche Attribute hinzu, weshalb deine Definition nicht griffig ist.

Eine statische Klassenvariable bleibt eine statische Klassenvariable, und keine globale
Variable.
Und wenn du mir nicht glaubst, dann verweise ich dich jetzt einfach mal auf die Java Language Spezifikation. Dort kannst du dich dann tot und dähmlich nach einer globalen Variable suchen ;)


http://java.sun.com/docs/books/jls/second_edition/html/j.title.doc.html

If a field is declared static, there exists exactly one incarnation of the field, no matter how many instances (possibly zero) of the class may eventually be created. A static field, sometimes called a class variable, is incarnated when the class is initialized (§12.4).

A field that is not declared static (sometimes called a non-static field) is called an instance variable. Whenever a new instance of a class is created, a new variable associated with that instance is created for every instance variable declared in that class or any of its superclasses. The example program:
Code:
class Point {
	int x, y, useCount;
	Point(int x, int y) { this.x = x; this.y = y; }
	final static Point origin = new Point(0, 0);
}
class Test {
	public static void main(String[] args) {
		Point p = new Point(1,1);
		Point q = new Point(2,2);
		p.x = 3; p.y = 3; p.useCount++; p.origin.useCount++;
		System.out.println("(" + q.x + "," + q.y + ")");
		System.out.println(q.useCount);
		System.out.println(q.origin == Point.origin);
		System.out.println(q.origin.useCount);
	}
}
prints:

(2,2)
0
true
1

showing that changing the fields x, y, and useCount of p does not affect the fields of q, because these fields are instance variables in distinct objects. In this example, the class variable origin of the class Point is referenced both using the class name as a qualifier, in Point.origin, and using variables of the class type in field access expressions (§15.11), as in p.origin and q.origin. These two ways of accessing the origin class variable access the same object, evidenced by the fact that the value of the reference equality expression (§15.21.3):

q.origin==Point.origin

is true. Further evidence is that the incrementation:

p.origin.useCount++;

causes the value of q.origin.useCount to be 1; this is so because p.origin and q.origin refer to the same variable.
 
Zusatz:

http://java.sun.com/developer/JDCTechTips/2001/tt1009.html

Imagine that you have a large body of C code, and you're thinking about recoding it using Java features. What are some of the "big picture" issues that you need to consider when you do this? This tip presents a series of examples, and covers some of the issues in converting C code to the Java language. It focuses, in particular, on program and data structuring.

One preliminary note about this kind of conversion. The C and Java languages are very different. C is targeted toward systems programming and the ability to perform low-level manipulations. By comparison, the Java language takes a higher-level view, and has better facilities for writing large, well-structured, hardware-independent applications. So understand that some features in each language do not exist or are very different in the other.

Let's start by looking at a simple C program, one that contains a global variable whose value is set and then retrieved and printed:
Code:
    /* ConvDemo1.c */
    
    #include <stdio.h>
    
    int current_month;  
    /* current month as a value 1-12 */
    
    int main()
    {
        current_month = 9;
    
        printf("current month = %d\n", current_month);
    
        return 0;
    }
When you run the program, the result is:

current month = 9

There is no Java equivalent to a global variable, so how would you write a corresponding program? Here's one way of doing it:
.............
 
Wir werden uns da nie einigen - für mich kommt es auf den Effekt drauf an. Sprich ein Sprachkonstrukt ist für mich sozusagen wie ein Baustein. Wenn es sich verhält wie ein anderer Baustein, sind sie für mich äquivalent. Dies ist bei globalen Variablen in C und statischen Klassenvariablen in Java der Fall.

Aber dann dürftest du nicht von Konstanten in Java reden. Dies sind nämlich eigentlich Variablendeklarationen mit anschliessender Definition die durch den Modifier final vor dem Überschreiben geschützt sind.
Damit sind sie normale Variablen mit Modifier, verhalten sich aber wie Konstanten. Ich kann sie einwandfrei und guten Gewissens so nennen - und was ist mit dir?
 
squeaker hat gesagt.:
Wir werden uns da nie einigen - für mich kommt es auf den Effekt drauf an. Sprich ein Sprachkonstrukt ist für mich sozusagen wie ein Baustein. Wenn es sich verhält wie ein anderer Baustein, sind sie für mich äquivalent. Dies ist bei globalen Variablen in C und statischen Klassenvariablen in Java der Fall.

Du kannst dir das zusammbasteln wie du das willst. Du musst aber damit leben das
deine Aussage: Es gibt globale Variablen definitiv falsch ist.

Ich esse, ich muss schlafen, ich bin schlecht gelaut wenn ich hungrig bin, ja ich verhalte
mich wie ein Hund, bin dennoch ein Mensch ;)

Aber dann dürftest du nicht von Konstanten in Java reden. Dies sind nämlich eigentlich Variablendeklarationen mit anschliessender Definition die durch den Modifier final vor dem Überschreiben geschützt sind.
Damit sind sie normale Variablen mit Modifier, verhalten sich aber wie Konstanten. Ich kann sie einwandfrei und guten Gewissens so nennen - und was ist mit dir?
Ich halte so oder so den Ausdruck finale Werte für besser. Da aber die eigenschafft konstant zu sein, nicht an einen bestimmten Typ von Variable gebunden ist, kommen wir dem ziemlich nahe das ich den Begriff so akzeptieren kann. Jedoch spricht allein beim Ausdruck Globale Variable ein grosser Fehler hervor. Und zwar jener das es eine Klassenvariable ist
und keine Variable. Von mir aus kannst du das gern auch Globale Klassenvariable nennen, dann wird der Sinn verdeutlicht.

Der Punkt ansich ist doch das der Ausdruck: "globale Variable" zu verwirrungen führt. Wie ich schon angemerkt habe, haben Snape und ich nicht verstanden was ihr damit meintet. Und ich denke ich kann von mir behaupten das ich Java verstehe und kann, insbesondere OOP. Und dennoch führt dies zu missverständlichkeiten.
 
ich war nicht der erste der von globalen Variablen gesprochen hat - ich war blos der einzige der ihn verstanden hat.
 
Original geschrieben von squeaker
ich war nicht der erste der von globalen Variablen gesprochen hat - ich war blos der einzige der ihn verstanden hat.

Dafür hast du aber vehement den Ausdruck globale Variable verteidigt :)

PS: Dies ist ja nicht irgendein Fingerzeig: Der hat Jehova gesagt, sondern wollte das nur anmerken ;)
 
Es geht ja schon los beim Begriff Variable, den dieser Begriff stammt von den von den Neumann sprachen ( C ADA85 Modula) .
In reinen OOP Sprachen sollte man eher von Klassen, Instanz, Felder oder Attribute sprechen.
Es gibt Klasse in den Felder defniniert werden.
Von einer Klasse gibt es eine Instanz, diese besitzt Attribute entsprechend der Felder der Klasse.
Es gibt leider keine allgemein gultige Taxonomie der OOP, so das nicht sagen kann deine sematische Deutunge eines Begriff ist falsch.
Wobei statiche Attribute und globale Variablen ja gegen das gleiche SE-Prinzip Information Hidding verstossen.Deshalb wurden diese in diessem Kontext als gleichwertige betracht.
 
ADA&QS hat gesagt.:
Es geht ja schon los beim Begriff Variable, den dieser Begriff stammt von den von den Neumann sprachen ( C ADA85 Modula) .
In reinen OOP Sprachen sollte man eher von Klassen, Instanz, Felder oder Attribute sprechen.
Es gibt Klasse in den Felder defniniert werden.
Von einer Klasse gibt es eine Instanz, diese besitzt Attribute entsprechend der Felder der Klasse.
Es gibt leider keine allgemein gultige Taxonomie der OOP, so das nicht sagen kann deine sematische Deutunge eines Begriff ist falsch.

Nun die Begriffe unterscheiden sich auch von Sprachen zu sprachen.

So spricht mann entweder von Membervariablen, Instancevariablen, Feldern und weis gott noch was.
Dennoch ist eine lokale Variable primitiven Types keine Instanz, kein Feld und natürlich kein Attribut, Klasse usw. Eine lokale Variable ist eine Variable, denn es gibt keine andere Bezeichnung dafür die sie beschreibt.

Wobei statiche Attribute und globale Variablen ja gegen das gleiche SE-Prinzip Information Hidding verstossen.Deshalb wurden diese in diessem Kontext als gleichwertige betracht.

Global Variablen will ich hier jetzt mal nicht beachten. Aber Statische attribute gibt es so in Java auch nicht. Denn ein Attribute ist eine Instanz Variable die ihre Zugriffsmethoden (getter/setter) mitbringt.
Mhhh ausser du meinst das komische Konstrukt einer privaten statischen Variable die Instanzmethoden (get/set) mitbringt. ;)

In Java sollten oeffentliche Klassenvariablen grundsätzlich final und mit Wert vorbelegt sein. Das ist unter Java ein übliches konstrukt um enums zu emulieren, welche erst mit Java 1.5 zur verfügung stehen.
Ich z.b nutze sie gerne um Map Keys von z.b RequestMaps auszulagern. Oder SQL Querys
Code:
public class Constants {
   public static class Session {
        public static final String USER = "myproj.session.user";
    }
    public static class Querys {
         public static final String GET_USER = "insert into foo values (?,?,?)";
}

/// irgendwo:
request.getSession().getAttribute(Constants.Session.USER);

bzw 
PreparedStatement stm = new PreparedStatement(Constants.Querys.GET_USER);

Das heisst ich habe den Vorteil ich weiss immer was ich irgendwo in der Session gespeichert
habe, da die Keys schoen säuberlich unter Session aufgelistet werden, bzw ich kann ich meine Datenbank umändern und brauche letztendlich nur eine .java Datei editieren um mit JDBC zu arbeiten. Wobei ich mittlerweile JDBC ganz ausser Acht lasse und mich da auf JDO verlass.
 

Neue Beiträge

Zurück