06 abstract
TRANSCRIPT
![Page 1: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/1.jpg)
Abstract classes
Object-Oriented Programming
![Page 2: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/2.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 2
Outline
� Abstract classes
� Abstract methods
� Design pattern: Template method
� Dynamic & static binding
� Upcasting & Downcasting
� Readings:
� HFJ: Ch. 8.
� GT: Ch. 8.
![Page 3: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/3.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 3
Our previous design
Dog d = new Dog();
Cat c = new Cat();
Animal anim = new Animal();
What does an Animal look like?
Fine. But…
![Page 4: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/4.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 4
What does an Animal look like?
� What does a new Animal() object look like?
� What are the instance variable values?
� What should makeNoise(), eat(), and roam() do?
� Do we ever need an Animal object?
![Page 5: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/5.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 5
What does a Shape look like?
� What does a generic Shape object look like?
� How to draw() it?
� Do we ever need a Shape object? + draw()+ erase()
- x, y
Shape
+ draw()+ erase()
Point
+ draw()+ erase()
- radius
Circle
+ draw()+ erase()
- width- height
Rectangle
![Page 6: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/6.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 6
Abstract classes
� Some classes just should not be instantiated!
� We want Circle and Triangle objects, but no Shape objects. We want Dogs and Cats, but no Animal objects…
� Make those generic classes abstract classes
� The compiler will guarantee that no instances of abstract classes are created.
� But object references of abstract class types are allowed.
abstract class Animal { ... }
Animal a = new Animal(); // Error!!!
Animal anim = new Dog(); // no error.
![Page 7: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/7.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 7
abstract public class Animal {
public void eat() {}
...
}
-----------------------------------------------
public class MakeAnimal {
public void go() {
Animal a;
a = new Hippo();
a = new Animal();
a.eat();
}
}
This is OK. You can always assign a subclass object to a super class reference, even if the superclass is abstract.
class Animal is marked abstract, so the compiler will NOT let you do create an instance of Animal.
% javac MakeAnimal.java
MakeAnimal.java:5: Animal is abstract;
cannot be instantiated
a = new Animal();
^
1 error
![Page 8: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/8.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 8
Abstract vs. Concrete
� A class that is not abstract is called a concrete class
How do we know
when a class
should be abstract?
![Page 9: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/9.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 9
Abstract methods
� How do we implement?
� Animal.makeNoise(), eat()…
� We can't think of a generic implementation that is useful
� So, we mark those methods abstract.
� Abstract methods has no body.
abstract public class Animal {
public abstract void makeNoise();
...
No method body!End it with a semicolon.
public void makeNoise() {
System.out.print("Hmm");
}
![Page 10: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/10.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 10
Abstract methods
� If you declared a method abstract,you must mark the class abstract, as well. You can't have a concrete class with an abstract method.
� An abstract class means that it must be extended.
� An abstract method means that it must be overriden.
� A concrete subclass must have all the inherited abstract methods implemented.
![Page 11: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/11.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 11
abstract public class Shape {
protected int x, y;
Shape(int _x, int _y) {
x = _x;
y = _y;
}
abstract public void draw();
abstract public void erase();
public void moveTo(int _x, int _y) {
erase();
x = _x;
y = _y;
draw();
}
}
public class Circle extends Shape {
private int radius;
public Circle(int _x, int _y, int _r) {
super(_x, _y);
radius = _r;
}
public void draw() {
System.out.println("Draw circle at "+x+","+y);
}
public void erase() {
System.out.println("Erase circle at "+x+","+y);
}
}
![Page 12: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/12.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 12
Design pattern: Template method
abstract class Shape {
protected int x, y;
public void moveTo(int x1, int y1) {
erase();
x = x1;
y = y1;
draw();
}
abstract public void erase();
abstract public void draw();
}
![Page 13: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/13.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 13
Account example
� Problem details:
� You need to store information for bank accounts
� Assume that you only need to store the current balance, and the total number of transactions for each account.
� The goal for the problem is to avoid duplicating code between the three types of account.
� An account needs to respond to the following messages:
� constructor(initialBalance)
� deposit(amount)
� withdraw(amount)
� endMonth()
� Apply the end-of-month charge, print out a summary, zero the transaction count.
![Page 14: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/14.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 14
Account example
� Types of Accounts
� Normal
� Fixed $5.0 fee at the end of the month
� Nickle ‘n Dime
� $0.50 fee for each withdrawal charged at the end of the month
� Gambler
� With probability 0.49 there is no fee and no deduction to the balance
� With probability 0.51 the fee is twice the amount withdrawn
![Page 15: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/15.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 15
Class design diagram
Account*balance*transactions-deposit-withdraw-endMonth-endMonthCharge (abstract)
Fee-endMonthCharge
NickleNDime*withdrawCount-withdraw-endMonthCharge
Gambler-withdraw-endMonthCharge
![Page 16: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/16.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 16
public class AnimalList {
private Animal[] animals = new Animal[5];
private int nextIndex = 0;
public void add(Animal a) {
if (nextIndex < animals.length) {
animals[nextIndex] = a;
System.out.print("Animal added at " + nextIndex);
nextIndex++;
}
}
}
public class AnimalTestDrive {
public static void main(String [] args) {
AnimalList list = new AnimalList();
d = new Dog();
c = new Cat();
list.add(d);
list.add(c);
}
}
![Page 17: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/17.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 17
public class AnimalList {
private Animal[] animals = new Animal[5];
private int nextIndex = 0;
public Animal get(int index) {
return animals[index];
}
public void add(Animal a) {
if (nextIndex < animals.length) {
animals[nextIndex] = a;
System.out.print("Animal added at " + nextIndex);
nextIndex++;
}
}
}
public class DogTestDrive {
public static void main(String [] args) {
AnimalList list = new AnimalList();
Dog d = new Dog();
list.add(d);
d = list.get(0); // Error!
d.chaseCats();
}
}
AnimalList
Animal[] animals
int nextIndex
add(Animal a)
get(int index)
% javac DogTestDrive.java
DogTestDrive.java:6: incompatible types
found : Animal
required: Dog
d = list.get(0);
^
The compiler doesn't know that list.get() refers to a Dog object!
![Page 18: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/18.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 18
public class AnimalList {
private Animal[] animals = new Animal[5];
private int nextIndex = 0;
public Animal get(int index) {
return animals[index];
}
public void add(Animal a) {
if (nextIndex < animals.length) {
animals[nextIndex] = a;
System.out.print("Animal added at " + nextIndex);
nextIndex++;
}
}
}
public class DogTestDrive {
public static void main(String [] args) {
AnimalList list = new AnimalList();
Dog d = new Dog();
list.add(d);
Animal a = list.get(0); // We know the object is a Dog!
a.chaseCats(); // Error! Animal doesn't have chaseCats()!
}
}The compiler doesn't know that a refers to a Dog object!
![Page 19: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/19.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 19
Subclass object & the inherited part
Object
equals()
getClass()
hashCode()
toString()
Cow
equals()
getClass()
hashCode()
toString()
moo()
a single object on the heap:
The Cow object.
It contains both the Cow part
and the Object part
equals()
getClass()
hashCode()
toString()
Cow
Object
moo()
Cow's specific feature
inherited features
Cow c = new Cow();
Object o = s;
Cow
c
Object
o
The Object remote control
has fewer buttons!
![Page 20: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/20.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 20
The rules
� Which method version get invoked depends on the object type.
� Whether a method call is allowed depends on the reference type – what buttons the remote control has.
� Cow's toString() is invoked because o is now refering to an Cow object.
� o.toString() is allowed because Object has toString(). But o.moo() is not allowed because Object does not has moo()
Object o = new Cow();
o.toString();
o.moo();
![Page 21: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/21.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 21
Dynamic & static binding
� Method binding: connect a method call to a method body
� Static/early binding: performed by compiler/linker before the program is run.
� The only option of procedural languages.
� Dynamic/late binding: performed during run-time
� Java uses late binding, except for static, final, and private methods.
� private methods are implicitly final.
![Page 22: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/22.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 22
Object o = new Cow();
o.toString();
Cow c = (Cow) o;
c.moo(); // no error
Casting
� How to make the Cow act like a Cow, again?
� Use an explicit cast:
� Explicit cast is not always possible:
( ): cast operator, casting to the type Cow
Object o = new Cat();
Cow c = (Cow) o; // no compile-time error
c.moo(); // run-time error
Object o = new Cow();
o.toString();
o.moo(); // Error!
![Page 23: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/23.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 23
Object o;
...
Cow c = (Cow) o;
Object o = new Cow();
Upcasting & down casting
� Upcasting:casting up the diagram.
� Downcasting: casting down the diagram.
Object
+ moo()
Cow
implicit casting
from Cow to Objectexplicit casting
from Object to Cow
![Page 24: 06 Abstract](https://reader033.vdocuments.us/reader033/viewer/2022051214/55cf973d550346d033907638/html5/thumbnails/24.jpg)
Đại học Công nghệ - ĐHQG HN Abstract classes 24
Abstract super class
� As a super class
� A common superclass for several subclasses
� Factor up common behavior
� Define the methods all the subclasses respond to
� As an abstract class
� Force concrete subclasses to override methods that are declared as abstract in the super class
� Circle, Triangle must implement their own draw() and erase()
� Forbid creation of instants of the abstract superclass
� Shape objects are not allowed