/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Hvordan virker static funktioner ?
Fra : Henrik Stidsen


Dato : 29-05-04 00:08

Hvordan virker en static funktion ?

Med en static funktion kan man kalde en funktion på en klasse uden at
oprette en instans af denne.

Oprettes der en instans af objektet i den virtuelle maskine som først
nedlægges ved afslutningen af denne ? (altså en avanceret form for
singleton)

--
..: Henrik Stidsen - http://hs235.dk/blog/ ::...
'Veni, Vidi, Velcro' - I came, I saw, I stuck around.

 
 
Lars Dam (29-05-2004)
Kommentar
Fra : Lars Dam


Dato : 29-05-04 07:05

On 28 May 2004 23:07:55 GMT
Henrik Stidsen <nospamforme@hs235.dk> wrote:

> Hvordan virker en static funktion ?
>
> Med en static funktion kan man kalde en funktion på en klasse uden at
> oprette en instans af denne.
>
> Oprettes der en instans af objektet i den virtuelle maskine som først
> nedlægges ved afslutningen af denne ? (altså en avanceret form for
> singleton)

Nej. Eksempel:
class X{
   static int y;
   String z = "Hello world";
}

Når klassen X loadeds oprettes og initialisers y.
Hvergang der new'es en X oprettes og initialiseres z.

dvs. der findes altid kun nul eller een y (i praksis altid een, da det er noget
af det første der laves når klassen X loades), mens der kan findes nul til mange
z (een pr. instans af X).

Som du kan se har y intet med z at gøre, så påstanden om at der oprettes et
'skjult avanceret singleton object' er ikke sand.

> --
> .: Henrik Stidsen - http://hs235.dk/blog/ ::...
> 'Veni, Vidi, Velcro' - I came, I saw, I stuck around.

vh. ld

Thorbjoern Ravn Ande~ (29-05-2004)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 29-05-04 11:46

Henrik Stidsen <nospamforme@hs235.dk> writes:

> Oprettes der en instans af objektet i den virtuelle maskine som først
> nedlægges ved afslutningen af denne ? (altså en avanceret form for
> singleton)

Den ting du har erklæret static, er ikke tilknyttet et objekt og
sidder derfor i selve klassen (og er derfor fælles for alle
objekter).

Af samme grund kan static-ting bruges uden at have kaldt new.

--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn

Kristian Thy (29-05-2004)
Kommentar
Fra : Kristian Thy


Dato : 29-05-04 11:53

Thorbjoern Ravn Andersen uttered:
> Den ting du har erklæret static, er ikke tilknyttet et objekt og
> sidder derfor i selve klassen (og er derfor fælles for alle
> objekter).

Tangentielt spørgsmål - hvis jeg har en klasse med et static object, og
jeg har en anden klasse, der nedarver fra denne klasse og ikke
overskriver feltet, er det så samme felt de deler, eller er der et
static felt for hver klasse alligevel?

\\kristian
--
"The brain is a wonderful organ. It starts working the moment you get
up in the morning and does not stop until you get into the office."
--Robert Frost

Thorbjoern Ravn Ande~ (29-05-2004)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 29-05-04 11:59

Kristian Thy <thy@it.edu> writes:

> Tangentielt spørgsmål - hvis jeg har en klasse med et static object, og
> jeg har en anden klasse, der nedarver fra denne klasse og ikke
> overskriver feltet, er det så samme felt de deler, eller er der et
> static felt for hver klasse alligevel?

Jeg vil _mene_ at der kun er én variabel i dette tilfælde.

Lav et testeksempel (nemt) eller check i specifikationen (sværere).
--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn

Kristian Thy (29-05-2004)
Kommentar
Fra : Kristian Thy


Dato : 29-05-04 13:43

Thorbjoern Ravn Andersen uttered:
>> Tangentielt spørgsmål - hvis jeg har en klasse med et static object, og
>> jeg har en anden klasse, der nedarver fra denne klasse og ikke
>> overskriver feltet, er det så samme felt de deler, eller er der et
>> static felt for hver klasse alligevel?
>
> Jeg vil _mene_ at der kun er én variabel i dette tilfælde.
>
> Lav et testeksempel (nemt) eller check i specifikationen (sværere).

Korrekt, det er faktisk samme objekt:

=== KODE ===
class A { static String s = "foo"; }

class B extends A {}

public class Test{
public static void main( String[] args ){
   System.out.println( A.s );
   System.out.println( B.s );
   B.s = "bar";
   System.out.println( A.s );
   System.out.println( B.s );
}
}


=== OUTPUT ===
$ javac Test.java && java Test
foo
foo
bar
bar


\\kristian
--
"The brain is a wonderful organ. It starts working the moment you get
up in the morning and does not stop until you get into the office."
--Robert Frost

Henrik Stidsen (29-05-2004)
Kommentar
Fra : Henrik Stidsen


Dato : 29-05-04 20:29

Thorbjoern Ravn Andersen <nospam0000@c.dk> wrote in
news:yu2hdtz5x4t.fsf@luhmann.netc.dk

>> Oprettes der en instans af objektet i den virtuelle maskine som
>> først nedlægges ved afslutningen af denne ? (altså en avanceret
>> form for singleton)

> Den ting du har erklæret static, er ikke tilknyttet et objekt og
> sidder derfor i selve klassen (og er derfor fælles for alle
> objekter).
> Af samme grund kan static-ting bruges uden at have kaldt new.

Det ved jeg - men hvordan gør den virtuelle maskine det ? - opretter
den et internt objekt til at holde styr på evt. variabelændringer mm.

--
..: Henrik Stidsen - http://hs235.dk/blog/ ::...
'Veni, Vidi, Velcro' - I came, I saw, I stuck around.

Flare (29-05-2004)
Kommentar
Fra : Flare


Dato : 29-05-04 21:20

> Det ved jeg - men hvordan gør den virtuelle maskine det ? - opretter
> den et internt objekt til at holde styr på evt. variabelændringer mm.

Påstand. Det skal du ikke bekymre dig om. Det kan også ændre løbende som
specs på CLR udvikles. Du har som udvikler blot brug for at vide at runtime
garantere at en static variabler altid er initialiseres nu du skal bruge den
og at variablen er tilknyttet baseklassen.

Om det så kune være "sjovt" at vide er så noget andet. Men så er der mange
sjove spørgsmål man kunne stille sig om frameworks generelt.

Anders J



Thorbjoern Ravn Ande~ (30-05-2004)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 30-05-04 12:47

"Flare" <nomail@sorry.dk> writes:

> specs på CLR udvikles. Du har som udvikler blot brug for at vide at runtime
> garantere at en static variabler altid er initialiseres nu du skal bruge den

Jeg mener at have set noget med at man faktisk godt kan få udført kode
under initialiseringsfasen af en klasse, men at det er temmeligt
eksotisk.

Begynder man først at rode med statiske variable, og flertrådede
programmer, bør man forstå hvordan synkroniseringsmekanismen
fungerer. Man _kan_ komme galt afsted.
--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn

Martin Moller Peders~ (29-05-2004)
Kommentar
Fra : Martin Moller Peders~


Dato : 29-05-04 22:11

In <Xns94F8DA8713001HS235dk@130.225.247.90> Henrik Stidsen <nospamforme@hs235.dk> writes:

>Thorbjoern Ravn Andersen <nospam0000@c.dk> wrote in
>news:yu2hdtz5x4t.fsf@luhmann.netc.dk

>>> Oprettes der en instans af objektet i den virtuelle maskine som
>>> først nedlægges ved afslutningen af denne ? (altså en avanceret
>>> form for singleton)
>
>> Den ting du har erklæret static, er ikke tilknyttet et objekt og
>> sidder derfor i selve klassen (og er derfor fælles for alle
>> objekter).
>> Af samme grund kan static-ting bruges uden at have kaldt new.

>Det ved jeg - men hvordan gør den virtuelle maskine det ? - opretter
>den et internt objekt til at holde styr på evt. variabelændringer mm.

En klasse er ogsaa bare et objekt. Saa en static metode f.x. er bare en
metode i klasseobjektet.

/Martin

Flare (30-05-2004)
Kommentar
Fra : Flare


Dato : 30-05-04 01:02

> En klasse er ogsaa bare et objekt. Saa en static metode f.x. er bare en
> metode i klasseobjektet.

Hvad får dig til at tro / vide det? Det du faktisk siger er at VM'em ved
start opretter et objekt af alle klasser og smiddet disse på heapen (det er
jo et objekt!) og opretter så instanser ud fra dette objekt??

For mig lyder det helt skørt, og jeg vil gerne se en ref til dette da jeg så
er nysgerig :). For mig virker det mere logisk (har som sagt ikke undersøgt
det) at VM'en bruger en interne mekaniske til at holde styr på klasser og
deres statike fields (men som intet har med de objekter som vi normalt
arbejder med)

Anders



Henrik Stidsen (30-05-2004)
Kommentar
Fra : Henrik Stidsen


Dato : 30-05-04 01:50

"Flare" <nomail@sorry.dk> wrote in
news:40b9248c$0$438$edfadb0f@dread14.news.tele.dk

> For mig virker det mere logisk (har som sagt ikke undersøgt
> det) at VM'en bruger en interne mekaniske til at holde styr på
> klasser og deres statike fields (men som intet har med de
> objekter som vi normalt arbejder med)

Det lyder som en fornuftig forklaring - og det var sådan en jeg ledte
efter, ville blot gerne have den officielle forklaring :)

--
..: Henrik Stidsen - http://hs235.dk/blog/ ::...
'Veni, Vidi, Velcro' - I came, I saw, I stuck around.

Kristian Thy (30-05-2004)
Kommentar
Fra : Kristian Thy


Dato : 30-05-04 09:28

Flare uttered:
>> En klasse er ogsaa bare et objekt. Saa en static metode f.x. er bare en
>> metode i klasseobjektet.
>
> Hvad får dig til at tro / vide det?

Har du kigget på refelction-API'et?

\\kristian
--
"The brain is a wonderful organ. It starts working the moment you get
up in the morning and does not stop until you get into the office."
--Robert Frost

Kristian Thy (30-05-2004)
Kommentar
Fra : Kristian Thy


Dato : 30-05-04 09:29

Kristian Thy uttered:
> Har du kigget på refelction-API'et?

s/refelction/reflection

\\kristian
--
"The brain is a wonderful organ. It starts working the moment you get
up in the morning and does not stop until you get into the office."
--Robert Frost

Kristian Thy (30-05-2004)
Kommentar
Fra : Kristian Thy


Dato : 30-05-04 09:34

Flare uttered:
> For mig lyder det helt skørt, og jeg vil gerne se en ref til dette da jeg så
> er nysgerig :).

Fra API-dokumentationen af java.lang.Class:

»Class has no public constructor. Instead Class objects are constructed
automatically by the Java Virtual Machine as classes are loaded and by
calls to the defineClass method in the class loader.«

\\kristian
--
"The brain is a wonderful organ. It starts working the moment you get
up in the morning and does not stop until you get into the office."
--Robert Frost

Filip Larsen (30-05-2004)
Kommentar
Fra : Filip Larsen


Dato : 30-05-04 12:34

"Flare" skrev

> For mig lyder det helt skørt, og jeg vil gerne se en ref til dette da
jeg så
> er nysgerig :).

Generelt kan man finde en del på http://java.sun.com/docs/books/, fx.
Java Language Specification http://java.sun.com/docs/books/jls/ og Java
Virtual Machine Specification http://java.sun.com/docs/books/vmspec/.


Mvh,
--
Filip Larsen



Lars Dam (30-05-2004)
Kommentar
Fra : Lars Dam


Dato : 30-05-04 09:47

On 30 May 2004 08:29:22 GMT
Kristian Thy <thy@it.edu> wrote:

> Kristian Thy uttered:
> > Har du kigget på refelction-API'et?
>
> s/refelction/reflection

Hvis du tænker på klassen java.lang.Class, så er du _helt_ galt på den.

java.lang.Class er en meta informations klasse der kun indeholder information om
en given klasse - og ikke andet. Dvs. den indeholder ikke de faktiske static
attributter for den givne klasse, men informationer om at klassen har statiske
attributter.

>
> \\kristian
> --

vh. ld

Kristian Thy (30-05-2004)
Kommentar
Fra : Kristian Thy


Dato : 30-05-04 10:25

Lars Dam uttered:
> Hvis du tænker på klassen java.lang.Class, så er du _helt_ galt på den.
>
> java.lang.Class er en meta informations klasse der kun indeholder information om
> en given klasse - og ikke andet. Dvs. den indeholder ikke de faktiske static
> attributter for den givne klasse, men informationer om at klassen har statiske
> attributter.

Du har ret, undskyld! Jeg slår lige hjernen til...

\\kristian
--
"The brain is a wonderful organ. It starts working the moment you get
up in the morning and does not stop until you get into the office."
--Robert Frost

Lars Dam (30-05-2004)
Kommentar
Fra : Lars Dam


Dato : 30-05-04 13:37

On 30 May 2004 13:47:18 +0200
Thorbjoern Ravn Andersen <nospam0000@c.dk> wrote:

> "Flare" <nomail@sorry.dk> writes:
>
> > specs på CLR udvikles. Du har som udvikler blot brug for at vide at runtime
> > garantere at en static variabler altid er initialiseres nu du skal bruge den
>
> Jeg mener at have set noget med at man faktisk godt kan få udført kode
> under initialiseringsfasen af en klasse, men at det er temmeligt
> eksotisk.

Egentligt ikke, se her:

public class Z{
   static int y=0; // y sættes til 0 når klassen initialiseres

   // kodestump der afvikles under klasse initialisering
   static{
      System.out.println("class is loading");
   }
}

>
> Begynder man først at rode med statiske variable, og flertrådede
> programmer, bør man forstå hvordan synkroniseringsmekanismen
> fungerer. Man _kan_ komme galt afsted.
> --
> Thorbjørn Ravn Andersen
> http://unixsnedkeren.dk/ravn

vh. ld

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408917
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste