• No results found

Värde och typ? Problem. Vad skrivs ut? Referenssematik (1) Joachim von Hacht. Förklara (i detalj)! int x; int y; x = y = 1; out.println(x + ":" + y);

N/A
N/A
Protected

Academic year: 2022

Share "Värde och typ? Problem. Vad skrivs ut? Referenssematik (1) Joachim von Hacht. Förklara (i detalj)! int x; int y; x = y = 1; out.println(x + ":" + y);"

Copied!
5
0
0

Loading.... (view fulltext now)

Full text

(1)

Problem

Joachim von Hacht

1

Värde och typ?

out.println( 5 / 2 ); // 1 out.println( 5.0 / 2 ); // 2 out.println( 5 / 2 == 5.0 / 2 ); // 3 out.println('5' / '2' == 5 / 2); // 4 out.println( "5 / 2" + 5.0 / 2 ); // 5

Vilket värde och vilken typ har uttrycken vi skriver ut?

Vad skrivs ut?

int x;

int y;

x = y = 1;

out.println(x + ":" + y);

Förklara (i detalj)!

Referenssematik (1)

int[] a1 = {1, 2, 3};

int[] a2 = {4, 5, 6}; // Before int[] a3 = doIt(a1, a2); // Call // After

int[] doIt(int[] x, int[] y) { x[0] = y[1];

return x;

}

Visualisera semantiken genom

att rita bild med variabler, referenser och objekt. Före och

efter anrop!

(2)

Referenssemantik (2)

void program() { H h1 = new H(1);

H h2 = new H(2); // Before

doIt(h1, h2); // Call

out.println(h1.i); // After }

void doIt(H h1, H h2) { h1.i = 4;

H tmp = h1;

h1 = h2;

h2 = tmp;

}

class H { int i;

H(int i) { this.i = i; } }

Visualisera semantiken genom

att rita bild med variabler, referenser och objekt. Före och

efter anrop!

Referenssemantik (3)

A[] as = new A[3];

A a1 = new A();

a1.i = 1;

a1.s = "aaa";

A a2 = new A();

a2.i = 2;

a2.s = "bbb";

as[0] = a1;

as[1] = a2; // Before as[2] = doIt(as); // Call // After

class A { int i;

String s;

}

A doIt( A[] as ){

as[0].s = as[1].s;

return as[0];

}

Visualisera semantiken genom

att rita bild med variabler, referenser och objekt. Före och

efter anrop!

Referenssemantik (4)

A a = new A();

a.arr = new int[]{1, 2, 3};

a.d = 1.5;

A b = new A();

b.arr = new int[]{4,5,6};

b.d = 2.5; // Before

a = doIt( b); // Call // After

class A { int[] arr;

double d;

}

A doIt( A a ){

A tmp = new A();

tmp.arr = a.arr;

tmp.d = a.d;

return tmp;

}

Visualisera semantiken genom

att rita bild med variabler, referenser och objekt. Före och

efter anrop!

Referenssemantik (5)

B b1 = new B("b");

A a1 = new A( b1 ); // Before B b2 = doIt( a1 ); // Call // After

class A { int i;

B b;

A( B b ){

this.b = b;

} }

B doIt( A a ){

a.b.s = "c";

return a.b;

}

class B { int i;

String s;

B ( String s ){

this.s = s;

} }

Visualisera semantiken genom

att rita bild med variabler, referenser och objekt. Före och

efter anrop!

(3)

Typer (1)

Integer[] is = {1, 2, 3};

Double[] ds = {1.0, 2.0, 3.0};

Object o = is; // 1 o[0]++; // 2

Object[] os1 = is; // 3 Object[] os2 = (Object[]) is; // 4 Double[] ds1 = (Double[]) os1; // 5

os2 = ds; // 6 Double[] ds2 = (Double[]) os2; // 7

Integer i1 = os1[0]; // 8 Integer i2 = (Integer) os1[0]; // 9 Vilka rader ger kompileringsfel? Vilka ger körningsfel?

( Integer <: Object och Double <: Object)

Typer (2)

A a = new A(); // 1 B b = new B(); // 2 IX ix = new IX(); // 3 IY iy = null; // 4 a = b; // 5 b = (A) a; // 6 ix = iy; // 7 iy = ix; // 8 ix = a; // 9 a = (A) ix; // 10 ix = b; // 11 iy = b; // 12

ix = (IX) iy; // 13

Vilka rader ger kompileringsfel? Vilka ger körningsfel?

interface IX { ...

}

interface IY { ...

}

class A implements IX { ...

}

class B implements IY { ...

}

Typer (3)

A a = new A();

B b = new B();

IX ix = a; // 1 IY iy = a; // 2 a.doIt(); // 3 ix.doIt(); // 4 iy.doIt(); // 5 iy.doOther(); // 6

iy = b; // 7 iy = (IY) b; // 8 iy.doOther(); // 9 iy = new C(); // 10 iy.doOther(); // 11

Vilka rader ger kompilerings resp. körningsfel. Varför? Om fel åtgärdas vad skrivs ut?

interface IX { void doIt();}

interface IY { void doOther();}

class A implements IX, IY { public void doIt() { out.println("A doIt()");

}

public void doOther() { out.println("A doOther()");

} } class B {

public void doOther() { out.println("B doOther()");

} }

class C implements IY { public void doOther() { out.println("C doOther()"); } }

Typer (4)

//a A a = new B();

a.doA();

//b IA a = new X();

a.doA();

//c C c = new B();

c.doC();

//d B b1 = new C();

b1.doX();

//e IX x = new C();

X x1 = (X) x;

x1.doA();

//f

IX x2 = new C();

B b2 = (B) x2;

b2.doC();

Vilka exempel ger kompilerings resp. körningsfel. Varför? Om fel åtgärdas vad skrivs ut?

public interface IA {void doA();}

public interface IX {void doX();}

public abstract class A implements IA { public void doA() {out.println("A.doA()");}

public abstract void doC();

}

public class B extends A {

public void doC() {out.println("B.doC()");}

}

public class C extends B implements IX { public void doA() {out.println("C.doA()");}

public void doX() {out.println("C.doX()");}

public void doC() {out.println("C.doC()");}

}

public class X implements IX {

public void doX() {out.println("X.doX()");}

public void doA() {out.println("X.doA()");}

}

(4)

Vad skrivs ut?

Object[] o = { 0, "abc", 1.23 };

for (int i = 0; i < o.length; i++) { classify(o[i]);

}

void classify(Integer i) { out.println("It's an integer");

}

void classify(String s) { out.println("It's a String");

}

void classify(Object o) {

out.println("Don't know, it's anything...");

}

Kompilerar detta? Fungerar det att köra?

Alla typer <: Object

Vad händer?

void program() {

Integer[] arr = {1, 2, 3};

upDate(arr);

}

void upDate(Object[] arr) { a[0] = null;

a[1] = 1;

a[2] = 1.0;

}

Kompilerar detta? Får vi något körningsfel?

Skissa en OO model (1)?

1.) Minsta möjliga modell för “kärnan” i programmet nedan (klasser).

2.) En metod för att “skjuta in” en ny kolumn (insert column)? Hur?

Programmet

Hur många Objekt (1)?

void program() {

String[] s = { "aaa", "bbb", null};

s[2] = s[0] + s[1];

A a = new A(s[2]);

A[] as = new A[]{a};

}

class A { String s;

A( String s ){

this.s = s;

} }

Hur många objekt finns i koden? Hur kommer vi åt dessa?

(5)

Hur många Objekt (2)?

void program() {

new Random().nextInt(10);

int s = sum(new int[]{1,2,3});

for( char ch : "abc".toCharArray()){

// ...

}

out.println("123" + "abc");

}

int sum( int[] arr ){

int sum = 0;

for(int i = 0 ; i < arr.length; i++){

sum += i;

}

return sum;

}

Hur många objekt finns i koden? Hur kommer vi åt dessa ?

Klass kontra Instans

public class Mix { public static int i = 1;

public int j = 2;

public static void doIt() {

i = 5; // 1

i = j; // 2

j = i; // 3

doOther(); // 4

this.doOther(); // 5

new Mix().j = 5; // 6

new Mix().doOther(); // 7

} public void doOther() { i = 5; // 8

i = j; // 9

j = i; // 10

doIt(); // 11 }

}

Vilka rader kompilerar inte?

References

Related documents

När man räknar härleds detta samband relativt enkelt med implicit derivering och kedjeregeln som på följande

2845.. Ett av nedanstående alternativ är det rätta värdet. a) Ange en följd av 10 konsekutiva positiva heltal som inte inne- håller något primtal... b) Visa att för varje

Allt obehörigt begagnande av ritningen beivras enligt lag.. TRAFIKVERKET Denna ritning är

NY TRUMMA / DAGVATTENLEDNING, FLÖDESRITKNING VÄGANSLUTNING SOM STÄNGS GENOM SÄRSKILT

[r]

Lösningar kommer på kursens hemsida: http://www.math.chalmers.se/Math/Grundutb/CTH/mve035/1415 Skriv program och inskrivningsår på omslaget, skriv personliga koden på samtliga

Ange n˚ agon l¨ osning till

[r]