Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
COMP 121 Week 3: Inheritance Objectives To learn about inheritance To understand how to inherit and override superclass methods To be able to invoke superclass constructors To understand the common superclass Object and to override its toString method Introduction to Inheritance Inheritance Used with object types that have a certain amount of commonality Mountain bikes, racing bikes, road bikes, and recumbent bikes all share characteristics common to bicycles Squares, triangles, rectangles, and octagons all share characteristics common to polygons Deans, professors, administrators, and technical support personnel all share characteristics common to university employees Surgeons, family doctors, pediatricians, heart specialists all share characteristics common to doctors Savings accounts, checking accounts, money market accounts all share characteristics common to bank accounts Introduction to Inheritance Inheritance relationship Mountain bike inherits from bicycle Triangle inherits from polygon Professor inherits from university employee Pediatrician inherits from doctor Savings account inherits from bank account Classes are extended by adding methods and fields Savings account is a bank account with interest Instance field would be added for the interest rate Method would be added to add interest to the account Inheritance vs. Implementing an Interface Inheriting from class is not the same as implementing an interface Subclass inherits behavior and state Like interfaces, one advantage of inheritance is code reuse Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Inheritance Diagram Every class extends the Object class either directly or indirectly Inheritance Inheritance Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Inheritance Diagram (BlueJ) Inheritance UML Diagram (BlueJ) Uses Is-A Inheritance Inheritance Syntax class SubclassName extends SuperclassName { methods instance fields } The extended class is called the superclass The extending class is called the subclass Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Question: If the class Car extends Vehicle, which is the subclass and which is the superclass? Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Subclass versus Superclass Superclass Subclass Inheritance Example public class SavingsAccount extends BankAccount { // Fields and methods unique to a SavingsAccount … } BankAccount is the superclass SavingsAccount is the subclass SavingsAccount automatically inherits all methods and instance fields of BankAccount Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Subclass Fields and Methods In subclass: Add new instance fields and methods Change or override methods public class SavingsAccount extends BankAccount { public SavingsAccount(double rate) { interestRate = rate; } public void addInterest() { double interest = getBalance() * interestRate / 100; deposit(interest); } private double interestRate; } Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Subclass Object SavingsAccount object inherits the balance instance field from BankAccount Additional instance field is interestRate Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Encapsulation and Inheritance public void addInterest() { double interest = getBalance() * interestRate / 100; deposit(interest); } Encapsulation addInterest calls getBalance rather than updating the balance field of the superclass (field is private) addInterest calls getBalance without specifying the implicit parameter Call applies to the same object (this) Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Inheritance Hierarchies Sets of classes can form complex inheritance hierarchies Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Inheritance Hierarchies: Swing Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Hierarchy of Bank Accounts Consider a bank that offers its customers the following account types: Checking account: no interest; small number of free transactions per month, additional transactions are charged a small fee 2. Savings account: earns interest that compounds monthly 1. Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Hierarchy of Bank Accounts Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Hierarchy of Bank Accounts Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Subclass vs. Superclass Methods All bank accounts support the getBalance method All bank accounts support the deposit and withdraw methods, but the implementations differ (checking account needs to count transactions) Checking account needs a method deductFees Savings account needs a method addInterest Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Overriding vs. Inheriting Methods Overriding a method Supply a different implementation of a method that exists in the superclass Must have same signature (same name and same parameter types) If method is called on an object of the subclass type, the overriding method is executed Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Overriding vs. Inheriting Methods Inheriting a method (behavior) Don't supply a new implementation of a method that exists in superclass Superclass method can be called on the subclass objects Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Defining New Methods Add a method Supply a new method that doesn't exist in the superclass New method can be called only on subclass objects Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Inheriting Instance Fields Can't override fields All fields from the superclass are automatically inherited New fields that don't exist in the superclass can be added to the subclass Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Inheriting Instance Fields What if you define a new field with the same name as a superclass field? Each object would have two instance fields of the same name Fields can hold different values Legal but extremely undesirable DON’T DO IT!!! Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. CheckingAccount Implementation Overrides deposit and withdraw to increment the transaction count public class CheckingAccount extends BankAccount { public void deposit(double amount) {. . .} public void withdraw(double amount) {. . .} public void deductFees() {. . .} // new method private int transactionCount; // new instance field } Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. CheckingAccount Implementation Each CheckingAccount object has two instance fields: balance (inherited from BankAccount) transactionCount (new to CheckingAccount) Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. CheckingAccount Implementation You can apply four methods to CheckingAccount objects: getBalance() (inherited from BankAccount) deposit(double amount) (overrides BankAccount method) withdraw(double amount) (overrides BankAccount method) deductFees() (new to CheckingAccount) Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Accessing Private Fields in Superclass Consider deposit method of CheckingAccount public void deposit(double amount) { transactionCount++; // now add amount to balance . . . } Can't just add amount to balance balance is a private field of the superclass Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Accessing Private Fields in Superclass A subclass has no access to private fields of its superclass Subclass must use public interface So how can we add the amount to the balance? Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Invoking a Super Class Method Can't just call deposit(amount)in deposit method of CheckingAccount That is the same as this.deposit(amount) Calls the same method (infinite loop) Instead, invoke superclass method super.deposit(amount) Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Invoking a Superclass Method public void deposit(double amount) { // Increment the transaction count transactionCount++; // Now add amount to balance super.deposit(amount); } Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Subclass Construction The super keyword is also used to call a constructor super followed by parameters in parentheses indicates a call to the superclass constructor Must be the first statement in subclass constructor If subclass constructor doesn't explicitly call superclass constructor, the default superclass constructor is used Default constructor -- constructor with no parameters If all superclass constructors require parameters, it’s a compile error error Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Subclass Construction public class CheckingAccount extends BankAccount { public CheckingAccount(double initialBalance) { // Construct superclass super(initialBalance); // Initialize transaction count transactionCount = 0; } . . . } Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Converting Between Subclass and Superclass Types Can convert a subclass reference to superclass reference SavingsAccount collegeFund = new SavingsAccount(10); BankAccount anAccount = collegeFund; Object anObject = collegeFund; The three object references stored in collegeFund, anAccount, and anObject all refer to the same object of type SavingsAccount Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Converting Between Subclass and Superclass Types Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Converting Between Subclass and Superclass Types Superclass references don't know about methods in the subclass anAccount.deposit(1000); // OK anAccount.addInterest(); // Not OK When you convert a subclass object to its superclass type The value of the reference stays the same (actual memory location of the object) Less information is known about the object Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Converting Between Subclass and Superclass Types Why would anyone want to know less about an object? Reuse code that knows about the superclass publicbut void nottransfer(double the subclass: amount, BankAccount other) { withdraw(amount); other.deposit(amount); } Can be used to transfer money from any type of BankAccount Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Converting Between Subclass and Superclass Types Occasionally you need to convert from a superclass reference to a subclass reference BankAccount anAccount = (BankAccount) anObject; If object types are unrelated (not a superclass/ subclass relationship), an exception is thrown at runtime Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. instanceof operator Tests whether an object belongs to a particular type Returns true if the object on the left hand side of the operator is an instance of the type on the right hand side of the operator Otherwise, returns false if (anObject instanceof BankAccount) { BankAccount anAccount = (BankAccount) anObject; . . . } Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Object: The Cosmic Superclass All classes defined without an explicit extends clause automatically extend Object Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Useful Methods in the Object Class String toString() boolean equals(Object otherObject) Object clone() Good idea to override these methods in your classes Will not be overriding clone() in this course Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Overriding the toString Method Returns a string representation of the object Useful for debugging Rectangle box = new Rectangle(5, 10, 20, 30); String s = box.toString(); // Sets s to "java.awt.Rectangle[x=5,y=10,width=20,height=30]" Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Overriding the toString Method toString is called whenever you concatenate a string with an object: "box=" + box; // Result: "box=java.awt.Rectangle[x=5,y=10,width=20,height=30]" Object.toString default behavior is to print the class name and the hash code of the object BankAccount momsSavings = new BankAccount(5000); String s = momsSavings.toString(); // Sets s to something like "BankAccount@d24606bf" Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Overriding the toString Method In BankAccount: public String toString() { return "BankAccount[balance=" + balance + "]"; } Converts BankAccount object to a String BankAccount momsSavings = new BankAccount(5000); String s = momsSavings.toString(); // Sets s to "BankAccount[balance=5000]" Used by System.out.println Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Inheritance and toString Method toString method often returns the class name and the names and values of the instance fields in a class In a superclass, to be usable by subclasses, get the class name instead of hard-coding it For example, in BankAccount: public String toString() { return getClass().getName()+" [balance =" + balance + "]"; } Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Inheritance and toString Method In a subclass, first get the string that represents the superclass, then add the subclass information For example, in SavingsAccount: public String toString() { return super.toString() + " [interestRate = " + interestRate + "]"; } Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Summary Inheritance is used to extend existing classes by adding methods and fields The more general class is called the superclass The more specialized class that inherits from the superclass is called the subclass The subclass inherits both state and behavior from the superclass Code reuse is one advantage of inheritance Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Summary (continued) Methods in the superclass can be changed or overridden in the subclass A subclass cannot access the private fields of the superclass The super keyword is used to call a method of the superclass The super keyword may also be used as the first statement of the subclass constructor to call the superclass constructor Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Summary (continued) The instanceof operator tests whether an object belongs to a particular type The toString method should be overridden to return a String that represents the object’s state Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons. Any Questions?