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!
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!
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()");}
}
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?
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?