StudentGraderExercise (No interface) ====================================== public class Main { public static void main(String[] args) { Exercise ex = new Exercise("What is 4!", 24); Student m = new Student("Mary"); Grader h = new Grader("Helena"); m.doExercise(ex,24); h.gradeExercise(ex); ex.displayResult(); } } class Exercise { private int studentAnswer; private char grade; private final String question; private final int modelAnswer; public Exercise(String q, int a) {question = q; modelAnswer=a;} public void writeAnswer(int anAnswer) {studentAnswer=anAnswer;} public void readAnswer() {System.out.println("Student's answer is "+studentAnswer);} public void grade() {if (studentAnswer==modelAnswer) grade='A';else grade='F';} public void displayResult() {System.out.println("Student's answer is "+studentAnswer+", grade is: "+grade);} } class Student { private String name; public Student(String n) { name = n; } public void doExercise(Exercise x, int answer) { x.writeAnswer(answer); } } class Grader { private String name; public Grader(String n) {name=n;} public void gradeExercise(Exercise x){x.grade();} } StudentGraderExercise (With interface (Topic05 Page 6)) ======================================================= public class Main { public static void main(String[] args) { Exercise ex = new Exercise("What is 4!", 24); Student m = new Student("Mary"); Grader h = new Grader("Helena"); m.doExercise(ex,24); h.gradeExercise(ex); ex.displayResult(); } } interface IGrade { void readAnswer(); void grade(); } interface IReadWrite{ void readAnswer(); void writeAnswer(int anAnswer); } class Exercise implements IGrade, IReadWrite{ private int studentAnswer; private char grade; private final String question; private final int modelAnswer; public Exercise(String q, int a) {question = q; modelAnswer=a;} public void writeAnswer(int anAnswer) {studentAnswer=anAnswer;} public void readAnswer() {System.out.println("Student's answer is "+studentAnswer);} public void grade() {if (studentAnswer==modelAnswer) grade='A';else grade='F';} public void displayResult() {System.out.println("Student's answer is "+studentAnswer+", grade is: "+grade);} } class Student { private String name; public Student(String n) { name = n; } public void doExercise(IReadWrite x, int answer) { x.writeAnswer(answer); } } class Grader { private String name; public Grader(String n) {name=n;} public void gradeExercise(IGrade x){x.grade();} } Another example (Multiple interfaces, Approximating Multiple Inheritance) ========================================================================== // Example: // An employee is both a boss and a subordinate // Approximating Multiple Inheritance in Java // Using interface and/or composition // (Ref https://ioflood.com/blog/java-multiple-inheritance/) // (Ref https://en.wikipedia.org/wiki/Composition_over_inheritance) //----------------------------- interface IBoss { public void award(); } interface ISubordinate { public void work(); } class Boss implements IBoss { public void award() {System.out.print("I give award. ");} } class Subordinate implements ISubordinate{ public void work() {System.out.print("I work. ");} } //----------------------------- class Employee implements IBoss, ISubordinate{ private Boss b = new Boss(); private Subordinate s = new Subordinate(); public void award() {b.award();} public void work() {s.work();} } //----------------------------- class Main { public static void main(String[] args) { Employee p = new Employee(); p.work(); p.award(); } } //----------------------------- Innerclass : BankAccount and Money ================================== class BankAccount { private class Money { private String currency; private double value; public Money(String c, double b) { currency = c; value = b; } public String getOwner() { return owner; } } private Money balance; private String owner; public BankAccount(String currency, String ow) { owner = ow; balance = new Money(currency, 0.00); } public void methodX() { BankAccount another = new BankAccount("RMB", "Tom"); Money m1 = new Money("HKD", 88); Money m2 = another.new Money("JPY", 123); System.out.printf("%.2f(%s) %.2f(%s) %.2f(%s) %.2f(%s)", this.balance.value, this.balance.getOwner(), another.balance.value, another.balance.getOwner(), m1.value, m1.getOwner(), m2.value, m2.getOwner()); } // public static void methodY() { // new Money("JPY", 0.00); // Compilation error // } } public class Main { public static void main(String[] args) { BankAccount account = new BankAccount("HKD", "Helena"); account.methodX(); } }