|
| Underlig dynamisk binding... Fra : Jesper Lillesø |
Dato : 10-07-01 15:07 |
|
Hej
Jeg har oplevet en lidt underlig ting ved Java (på linux). Se mit eksempel i
bunden.
Hvorfor er det lige at mit member "t" forbliver null i m2?
--------------
bash$ java -version
java version "1.3.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0)
Java HotSpot(TM) Client VM (build 1.3.0, mixed mode)
bash$ javac dk/logiva/test/Strange.java
bash$ java -cp . dk.logiva.test.Strange
m1: t is not null
m2: t is null
Hmmm
bash$
--------------------
bash$ java -classic -version
java version "1.3.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0)
Classic VM (build 1.3.0, green threads, nojit)
bash$ javac -classic dk/logiva/test/Strange.java
bash$ java -classic -cp . dk.logiva.test.Strange
m1: t is not null
m2: t is null
Hmmm
bash$
------ source ------
package dk.logiva.test;
import java.lang.String;
import java.util.Hashtable;
public class Strange {
public static void main(String[] args) throws Exception {
B o = new B();
System.out.println(o.m2());
}
}
class B extends A {
Hashtable t = null;
B() {
super();
}
void m1() {
t = new Hashtable();
t.put("Hello", "World");
if(t == null) {
System.out.println("m1: t is null");
} else {
System.out.println("m1: t is not null");
}
}
String m2() {
if(t == null) {
System.out.println("m2: t is null");
} else {
System.out.println("m2: t is not null");
}
return "Hmmm";
}
}
| |
Morten Primdahl (10-07-2001)
| Kommentar Fra : Morten Primdahl |
Dato : 10-07-01 15:58 |
|
"Jesper Lillesø" wrote:
>
> Hej
>
> Jeg har oplevet en lidt underlig ting ved Java (på linux). Se mit eksempel i
> bunden.
Dit eksempel er vist ikke kommet helt med. Hvad er A?
I dit eksempel bliver B.m1 aldrig kaldt, men du får output
m1: t is not null
Morten
--
Morten Primdahl Caput A/S Tel +45 70 12 24 42
morten@caput.com Nygade 6 Fax +45 70 11 24 42
http://www.caput.com/ DK-1164 Kbh K
| |
Jesper Lillesø (10-07-2001)
| Kommentar Fra : Jesper Lillesø |
Dato : 10-07-01 16:09 |
|
Morten Primdahl <morten@caput.com> wrote in
<3B4B17FE.B2732CD5@caput.com>:
>"Jesper Lillesø" wrote:
>>
>> Hej
>>
>> Jeg har oplevet en lidt underlig ting ved Java (på linux). Se mit
>> eksempel i bunden.
>
>Dit eksempel er vist ikke kommet helt med. Hvad er A?
>I dit eksempel bliver B.m1 aldrig kaldt, men du får output
>m1: t is not null
Ups...
Her er det:
bash$ java -version
java version "1.3.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0)
Java HotSpot(TM) Client VM (build 1.3.0, mixed mode)
bash$ javac dk/logiva/test/Strange.java
bash$ java -cp . dk.logiva.test.Strange
m1: t is not null
m2: t is null
Hmmm
bash$
--------------------
bash$ java -classic -version
java version "1.3.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0)
Classic VM (build 1.3.0, green threads, nojit)
bash$ javac -classic dk/logiva/test/Strange.java
bash$ java -classic -cp . dk.logiva.test.Strange
m1: t is not null
m2: t is null
Hmmm
bash$
------ source ------
package dk.logiva.test;
import java.lang.String;
import java.util.Hashtable;
public class Strange {
public static void main(String[] args) throws Exception {
B o = new B();
System.out.println(o.m2());
}
}
abstract class A {
A() {
m1();
}
abstract void m1();
}
class B extends A {
Hashtable t = null;
B() {
super();
}
void m1() {
t = new Hashtable();
t.put("Hello", "World");
if(t == null) {
System.out.println("m1: t is null");
} else {
System.out.println("m1: t is not null");
}
}
String m2() {
if(t == null) {
System.out.println("m2: t is null");
} else {
System.out.println("m2: t is not null");
}
return "Hmmm";
}
}
| |
Ole Nielsby (10-07-2001)
| Kommentar Fra : Ole Nielsby |
Dato : 10-07-01 17:29 |
|
Jesper Lillesø <frogskins@lycosmail.com> skrev:
> Hej
>
> Jeg har oplevet en lidt underlig ting ved Java (på linux). Se mit eksempel
i
> bunden.
>
> Hvorfor er det lige at mit member "t" forbliver null i m2?
>
> ------ output --------
> m1: t is not null
> m2: t is null
> Hmmm
> ------ source ------
> package dk.logiva.test;
>
> import java.lang.String;
> import java.util.Hashtable;
>
> public class Strange {
> public static void main(String[] args) throws Exception {
> B o = new B();
> System.out.println(o.m2());
> }
> }
>
> class B extends A {
> Hashtable t = null;
Dette oversættes til en erklæring: Hashtable t;
-samt en assignment i constructoren: t = null;
> B() {
Denne assignment indsættes ikke her...
> super();
men her. Superklassen initialiseres altid først.
> }
Du tricker superklassen til at bruge subklassen inden
den er initialiseret.
ON/***fjern sneglen fra min svaradresse***
| |
|
|