23T1 Week 3
WEDNESDAY 1PM - 4PM (W13B)
FRIDAY 11AM - 2PM (F11A)
Slides by Alvin Cherk (z5311001)
An object's ability to decide what method to apply to itself, depending on where it is in the inheritance hierarchy, is usually called polymorphism.
Code Review - 5 minutes
public class A {
public static void f() {
C c = new C();
c.speak();
B b = c;
b.speak();
b = new B();
b.speak();
c.speak();
}
}
public class B {
public void speak() {
System.out.println("moo");
}
}
public class C extends B {
public void speak() {
System.out.println("quack");
}
}
public class D {
public static void f() {
F f1 = new F();
F f2 = new F();
f1.incX();
f2.incY();
System.out.println(f1.getX() + " " + f1.getY());
System.out.println(f2.getX() + " " + f2.getY());
}
}
public class F {
private int x;
private static int y;
public int getX() {
return x;
}
public int getY() {
return y;
}
public void incX() {
x++;
}
public void incY() {
y++;
}
}
3. What is the output of D.f()
public class A {
public static void f() {
C c = new C();
c.speak();
B b = c;
b.speak();
b = new B();
b.speak();
c.speak();
}
}
public class B {
public void speak() {
System.out.println("moo");
}
}
public class C extends B {
public void speak() {
System.out.println("quack");
}
}
What is the output of D.f()
public class D {
public static void f() {
F f1 = new F();
F f2 = new F();
f1.incX();
f2.incY();
System.out.println(f1.getX() + " " + f1.getY());
System.out.println(f2.getX() + " " + f2.getY());
}
}
public class F {
private int x;
private static int y;
public int getX() {
return x;
}
public int getY() {
return y;
}
public void incX() {
x++;
}
public void incY() {
y++;
}
}
1 1 0 1
UML
Composition is a specialized form of aggregation. In composition, if the parent object is destroyed, then the child objects also cease to exist. Composition is actually a strong type of aggregation and is sometimes referred to as a "death" relationship.
Create an OO domain model for a system with the following requirements.
A Car has one or more engines and a producer. The producer is a manufacturing company who has a brand name. Engines are produced by a manufacturer and have a speed. There are only two types of engines within UNSW's cars:
Cars are able to drive to a particular location x, y.
Since UNSW is a world-leader in technology innovation, they want you to be able to model the behaviour of Time Travelling for any vehicle, and to model a time travelling car. A vehicle that travels in time stays in the same location but travels to a LocalDateTime.
Create an OO domain model for a system with the following requirements.
A Car has one or more engines and a producer. The producer is a manufacturing company who has a brand name. Engines are produced by a manufacturer and have a speed. There are only two types of engines within UNSW's cars:
Cars are able to drive to a particular location x, y.
Since UNSW is a world-leader in technology innovation, they want you to be able to model the behaviour of Time Travelling for any vehicle, and to model a time travelling car. A vehicle that travels in time stays in the same location but travels to a LocalDateTime.
A generally good diagram maker software that is free*
*if you sign up with an .edu account
Wonderous.java
package wondrous;
import java.util.ArrayList;
import java.util.List;
public class Wondrous {
private final int MY_MAGIC_NUMBER = 42;
public List<Integer> wondrous(int start) {
int current = start;
List<Integer> sequence = new ArrayList<Integer>();
while (current != 1) {
sequence.add(current);
if (current % 2 == 0) {
current /= 2;
} else {
current = (current * 3) + 1;
}
}
return sequence;
}
}
The Wondrous Sequence is generated by the simple rule:
Make sure your VSCode is open in the correct folder, otherwise, these buttons wont appear
Make sure your VSCode is open in the correct folder, otherwise, these buttons won't appear
package wondrous;
import java.util.ArrayList;
import java.util.List;
// If the current term is even, the next term is half the current term.
// If the current term is odd, the next term is three times the current term, plus 1.
public class Wondrous {
public List<Integer> wondrous(int start) {
int current = start;
List<Integer> sequence = new ArrayList<Integer>();
while (true) {
sequence.add(current);
if (current == 1) {
break;
} else if (current % 2 == 0) {
// Even
current /= 2;
} else {
// odd
current = (current * 3) + 1;
}
}
return sequence;
}
}
What are they?
Checked vs Unchecked
How can we use it in Wonderous to make the code better?
Checked or Unchecked?
How can we use it in Wonderous to make the code better?
package wondrous;
import java.util.ArrayList;
import java.util.List;
// If the current term is even, the next term is half the current term.
// If the current term is odd, the next term is three times the current term, plus 1.
public class Wondrous {
public List<Integer> wondrous(int start) {
int current = start;
List<Integer> sequence = new ArrayList<Integer>();
if (start < 1) {
throw new IllegalArgumentException("wondrous start must be >= 1");
}
while (true) {
sequence.add(current);
if (current == 1) {
break;
} else if (current % 2 == 0) {
// Even
current /= 2;
} else {
// odd
current = (current * 3) + 1;
}
}
return sequence;
}
}
Lets write some more tests
package wondrous.test;
import static org.junit.Assert.assertThrows;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.jupiter.api.Test;
import wondrous.Wondrous;
public class WondrousTest {
@Test
public void testBasic() {
Wondrous w = new Wondrous();
List<Integer> expected = new ArrayList<Integer>(Arrays.asList(3, 10, 5, 16, 8, 4, 2, 1));
assertEquals(expected, w.wondrous(3));
}
@Test
public void testOne() {
Wondrous w = new Wondrous();
List<Integer> expected = new ArrayList<Integer>(Arrays.asList(1));
assertEquals(expected, w.wondrous(1));
}
@Test
public void testInvalid() {
Wondrous w = new Wondrous();
assertThrows(IllegalArgumentException.class, () -> {
w.wondrous(0);
});
}
}