diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/ColorPoint.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/ColorPoint.java
new file mode 100644
index 0000000000000000000000000000000000000000..c36ccb92fb1242908235f76d02150bac51e194d1
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/ColorPoint.java
@@ -0,0 +1,37 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture7;
+
+class Point {
+  private final int x, y;
+  private final String name;
+
+  Point(int x, int y) {
+    this.x = x;
+    this.y = y;
+    name = makeName();
+  }
+
+  protected String makeName() {
+    return "[" + x + "," + y + "]";
+  }
+
+  public final String toString() {
+    return name;
+  }
+}
+
+public class ColorPoint extends Point {
+  private final String color;
+
+  ColorPoint(int x, int y, String color) {
+    super(x, y);
+    this.color = color;
+  }
+
+  protected String makeName() {
+    return super.makeName() + ":" + color;
+  }
+
+  public static void main(String[] args) {
+    System.out.println(new ColorPoint(4, 2, "purple"));
+  }
+}
diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/ConstructedObject.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/ConstructedObject.java
new file mode 100644
index 0000000000000000000000000000000000000000..6e050dfc1990fab4dffafa535f20cbb200beedce
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/ConstructedObject.java
@@ -0,0 +1,26 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture7;
+
+class ConstructedObject extends SuperObject {
+
+  private static final String CONSTANT = print("CONSTANT");
+
+  static {
+    print("STATIC INITIALIZER");
+  }
+
+  private final String instance = print("instance");
+
+  ConstructedObject() {
+    super(print("hello"));
+    print("CONSTRUCTOR");
+  }
+
+  private static final String CONSTANT2 = print("CONSTANT2");
+
+  private final String instance2 = print("instance2");
+
+  static String print(String message) {
+    System.out.println("ConstructedObject." + message);
+    return null;
+  }
+}
diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/DynamicPolymorphism.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/DynamicPolymorphism.java
new file mode 100644
index 0000000000000000000000000000000000000000..889f9cc59b0785db76311b39434886b51686e2f3
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/DynamicPolymorphism.java
@@ -0,0 +1,29 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture7;
+
+public class DynamicPolymorphism {
+
+  static class A {
+    String get = "A";
+
+    String get() {
+      return "A";
+    }
+  }
+
+  static class B extends A {
+    String get = "B";
+
+    String get() {
+      return "B";
+    }
+  }
+
+  static void print(A value) {
+    System.out.println(value.get);
+    System.out.println(value.get());
+  }
+
+  public static void main(String[] args) {
+    print(new B());
+  }
+}
diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/Finalizer.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/Finalizer.java
new file mode 100644
index 0000000000000000000000000000000000000000..9350e48dccad477f8f718ec7133ff9918cd9b37b
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/Finalizer.java
@@ -0,0 +1,16 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture7;
+
+public class Finalizer {
+
+  @Override
+  protected void finalize() throws Throwable {
+    super.finalize();
+    System.out.println("I'm free!");
+  }
+
+  public static void main(String[] args) {
+    for (int i = 0; i < 1000000; i++) {
+      Finalizer f = new Finalizer();
+    }
+  }
+}
diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/InitializationOrder.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/InitializationOrder.java
new file mode 100644
index 0000000000000000000000000000000000000000..2b942fa9176dd4d5636128268ce4a51d9542b794
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/InitializationOrder.java
@@ -0,0 +1,8 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture7;
+
+public class InitializationOrder {
+
+  public static void main(String[] args) {
+    ConstructedObject constructedObject = new ConstructedObject();
+  }
+}
diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/Leak.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/Leak.java
new file mode 100644
index 0000000000000000000000000000000000000000..285b3ec7f5e391be2ac6111c2500aa45d46576f3
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/Leak.java
@@ -0,0 +1,15 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture7;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Leak {
+  private static List<Leak> l;
+
+  public static void main(String[] args) {
+    l = new ArrayList<>();
+    for (int i = 0; i < 1000000000; i++) {
+      l.add(new Leak());
+    }
+  }
+}
diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/SuperObject.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/SuperObject.java
new file mode 100644
index 0000000000000000000000000000000000000000..2f01f65122e8969e0f92aeed51b2966a8383f686
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/SuperObject.java
@@ -0,0 +1,25 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture7;
+
+class SuperObject {
+
+  private static final String CONSTANT = print("CONSTANT");
+
+  static {
+    print("STATIC INITIALIZER");
+  }
+
+  private final String instance = print("instance");
+
+  SuperObject(String arg) {
+    print("CONSTRUCTOR");
+  }
+
+  private static final String CONSTANT2 = print("CONSTANT2");
+
+  private final String instance2 = print("instance2");
+
+  static String print(String message) {
+    System.out.println("SuperObject." + message);
+    return null;
+  }
+}
diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/This.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/This.java
new file mode 100644
index 0000000000000000000000000000000000000000..b4ff31a9abe41fe05de65ecc5ea2afd3c017808f
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/This.java
@@ -0,0 +1,14 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture7;
+
+class This {
+
+  private final int i;
+
+  This() {
+    this(4);
+  }
+
+  This(int i) {
+    this.i = i;
+  }
+}
diff --git a/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/TryWithResources.java b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/TryWithResources.java
new file mode 100644
index 0000000000000000000000000000000000000000..6faa332bf7257bd0d9e8219c737e159119536769
--- /dev/null
+++ b/src/main/java/uk/ac/cam/acr31/oop/democode1920/lecture7/TryWithResources.java
@@ -0,0 +1,27 @@
+package uk.ac.cam.acr31.oop.democode1920.lecture7;
+
+import java.io.Closeable;
+
+public class TryWithResources implements Closeable {
+
+  TryWithResources() {
+    System.out.println("Acquire");
+  }
+
+  public static void main(String[] args) {
+    System.out.println("start");
+    try (TryWithResources t = new TryWithResources()) {
+      System.out.println("execute");
+      // object exists
+
+    }
+    System.out.println("done");
+    // object still exists - but close will have been called
+
+  }
+
+  @Override
+  public void close() {
+    System.out.println("release");
+  }
+}