|
| 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 |
| | |
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
| |
|
|