Java for OOP
Objects de-mystified Christoph Angerer
Java for OOP Objects de-mystified Christoph Angerer Java Virtual - - PowerPoint PPT Presentation
Java for OOP Objects de-mystified Christoph Angerer Java Virtual Machine VM Heap Program Memory (Program Code (Classes, JIT Memory) etc.) Reads Internal use Virtual Machine Slide 2 Runtime Model public class BankAccount {
Objects de-mystified Christoph Angerer
Slide
2
Program Code Heap
(Program Memory)
VM Memory
(Classes, JIT etc.)
Virtual Machine
Slide
3
public class BankAccount { private int balance; public int getBalance() { return balance; } public void setBalance(int balance) { this.balance = balance; } public void deposit(int amount) { /* some code */ } public int withdraw(int amount) { /* some code */ } }
class balance 42 Object a3249 3249 getBalance {code} setBalance {code} deposit {code} withdraw {code} super name methodTable Class BankAccount nkAccount “BankAccount” super null name methodTable Class Object bject hashCode {code} toString {code} ... ... “Object”
(*) the bank account example is taken from the Java in Depth class from Carlo A. Furia
Slide
getBalance {code} setBalance {code} deposit {code} withdraw {code} super name methodTable Class BankAccount nkAccount “BankAccount” class balance 42 Object a3249 3249 super null name methodTable Class Object bject hashCode {code} toString {code} ... ... “Object”
4
BankAccount myAccount = ...; int myBalance = myAccount.getBalance();
(1) (2) (3) (4) this-pointer
Slide
getBalance {code} setBalance {code} deposit {code} withdraw {code} super name methodTable Class BankAccount nkAccount “BankAccount” class balance 42 Object a3249 3249 super null name methodTable Class Object bject hashCode {code} toString {code} ... ... “Object”
5
BankAccount myAccount = ...; String myDescr = myAccount.toString();
(1) (2) (3) (6) this-pointer (4) (5)
Slide
6
Slide
getBalance {code} setBalance {code} toString {code} deposit {code} super name methodTable Class BankAccount nkAccount “BankAccount” class balance 42 Object a3249 3249 super null name methodTable Class Object bject hashCode {code} toString {code} ... ... “Object”
7
(1) (2) (3)
public class BankAccount { /*...*/ public String toString() { return “I am a bank account”; } } String myDescr = myAccount.toString();
Slide
8
Slide
9
deposit {code} deposit {code} ... ... super name methodTable Class BankAccount nkAccount “BankAccount” class balance 42 Object a3249 3249 super null name methodTable Class Object bject hashCode {code} toString {code} ... ... “Object”
(1) (2) (3) ?
We need more information to resolve this
public class BankAccount { /*...*/ public void deposit(int amount) { /* some code */ } public void deposit(float amount) { /* some code */ } } myAccount.deposit(42.56);
Slide
10
deposit(int) {code} deposit(float) {code} ... ... super name methodTable Class BankAccount nkAccount “BankAccount” class balance 42 Object a3249 3249 super null name methodTable Class Object bject hashCode {code} toString {code} ... ... “Object”
(2) (3)
public class BankAccount { /*...*/ public void deposit(int amount) { /* some code */ } public void deposit(float amount) { /* some code */ } } myAccount.deposit(42.56);
(1)
Slide
11
Slide
getBalance {code} setBalance {code} toString {code} deposit {code} super name methodTable Class BankAccount nkAccount “BankAccount” class balance 42 Object a3249 3249 super null name methodTable Class Object bject hashCode {code} toString {code} ... ... “Object”
12
(1) (2) (3)
public class BankAccount { /*...*/ public String toString() { return “I am a bank account with ” + this.getBalance() + “ CHF”; } } String myDescr = myAccount.toString();
(4) this-pointer (6) (5)
Slide
getBalance {code} setBalance {code} toString {code} deposit {code} super name methodTable Class BankAccount nkAccount “BankAccount” class balance 42 Object a3249 3249 super null name methodTable Class Object bject hashCode {code} toString {code} ... ... “Object”
13
(1) (2) (3)
public class BankAccount { /*...*/ public String toString() { return super.toString() + “ (I am a bank account)”; } } String myDescr = myAccount.toString();
(4) this-pointer (5)
Slide
14
Slide
15
Slide
16
super name ... methodTable ... Class A super name ... methodTable ... Class B super name ... methodTable ... Class C super name ... methodTable ... Class D
Slide
17
Slide
the signature if it is declared to be abstract
methods or be declared abstract itself
class or abstract class
18
Slide 19
public abstract class BankAccount { /*code as before, plus:*/ public abstract float getInterestRate(); } interface Freezable { void freeze(); void unfreeze(); } interface Updatable { void dailyUpdate(Date d); } public class PrivatePersonAccount
implements Freezable, Updatable { boolean isFrozen = false; void freeze() { this.isFrozen = true; } void unfreeze() { this.isFrozen = false; } void dailyUpdate(Date d) { if(! this.isFrozen) { /* compute interest */ } } void getInterestRate() { return DB.getPrivatePersonInterestRate(); } }
Slide
20
Slide
“Person” do you mean?)
com.mydomain.myproject.some.package
URLs
some fully qualified names again
21
Slide 22
//put MyClass into this package //(make sure to also use the right folder com/mydomain/projectA) package com.mydomain.projectA; import java.util.List; //import the single class List import java.util.concurrent.*; //import the whole package public class MyClass { void doStuff() { //List is the java.util.List; other lists must be fully named com.mydomain.utils.List myList = new com.mydomain.utils.List(10);
Semaphore p = ...; //Megaphore is not defined in java.util.concurrent //so it must be in the same package as MyClass Megaphore m = ...; } }
Slide
23
Slide
24
Slide
25
public int sumBalance(BankAccount one, BankAccount other) { int balanceOne = one.getBalance(); int balanceOther = other.getBalance(); return balanceOne + balanceOther; }
Slide
26
public int sumBalance(BankAccount one, BankAccount other) { /*...*/ }
public void main(String [] args) { PrivatePersonAccount ppa = new PrivatePersonAccount(); BankAccount bca = new BusinessCustomerAccount(); system.out.println(sumBalance(ppa, bca)); }
Slide
27
Slide
if (other instanceof BankAccount) { } else { return false; //or super.equals(other); } }
28
public class BankAccount { /* ... */ public boolean equals(Object other) { } } public class SomeClass { public void compareAccounts(BankAccount otherAccount) { BankAccount myAccount = ...; if (myAccount.equals(otherAccount)) { /*...*/ } } }
BankAccount otherAccount = (BankAccount)other; return this.balance == otherAccount.balance;
Slide
29