SlideShare a Scribd company logo
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Chapter Ten: Inheritance
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• To learn about inheritance
• To understand how to inherit and override superclass methods
• To be able to invoke superclass constructors
• To learn about protected and package access control
• To understand the common superclass Object and to override
its toString and equals methods
• To use inheritance for customizing user interfaces
Chapter Goals
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Inheritance: extend classes by adding methods and fields
• Example: Savings account = bank account with interest
class SavingsAccount extends BankAccount
{
new methods
new instance fields
}
• SavingsAccount automatically inherits all methods and instance
fields of BankAccount
SavingsAccount collegeFund = new SavingsAccount(10);
// Savings account with 10% interest
collegeFund.deposit(500);
// OK to use BankAccount method with SavingsAccount
object
An Introduction to Inheritance
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Extended class = superclass (BankAccount), extending class =
subclass (Savings)
• Inheriting from class ≠ implementing interface: subclass inherits
behavior and state
• One advantage of inheritance is code reuse
An Introduction to Inheritance (cont.)
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Every class extends the Object class either directly or indirectly
An Inheritance Diagram
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• In subclass, specify added instance fields, added methods, and
changed or overridden methods
public class SavingsAccount extends BankAccount
{
public SavingsAccount(double rate)
{
interestRate = rate;
}
public void addInterest()
{
double interest = getBalance() * interestRate /
100;
deposit(interest);
}
An Introduction to Inheritance
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
private double interestRate;
}
• Encapsulation: addInterest calls getBalance rather than
updating the balance field of the superclass (field is private)
• Note that addInterest calls getBalance without specifying an
implicit parameter (the calls apply to the same object)
An Introduction to Inheritance
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
SavingsAccount object inherits the balance instance field from
BankAccount, and gains one additional instance field:
interestRate:
Layout of a Subclass Object
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
class SubclassName extends SuperclassName
{
methods
instance fields
}
Example:
public class SavingsAccount extends BankAccount
{
public SavingsAccount(double rate)
{
interestRate = rate;
}
Syntax 10.1 Inheritance
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
public void addInterest()
{
double interest = getBalance() * interestRate / 100;
deposit(interest);
}
private double interestRate;
}
Purpose:
To define a new class that inherits from an existing class, and
define the methods and instance fields that are added in the new
class.
Syntax 10.1 Inheritance
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Which instance fields does an object of class SavingsAccount
have?
Answer: Two instance fields: balance and interestRate.
Self Check 10.1
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Name four methods that you can apply to SavingsAccount objects.
Answer: deposit, withdraw, getBalance, and addInterest.
Self Check 10.2
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
If the class Manager extends the class Employee, which class is the
superclass and which is the subclass?
Answer: Manager is the subclass; Employee is the
superclass.
Self Check 10.3
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Sets of classes can form complex inheritance hierarchies
• Example:
Inheritance Hierarchies
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Superclass JComponent has methods getWidth, getHeight
• AbstractButton class
has methods to set/get
button text and icon
Inheritance Hierarchies Example: Swing Hierarchy
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Consider a bank that offers its customers the following account
types:
1. 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
• Inheritance hierarchy:
• All bank accounts support the getBalance method
• All bank accounts support the deposit and withdraw methods,
but the implementations differ
• Checking account needs a method deductFees; savings account
needs a method addInterest
A Simpler Example: Hierarchy of Bank Accounts
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
What is the purpose of the JTextComponent class in Figure 4?
Answer: To express the common behavior of text fields and text
components.
Self Check 10.4
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Which instance field will we need to add to the CheckingAccount
class?
Answer: We need a counter that counts the number of
withdrawals and deposits.
Self Check 10.5
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Override 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 applied to an object of the subclass type, the overriding
method is executed
• Inherit method:
• Don't supply a new implementation of a method that exists in
superclass
•Superclass method can be applied to the subclass objects
• Add method:
• Supply a new method that doesn't exist in the superclass
• New method can be applied only to subclass objects
Inheriting Methods
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Can't override fields
• Inherit field: All fields from the superclass are automatically
inherited
• Add field: Supply a new field that doesn't exist in the superclass
• 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
Inheriting Instance Fields
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• 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 }
• Each CheckingAccount object has two instance fields:
• balance (inherited from BankAccount)
• transactionCount (new to CheckingAccount)
Implementing the CheckingAccount Class
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• 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)
Implementing the CheckingAccount Class (cont.)
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• 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
• A subclass has no access to private fields of its superclass
• Subclass must use public interface
Inherited Fields are Private
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Can't just call
deposit(amount)
in deposit method of CheckingAccount
• That is the same as
this.deposit(amount)
• Calls the same method (infinite recursion)
• Instead, invoke superclass method
super.deposit(amount)
• Now calls deposit method of BankAccount class
Invoking a Superclass Method
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Complete method:
public void deposit(double amount)
{
transactionCount++;
// Now add amount to balance
super.deposit(amount);
}
Invoking a Superclass Method (cont.)
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Animation 10.1 –
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
super.methodName(parameters)
Example:
public void deposit(double amount)
{
transactionCount++;
super.deposit(amount);
}
Purpose:
To call a method of the superclass instead of the method of the
current class.
Syntax 10.2 Calling a Superclass Method
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
public class CheckingAccount extends BankAccount
{
. . .
public void withdraw(double amount)
{
transactionCount++;
// Now subtract amount from balance
super.withdraw(amount);
}
public void deductFees()
{
if (transactionCount > FREE_TRANSACTIONS)
{
double fees = TRANSACTION_FEE
* (transactionCount - FREE_TRANSACTIONS);
super.withdraw(fees);
}
Implementing Remaining Methods
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
transactionCount = 0;
}
. . .
private static final
int FREE_TRANSACTIONS = 3;
private static final double TRANSACTION_FEE = 2.0;
}
Implementing Remaining Methods (cont.)
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Why does the withdraw method of the CheckingAccount class call
super.withdraw?
Answer: It needs to reduce the balance, and it cannot access
the balance field directly.
Self Check 10.6
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Why does the deductFees method set the transaction count to
zero?
Answer: So that the count can reflect the number of
transactions for the following month.
Self Check 10.7
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• A subclass has no access to the private instance fields of the
superclass
• Beginner's error: "solve" this problem by adding another
instance field with same name:
public class CheckingAccount extends BankAccount
{
public void deposit(double amount)
{
transactionCount++;
balance = balance + amount;
}
. . .
private double balance; // Don't
}
Common Error: Shadowing Instance Fields
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Now the deposit method compiles, but it doesn't update the
correct balance!
Common Error: Shadowing Instance Fields (cont.)
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• super followed by a parenthesis indicates a call to the
superclass constructor
public class CheckingAccount extends BankAccount
{
public CheckingAccount(double initialBalance)
{
// Construct superclass
super(initialBalance);
// Initialize transaction count
transactionCount = 0;
}
. . .
}
• Must be the first statement in subclass constructor
Subclass Construction
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• If subclass constructor doesn't call superclass constructor,
default superclass constructor is used
• Default constructor: constructor with no parameters
• If all constructors of the superclass require parameters, then the compiler
reports an error
Subclass Construction (cont.)
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
ClassName(parameters)
{
super(parameters);
. . .
}
Example:
public CheckingAccount(double initialBalance)
{
super(initialBalance);
transactionCount = 0;
}
Purpose:
To invoke a constructor of the superclass. Note that this statement
must be the first statement of the subclass constructor.
Syntax 10.3 Calling a Superclass Constructor
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Why didn't the SavingsAccount constructor in Section 10.1 call its
superclass constructor?
Answer: It was content to use the default constructor of the
superclass, which sets the balance to zero.
Self Check 10.8
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
When you invoke a superclass method with the super keyword,
does the call have to be the first statement of the subclass
method?
Answer: No – this is a requirement only for constructors. For
example, the SavingsAccount.deposit method first
increments the transaction count, then calls the superclass
method.
Self Check 10.9
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Ok to convert 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
Converting Between Subclass and Superclass Types
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Converting Between Subclass and Superclass Types (cont.)
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Superclass references don't know the full story:
anAccount.deposit(1000); // OK
anAccount.addInterest();
// No--not a method of the class to which anAccount
belongs
• When you convert between a subclass object to its
superclass type:
• The value of the reference stays the same – it is the memory location of
the object
• But, less information is known about the object
Converting Between Subclass and Superclass Types
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Why would anyone want to know less about an object?
• Reuse code that knows about the superclass but not the subclass:
public void transfer(double amount, BankAccount other)
{
withdraw(amount);
other.deposit(amount);
}
Can be used to transfer money from any type of
BankAccount
Converting Between Subclass and Superclass Types (cont.)
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Occasionally you need to convert from a superclass reference
to a subclass reference
BankAccount anAccount = (BankAccount) anObject;
• This cast is dangerous: if you are wrong, an exception is thrown
• Solution: use the instanceof operator
• instanceof: tests whether an object belongs to a particular type
if (anObject instanceof BankAccount)
{
BankAccount anAccount = (BankAccount) anObject;
. . .
}
Converting Between Subclass and Superclass Types
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
object instanceof TypeName
Example:
if (anObject instanceof BankAccount)
{
BankAccount anAccount = (BankAccount) anObject;
. . .
}
Purpose:
To return true if the object is an instance of TypeName (or one of
its subtypes), and false otherwise.
Syntax 10.4 The instanceof Operator
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Why did the second parameter of the transfer method have to be
of type BankAccount and not, for example, SavingsAccount?
Answer: We want to use the method for all kinds of bank
accounts. Had we used a parameter of type SavingsAccount,
we couldn't have called the method with a CheckingAccount
object.
Self Check 10.10
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Why can't we change the second parameter of the transfer
method to the type Object?
Answer: We cannot invoke the deposit method on a variable
of type Object.
Self Check 10.11
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• In Java, type of a variable doesn't completely determine type of
object to which it refers
BankAccount aBankAccount = new SavingsAccount(1000); //
aBankAccount holds a reference to a SavingsAccount
• Method calls are determined by type of actual object, not type of
object reference
BankAccount anAccount = new CheckingAccount();
anAccount.deposit(1000); // Calls "deposit" from
CheckingAccount
• Compiler needs to check that only legal methods are invoked
Object anObject = new BankAccount();
anObject.deposit(1000); // Wrong!
Polymorphism
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Polymorphism: ability to refer to objects of multiple types with
varying behavior
• Polymorphism at work:
public void transfer(double amount, BankAccount other)
{
withdraw(amount); // Shortcut for
this.withdraw(amount)
other.deposit(amount);
}
• Depending on types of amount and other, different versions of
withdraw and deposit are called
Polymorphism
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
01: /**
02: This program tests the BankAccount class and
03: its subclasses.
04: */
05: public class AccountTester
06: {
07: public static void main(String[] args)
08: {
09: SavingsAccount momsSavings
10: = new SavingsAccount(0.5);
11:
12: CheckingAccount harrysChecking
13: = new CheckingAccount(100);
14:
15: momsSavings.deposit(10000);
16:
17: momsSavings.transfer(2000, harrysChecking);
18: harrysChecking.withdraw(1500);
19: harrysChecking.withdraw(80);
20:
ch10/accounts/AccountTester.java
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
21: momsSavings.transfer(1000, harrysChecking);
22: harrysChecking.withdraw(400);
23:
24: // Simulate end of month
25: momsSavings.addInterest();
26: harrysChecking.deductFees();
27:
28: System.out.println("Mom's savings balance: "
29: + momsSavings.getBalance());
30: System.out.println("Expected: 7035");
31:
32: System.out.println("Harry's checking balance: "
33: + harrysChecking.getBalance());
34: System.out.println("Expected: 1116");
35: }
36: }
ch10/accounts/AccountTester.java (cont.)
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
01: /**
02: A checking account that charges transaction fees.
03: */
04: public class CheckingAccount extends BankAccount
05: {
06: /**
07: Constructs a checking account with a given balance.
08: @param initialBalance the initial balance
09: */
10: public CheckingAccount(double initialBalance)
11: {
12: // Construct superclass
13: super(initialBalance);
14:
15: // Initialize transaction count
16: transactionCount = 0;
17: }
18:
19: public void deposit(double amount)
20: {
21: transactionCount++;
ch10/accounts/CheckingAccount.java
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
22: // Now add amount to balance
23: super.deposit(amount);
24: }
25:
26: public void withdraw(double amount)
27: {
28: transactionCount++;
29: // Now subtract amount from balance
30: super.withdraw(amount);
31: }
32:
33: /**
34: Deducts the accumulated fees and resets the
35: transaction count.
36: */
37: public void deductFees()
38: {
39: if (transactionCount > FREE_TRANSACTIONS)
40: {
41: double fees = TRANSACTION_FEE *
42: (transactionCount - FREE_TRANSACTIONS);
43: super.withdraw(fees);
44: }
ch10/accounts/CheckingAccount.java (cont.)
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
45: transactionCount = 0;
46: }
47:
48: private int transactionCount;
49:
50: private static final int FREE_TRANSACTIONS = 3;
51: private static final double TRANSACTION_FEE = 2.0;
52: }
ch10/accounts/CheckingAccount.java (cont.)
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
01: /**
02: A bank account has a balance that can be changed by
03: deposits and withdrawals.
04: */
05: public class BankAccount
06: {
07: /**
08: Constructs a bank account with a zero balance.
09: */
10: public BankAccount()
11: {
12: balance = 0;
13: }
14:
15: /**
16: Constructs a bank account with a given balance.
17: @param initialBalance the initial balance
18: */
19: public BankAccount(double initialBalance)
20: {
21: balance = initialBalance;
22: }
23:
ch10/accounts/BankAccount.java
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
24: /**
25: Deposits money into the bank account.
26: @param amount the amount to deposit
27: */
28: public void deposit(double amount)
29: {
30: balance = balance + amount;
31: }
32:
33: /**
34: Withdraws money from the bank account.
35: @param amount the amount to withdraw
36: */
37: public void withdraw(double amount)
38: {
39: balance = balance - amount;
40: }
41:
42: /**
43: Gets the current balance of the bank account.
44: @return the current balance
45: */
ch10/accounts/BankAccount.java (cont.)
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
46: public double getBalance()
47: {
48: return balance;
49: }
50:
51: /**
52: Transfers money from the bank account to another account
53: @param amount the amount to transfer
54: @param other the other account
55: */
56: public void transfer(double amount, BankAccount other)
57: {
58: withdraw(amount);
59: other.deposit(amount);
60: }
61:
62: private double balance;
63: }
ch10/accounts/BankAccount.java (cont.)
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
01: /**
02: An account that earns interest at a fixed rate.
03: */
04: public class SavingsAccount extends BankAccount
05: {
06: /**
07: Constructs a bank account with a given interest rate.
08: @param rate the interest rate
09: */
10: public SavingsAccount(double rate)
11: {
12: interestRate = rate;
13: }
14:
15: /**
16: Adds the earned interest to the account balance.
17: */
ch10/accounts/SavingsAccount.java
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Output:
Mom's savings balance: 7035.0
Expected: 7035
Harry's checking balance: 1116.0
Expected: 1116
18: public void addInterest()
19: {
20: double interest = getBalance() * interestRate / 100;
21: deposit(interest);
22: }
23:
24: private double interestRate;
25: }
ch10/accounts/SavingsAccount.java (cont.)
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
If a is a variable of type BankAccount that holds a non-null
reference, what do you know about the object to which a refers?
Answer: The object is an instance of BankAccount or one of
its subclasses.
Self Check 10.12
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
If a refers to a checking account, what is the effect of calling
a.transfer(1000, a)?
Answer: The balance of a is unchanged, and the transaction
count is incremented twice.
Self Check 10.13
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Java has four levels of controlling access to fields, methods, and
classes:
• public access
oCan be accessed by methods of all classes
• private access
oCan be accessed only by the methods of their own class
• protected access
oSee Advanced Topic 10.3
• package access
oThe default, when no access modifier is given
oCan be accessed by all classes in the same package
oGood default for classes, but extremely unfortunate for fields
Access Control
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
•Instance and static fields: Always private. Exceptions:
• public static final constants are useful and safe
• Some objects, such as System.out, need to be accessible to all
programs (public)
• Occasionally, classes in a package must collaborate very closely (give
some fields package access); inner classes are usually better
• Methods: public or private
• Classes and interfaces: public or package
• Better alternative to package access: inner classes
• In general, inner classes should not be public (some exceptions
exist, e.g., Ellipse2D.Double)
• Beware of accidental package access (forgetting public or
private)
Recommended Access Levels
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
What is a common reason for defining package-visible instance
fields?
Answer: Accidentally forgetting the private modifier.
Self Check 10.14
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
If a class with a public constructor has package access, who can
construct objects of it?
Answer: Any methods of classes in the same package.
Self Check 10.15
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• All classes defined without an explicit extends clause
automatically extend Object
Object: The Cosmic Superclass
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Object: The Cosmic Superclass
• All classes defined without an explicit extends clause
automatically extend Object
• Most useful methods:
• String toString()
• boolean equals(Object otherObject)
• Object clone()
• Good idea to override these methods in your classes
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• 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]"
• 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]"
Overriding the toString Method
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Object.toString prints 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"
Overriding the toString Method (cont.)
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• To provide a nicer representation of an object, override
toString:
public String toString()
{
return "BankAccount[balance=" + balance + "]";
}
• This works better:
BankAccount momsSavings = new BankAccount(5000);
String s = momsSavings.toString();
// Sets s to "BankAccount[balance=5000]"
Overriding the toString Method
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Overriding the equals Method
• Equals tests for equal contents
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Overriding the equals Method (cont.)
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Define the equals method to test whether two objects have
equal state
• When redefining equals method, you cannot change object
signature; use a cast instead:
public class Coin
{
. . .
public boolean equals(Object otherObject)
{
Coin other = (Coin) otherObject;
return name.equals(other.name) && value ==
other.value;
}
. . .
}
Overriding the equals Method
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• You should also override the hashCode method so that equal
objects have the same hash code
Overriding the equals Method (cont.)
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Should the call x.equals(x) always return true?
Answer: It certainly should – unless, of course, x is null.
Self Check 10.16
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Can you implement equals in terms of toString? Should you?
Answer: If toString returns a string that describes all
instance fields, you can simply call toString on the implicit
and explicit parameters, and compare the results. However,
comparing the fields is more efficient than converting them into
strings.
Self Check 10.17
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Copying an object reference gives two references to same
object
BankAccount account2 = account;
• Sometimes, need to make a copy of the object
Overriding the clone Method
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Overriding the clone Method (cont.)
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Define clone method to make new object (see Advanced Topic
10.6)
• Use clone:
BankAccount clonedAccount =
(BankAccount)account.clone();
• Must cast return value because return type is Object
Overriding the clone Method (cont.)
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
The Object.clone method
• Creates shallow copies
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Does not systematically clone all subobjects
• Must be used with caution
• It is declared as protected; prevents from accidentally calling
x.clone() if the class to which x belongs hasn't redefined clone
to be public
• You should override the clone method with care (see Advanced
Topic 10.6)
The Object.clone method (cont.)
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Scripting Languages
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Use inheritance for complex frames to make programs easier to
understand
• Design a subclass of JFrame
• Store the components as instance fields
• Initialize them in the constructor of your subclass
• If initialization code gets complex, simply add some helper
methods
Using Inheritance to Customize Frames
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Lauren – I’m not sure what is supposed to
go here.
Example: Investment Viewer Program
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Of course, we still need a class with a main method:
Lauren – I’m not sure what is supposed to
go here.
Example: Investment Viewer Program
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Example: Investment Viewer Program (cont.)
Lauren – I’m not sure what is supposed to
go here.
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
How many Java source files are required by the investment
viewer application when we use inheritance to define the frame
class?
Answer: Three: InvestmentFrameViewer, InvestmentFrame, and
BankAccount.
Self Check 10.18
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Why does the InvestmentFrame constructor call
setSize(FRAME_WIDTH, FRAME_HEIGHT), whereas the main method
of the investment viewer class in Chapter 9 called
frame.setSize(FRAME_WIDTH, FRAME_HEIGHT)?
Answer: The InvestmentFrame constructor adds the panel to
itself.
Self Check 10.19
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Use JTextField components to provide space for user input
final int FIELD_WIDTH = 10; // In characters
final JTextField rateField = new
JTextField(FIELD_WIDTH);
• Place a JLabel next to each text field
JLabel rateLabel = new JLabel("Interest Rate: ");
Processing Text Input
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Supply a button that the user can press to indicate that the input
is ready for processing
Processing Text Input
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• The button's actionPerformed method reads the user input from
the text fields (use getText)
Class AddInterestListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
double rate =
Double.parseDouble(rateField.getText());
. . .
}
}
Processing Text Input (cont.)
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
01: import javax.swing.JFrame;
02:
03: /**
04: This program displays the growth of an investment.
05: */
06: public class InvestmentViewer3
07: {
08: public static void main(String[] args)
09: {
10: JFrame frame = new InvestmentFrame();
11: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
12: frame.setVisible(true);
13: }
14: }
ch10/textfield/InvestmentViewer3.java
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
01: import java.awt.event.ActionEvent;
02: import java.awt.event.ActionListener;
03: import javax.swing.JButton;
04: import javax.swing.JFrame;
05: import javax.swing.JLabel;
06: import javax.swing.JPanel;
07: import javax.swing.JTextField;
08:
09: /**
10: A frame that shows the growth of an investment with variable
interest.
11: */
12: public class InvestmentFrame extends JFrame
13: {
14: public InvestmentFrame()
15: {
16: account = new BankAccount(INITIAL_BALANCE);
17:
18: // Use instance fields for components
19: resultLabel = new JLabel("balance: " + account.getBalance());
20:
ch10/textfield/InvestmentFrame.java
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
21: // Use helper methods
22: createTextField();
23: createButton();
24: createPanel();
25:
26: setSize(FRAME_WIDTH, FRAME_HEIGHT);
27: }
28:
29: private void createTextField()
30: {
31: rateLabel = new JLabel("Interest Rate: ");
32:
33: final int FIELD_WIDTH = 10;
34: rateField = new JTextField(FIELD_WIDTH);
35: rateField.setText("" + DEFAULT_RATE);
36: }
37:
38: private void createButton()
39: {
40: button = new JButton("Add Interest");
41:
ch10/textfield/InvestmentFrame.java (cont.)
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
42: class AddInterestListener implements ActionListener
43: {
44: public void actionPerformed(ActionEvent event)
45: {
46: double rate = Double.parseDouble(
47: rateField.getText());
48: double interest = account.getBalance()
49: * rate / 100;
50: account.deposit(interest);
51: resultLabel.setText(
52: "balance: " + account.getBalance());
53: }
54: }
55:
56: ActionListener listener = new AddInterestListener();
57: button.addActionListener(listener);
58: }
59:
60: private void createPanel()
ch10/textfield/InvestmentFrame.java (cont.)
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
61: {
62: panel = new JPanel();
63: panel.add(rateLabel);
64: panel.add(rateField);
65: panel.add(button);
66: panel.add(resultLabel);
67: add(panel);
68: }
69:
70: private JLabel rateLabel;
71: private JTextField rateField;
72: private JButton button;
73: private JLabel resultLabel;
74: private JPanel panel;
75: private BankAccount account;
76:
77: private static final int FRAME_WIDTH = 450;
78: private static final int FRAME_HEIGHT = 100;
79:
80: private static final double DEFAULT_RATE = 5;
81: private static final double INITIAL_BALANCE = 1000;
82: }
ch10/textfield/InvestmentFrame.java (cont.)
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
What happens if you omit the first JLabel object?
Answer: Then the text field is not labeled, and the user will not
know its purpose.
Self Check 10.20
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
If a text field holds an integer, what expression do you use to read
its contents?
Answer: Integer.parseInt(textField.getText())
Self Check 10.21
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• Use a JTextArea to show multiple lines of text
• You can specify the number of rows and columns:
final int ROWS = 10;
final int COLUMNS = 30;
JTextArea textArea = new JTextArea(ROWS, COLUMNS);
• setText: to set the text of a text field or text area
• append: to add text to the end of a text area
• Use newline characters to separate lines:
textArea.append(account.getBalance() + "n");
• To use for display purposes only:
textArea.setEditable(false); // program can call setText
and append to change it
Text Areas
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
• To add scroll bars to a text area:
JTextArea textArea = new JTextArea(ROWS, COLUMNS);
JScrollPane scrollPane = new JScrollPane(textArea);
Text Areas
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
01: import java.awt.event.ActionEvent;
02: import java.awt.event.ActionListener;
03: import javax.swing.JButton;
04: import javax.swing.JFrame;
05: import javax.swing.JLabel;
06: import javax.swing.JPanel;
07: import javax.swing.JScrollPane;
08: import javax.swing.JTextArea;
09: import javax.swing.JTextField;
10:
11: /**
12: A frame that shows the growth of an investment with variable
interest.
13: */
14: public class InvestmentFrame extends JFrame
15: {
16: public InvestmentFrame()
17: {
18: account = new BankAccount(INITIAL_BALANCE);
19: resultArea = new JTextArea(AREA_ROWS, AREA_COLUMNS);
20: resultArea.setEditable(false);
21:
ch10/textarea/InvestmentFrame.java
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
22: // Use helper methods
23: createTextField();
24: createButton();
25: createPanel();
26:
27: setSize(FRAME_WIDTH, FRAME_HEIGHT);
28: }
29:
30: private void createTextField()
31: {
32: rateLabel = new JLabel("Interest Rate: ");
33:
34: final int FIELD_WIDTH = 10;
35: rateField = new JTextField(FIELD_WIDTH);
36: rateField.setText("" + DEFAULT_RATE);
37: }
38:
39: private void createButton()
40: {
41: button = new JButton("Add Interest");
42:
ch10/textarea/InvestmentFrame.java (cont.)
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
43: class AddInterestListener implements ActionListener
44: {
45: public void actionPerformed(ActionEvent event)
46: {
47: double rate = Double.parseDouble(
48: rateField.getText());
49: double interest = account.getBalance()
50: * rate / 100;
51: account.deposit(interest);
52: resultArea.append(account.getBalance() + "n");
53: }
54: }
55:
56: ActionListener listener = new AddInterestListener();
57: button.addActionListener(listener);
58: }
59:
60: private void createPanel()
61: {
62: panel = new JPanel();
63: panel.add(rateLabel);
64: panel.add(rateField);
65: panel.add(button);
ch10/textarea/InvestmentFrame.java (cont.)
Continued
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
66: JScrollPane scrollPane = new JScrollPane(resultArea);
67: panel.add(scrollPane);
68: add(panel);
69: }
70:
71: private JLabel rateLabel;
72: private JTextField rateField;
73: private JButton button;
74: private JTextArea resultArea;
75: private JPanel panel;
76: private BankAccount account;
77:
78: private static final int FRAME_WIDTH = 400;
79: private static final int FRAME_HEIGHT = 250;
80:
81: private static final int AREA_ROWS = 10;
82: private static final int AREA_COLUMNS = 30;
83:
84: private static final double DEFAULT_RATE = 5;
85: private static final double INITIAL_BALANCE = 1000;
86: }
ch10/textarea/InvestmentFrame.java (cont.)
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
What is the difference between a text field and a text area?
Answer: A text field holds a single line of text; a text area holds
multiple lines.
Self Check 10.22
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
Why did the InvestmentFrame program call
resultArea.setEditable(false)?
Answer: The text area is intended to display the program
output. It does not collect user input.
Self Check 10.23
Big Java by Cay Horstmann
Copyright © 2008 by John Wiley & Sons. All rights reserved.
How would you modify the InvestmentFrame program if you didn't
want to use scroll bars?
Answer: Don't construct a JScrollPane and add the
resultArea object directly to the frame.
Self Check 10.24

More Related Content

PPT
Lecture 2 inheritance
PPTX
Inheritance
PPTX
Inheritance
PPTX
Inheritance
PPTX
Inheritance
PPTX
Inheritance
PPTX
Inheritance
PPTX
Inheritance
Lecture 2 inheritance
Inheritance
Inheritance
Inheritance
Inheritance
Inheritance
Inheritance
Inheritance

Similar to ch10.ppt (20)

PPT
06 inheritance
PPTX
Inheritance in java
PDF
Inheritance
PPT
04inherit
PPT
A457405934_21789_26_2018_Inheritance.ppt
PPTX
Inheritance Slides
DOCX
Sdtl assignment 03
PDF
itft-Inheritance in java
PPTX
Inheritance in java computer programming app
PPTX
Inheritance in oop
PPT
Java htp6e 09
PPTX
SodaPDF-converted-inheritanceinjava-120903114217-phpapp02-converted.pptx
PPTX
Inheritance in java.pptx_20241025_101324_0000.pptx.pptx
PDF
4th_class.pdf
PPTX
Inheritance in Java is a mechanism in which one object acquires all the prope...
PPTX
Core java oop
PDF
Chapter 04 inheritance
PPT
Lecture 1 interfaces and polymorphism
PPTX
Java Inheritance
06 inheritance
Inheritance in java
Inheritance
04inherit
A457405934_21789_26_2018_Inheritance.ppt
Inheritance Slides
Sdtl assignment 03
itft-Inheritance in java
Inheritance in java computer programming app
Inheritance in oop
Java htp6e 09
SodaPDF-converted-inheritanceinjava-120903114217-phpapp02-converted.pptx
Inheritance in java.pptx_20241025_101324_0000.pptx.pptx
4th_class.pdf
Inheritance in Java is a mechanism in which one object acquires all the prope...
Core java oop
Chapter 04 inheritance
Lecture 1 interfaces and polymorphism
Java Inheritance
Ad

Recently uploaded (20)

PPTX
oil_refinery_comprehensive_20250804084928 (1).pptx
PPTX
Acceptance and paychological effects of mandatory extra coach I classes.pptx
PDF
Foundation of Data Science unit number two notes
PPTX
Introduction to machine learning and Linear Models
PDF
Clinical guidelines as a resource for EBP(1).pdf
PPTX
Microsoft-Fabric-Unifying-Analytics-for-the-Modern-Enterprise Solution.pptx
PDF
Galatica Smart Energy Infrastructure Startup Pitch Deck
PPTX
Data_Analytics_and_PowerBI_Presentation.pptx
PPT
Miokarditis (Inflamasi pada Otot Jantung)
PPTX
IB Computer Science - Internal Assessment.pptx
PPTX
STUDY DESIGN details- Lt Col Maksud (21).pptx
PPTX
01_intro xxxxxxxxxxfffffffffffaaaaaaaaaaafg
PDF
22.Patil - Early prediction of Alzheimer’s disease using convolutional neural...
PPT
Reliability_Chapter_ presentation 1221.5784
PPTX
Business Ppt On Nestle.pptx huunnnhhgfvu
PPTX
Introduction-to-Cloud-ComputingFinal.pptx
PDF
.pdf is not working space design for the following data for the following dat...
PPT
Quality review (1)_presentation of this 21
PPTX
Computer network topology notes for revision
oil_refinery_comprehensive_20250804084928 (1).pptx
Acceptance and paychological effects of mandatory extra coach I classes.pptx
Foundation of Data Science unit number two notes
Introduction to machine learning and Linear Models
Clinical guidelines as a resource for EBP(1).pdf
Microsoft-Fabric-Unifying-Analytics-for-the-Modern-Enterprise Solution.pptx
Galatica Smart Energy Infrastructure Startup Pitch Deck
Data_Analytics_and_PowerBI_Presentation.pptx
Miokarditis (Inflamasi pada Otot Jantung)
IB Computer Science - Internal Assessment.pptx
STUDY DESIGN details- Lt Col Maksud (21).pptx
01_intro xxxxxxxxxxfffffffffffaaaaaaaaaaafg
22.Patil - Early prediction of Alzheimer’s disease using convolutional neural...
Reliability_Chapter_ presentation 1221.5784
Business Ppt On Nestle.pptx huunnnhhgfvu
Introduction-to-Cloud-ComputingFinal.pptx
.pdf is not working space design for the following data for the following dat...
Quality review (1)_presentation of this 21
Computer network topology notes for revision
Ad

ch10.ppt

  • 1. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Chapter Ten: Inheritance
  • 2. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • To learn about inheritance • To understand how to inherit and override superclass methods • To be able to invoke superclass constructors • To learn about protected and package access control • To understand the common superclass Object and to override its toString and equals methods • To use inheritance for customizing user interfaces Chapter Goals
  • 3. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Inheritance: extend classes by adding methods and fields • Example: Savings account = bank account with interest class SavingsAccount extends BankAccount { new methods new instance fields } • SavingsAccount automatically inherits all methods and instance fields of BankAccount SavingsAccount collegeFund = new SavingsAccount(10); // Savings account with 10% interest collegeFund.deposit(500); // OK to use BankAccount method with SavingsAccount object An Introduction to Inheritance Continued
  • 4. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Extended class = superclass (BankAccount), extending class = subclass (Savings) • Inheriting from class ≠ implementing interface: subclass inherits behavior and state • One advantage of inheritance is code reuse An Introduction to Inheritance (cont.)
  • 5. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Every class extends the Object class either directly or indirectly An Inheritance Diagram
  • 6. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • In subclass, specify added instance fields, added methods, and changed or overridden methods public class SavingsAccount extends BankAccount { public SavingsAccount(double rate) { interestRate = rate; } public void addInterest() { double interest = getBalance() * interestRate / 100; deposit(interest); } An Introduction to Inheritance Continued
  • 7. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. private double interestRate; } • Encapsulation: addInterest calls getBalance rather than updating the balance field of the superclass (field is private) • Note that addInterest calls getBalance without specifying an implicit parameter (the calls apply to the same object) An Introduction to Inheritance
  • 8. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. SavingsAccount object inherits the balance instance field from BankAccount, and gains one additional instance field: interestRate: Layout of a Subclass Object
  • 9. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. class SubclassName extends SuperclassName { methods instance fields } Example: public class SavingsAccount extends BankAccount { public SavingsAccount(double rate) { interestRate = rate; } Syntax 10.1 Inheritance Continued
  • 10. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. public void addInterest() { double interest = getBalance() * interestRate / 100; deposit(interest); } private double interestRate; } Purpose: To define a new class that inherits from an existing class, and define the methods and instance fields that are added in the new class. Syntax 10.1 Inheritance
  • 11. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Which instance fields does an object of class SavingsAccount have? Answer: Two instance fields: balance and interestRate. Self Check 10.1
  • 12. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Name four methods that you can apply to SavingsAccount objects. Answer: deposit, withdraw, getBalance, and addInterest. Self Check 10.2
  • 13. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. If the class Manager extends the class Employee, which class is the superclass and which is the subclass? Answer: Manager is the subclass; Employee is the superclass. Self Check 10.3
  • 14. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Sets of classes can form complex inheritance hierarchies • Example: Inheritance Hierarchies
  • 15. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Superclass JComponent has methods getWidth, getHeight • AbstractButton class has methods to set/get button text and icon Inheritance Hierarchies Example: Swing Hierarchy
  • 16. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Consider a bank that offers its customers the following account types: 1. 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 • Inheritance hierarchy: • All bank accounts support the getBalance method • All bank accounts support the deposit and withdraw methods, but the implementations differ • Checking account needs a method deductFees; savings account needs a method addInterest A Simpler Example: Hierarchy of Bank Accounts
  • 17. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. What is the purpose of the JTextComponent class in Figure 4? Answer: To express the common behavior of text fields and text components. Self Check 10.4
  • 18. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Which instance field will we need to add to the CheckingAccount class? Answer: We need a counter that counts the number of withdrawals and deposits. Self Check 10.5
  • 19. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Override 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 applied to an object of the subclass type, the overriding method is executed • Inherit method: • Don't supply a new implementation of a method that exists in superclass •Superclass method can be applied to the subclass objects • Add method: • Supply a new method that doesn't exist in the superclass • New method can be applied only to subclass objects Inheriting Methods
  • 20. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Can't override fields • Inherit field: All fields from the superclass are automatically inherited • Add field: Supply a new field that doesn't exist in the superclass • 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 Inheriting Instance Fields
  • 21. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • 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 } • Each CheckingAccount object has two instance fields: • balance (inherited from BankAccount) • transactionCount (new to CheckingAccount) Implementing the CheckingAccount Class Continued
  • 22. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • 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) Implementing the CheckingAccount Class (cont.)
  • 23. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • 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 • A subclass has no access to private fields of its superclass • Subclass must use public interface Inherited Fields are Private
  • 24. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Can't just call deposit(amount) in deposit method of CheckingAccount • That is the same as this.deposit(amount) • Calls the same method (infinite recursion) • Instead, invoke superclass method super.deposit(amount) • Now calls deposit method of BankAccount class Invoking a Superclass Method Continued
  • 25. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Complete method: public void deposit(double amount) { transactionCount++; // Now add amount to balance super.deposit(amount); } Invoking a Superclass Method (cont.)
  • 26. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Animation 10.1 –
  • 27. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. super.methodName(parameters) Example: public void deposit(double amount) { transactionCount++; super.deposit(amount); } Purpose: To call a method of the superclass instead of the method of the current class. Syntax 10.2 Calling a Superclass Method
  • 28. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. public class CheckingAccount extends BankAccount { . . . public void withdraw(double amount) { transactionCount++; // Now subtract amount from balance super.withdraw(amount); } public void deductFees() { if (transactionCount > FREE_TRANSACTIONS) { double fees = TRANSACTION_FEE * (transactionCount - FREE_TRANSACTIONS); super.withdraw(fees); } Implementing Remaining Methods Continued
  • 29. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. transactionCount = 0; } . . . private static final int FREE_TRANSACTIONS = 3; private static final double TRANSACTION_FEE = 2.0; } Implementing Remaining Methods (cont.)
  • 30. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Why does the withdraw method of the CheckingAccount class call super.withdraw? Answer: It needs to reduce the balance, and it cannot access the balance field directly. Self Check 10.6
  • 31. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Why does the deductFees method set the transaction count to zero? Answer: So that the count can reflect the number of transactions for the following month. Self Check 10.7
  • 32. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • A subclass has no access to the private instance fields of the superclass • Beginner's error: "solve" this problem by adding another instance field with same name: public class CheckingAccount extends BankAccount { public void deposit(double amount) { transactionCount++; balance = balance + amount; } . . . private double balance; // Don't } Common Error: Shadowing Instance Fields Continued
  • 33. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Now the deposit method compiles, but it doesn't update the correct balance! Common Error: Shadowing Instance Fields (cont.)
  • 34. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • super followed by a parenthesis indicates a call to the superclass constructor public class CheckingAccount extends BankAccount { public CheckingAccount(double initialBalance) { // Construct superclass super(initialBalance); // Initialize transaction count transactionCount = 0; } . . . } • Must be the first statement in subclass constructor Subclass Construction Continued
  • 35. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • If subclass constructor doesn't call superclass constructor, default superclass constructor is used • Default constructor: constructor with no parameters • If all constructors of the superclass require parameters, then the compiler reports an error Subclass Construction (cont.)
  • 36. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. ClassName(parameters) { super(parameters); . . . } Example: public CheckingAccount(double initialBalance) { super(initialBalance); transactionCount = 0; } Purpose: To invoke a constructor of the superclass. Note that this statement must be the first statement of the subclass constructor. Syntax 10.3 Calling a Superclass Constructor
  • 37. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Why didn't the SavingsAccount constructor in Section 10.1 call its superclass constructor? Answer: It was content to use the default constructor of the superclass, which sets the balance to zero. Self Check 10.8
  • 38. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. When you invoke a superclass method with the super keyword, does the call have to be the first statement of the subclass method? Answer: No – this is a requirement only for constructors. For example, the SavingsAccount.deposit method first increments the transaction count, then calls the superclass method. Self Check 10.9
  • 39. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Ok to convert 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 Converting Between Subclass and Superclass Types Continued
  • 40. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Converting Between Subclass and Superclass Types (cont.)
  • 41. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Superclass references don't know the full story: anAccount.deposit(1000); // OK anAccount.addInterest(); // No--not a method of the class to which anAccount belongs • When you convert between a subclass object to its superclass type: • The value of the reference stays the same – it is the memory location of the object • But, less information is known about the object Converting Between Subclass and Superclass Types Continued
  • 42. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Why would anyone want to know less about an object? • Reuse code that knows about the superclass but not the subclass: public void transfer(double amount, BankAccount other) { withdraw(amount); other.deposit(amount); } Can be used to transfer money from any type of BankAccount Converting Between Subclass and Superclass Types (cont.)
  • 43. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Occasionally you need to convert from a superclass reference to a subclass reference BankAccount anAccount = (BankAccount) anObject; • This cast is dangerous: if you are wrong, an exception is thrown • Solution: use the instanceof operator • instanceof: tests whether an object belongs to a particular type if (anObject instanceof BankAccount) { BankAccount anAccount = (BankAccount) anObject; . . . } Converting Between Subclass and Superclass Types
  • 44. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. object instanceof TypeName Example: if (anObject instanceof BankAccount) { BankAccount anAccount = (BankAccount) anObject; . . . } Purpose: To return true if the object is an instance of TypeName (or one of its subtypes), and false otherwise. Syntax 10.4 The instanceof Operator
  • 45. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Why did the second parameter of the transfer method have to be of type BankAccount and not, for example, SavingsAccount? Answer: We want to use the method for all kinds of bank accounts. Had we used a parameter of type SavingsAccount, we couldn't have called the method with a CheckingAccount object. Self Check 10.10
  • 46. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Why can't we change the second parameter of the transfer method to the type Object? Answer: We cannot invoke the deposit method on a variable of type Object. Self Check 10.11
  • 47. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • In Java, type of a variable doesn't completely determine type of object to which it refers BankAccount aBankAccount = new SavingsAccount(1000); // aBankAccount holds a reference to a SavingsAccount • Method calls are determined by type of actual object, not type of object reference BankAccount anAccount = new CheckingAccount(); anAccount.deposit(1000); // Calls "deposit" from CheckingAccount • Compiler needs to check that only legal methods are invoked Object anObject = new BankAccount(); anObject.deposit(1000); // Wrong! Polymorphism
  • 48. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Polymorphism: ability to refer to objects of multiple types with varying behavior • Polymorphism at work: public void transfer(double amount, BankAccount other) { withdraw(amount); // Shortcut for this.withdraw(amount) other.deposit(amount); } • Depending on types of amount and other, different versions of withdraw and deposit are called Polymorphism
  • 49. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. 01: /** 02: This program tests the BankAccount class and 03: its subclasses. 04: */ 05: public class AccountTester 06: { 07: public static void main(String[] args) 08: { 09: SavingsAccount momsSavings 10: = new SavingsAccount(0.5); 11: 12: CheckingAccount harrysChecking 13: = new CheckingAccount(100); 14: 15: momsSavings.deposit(10000); 16: 17: momsSavings.transfer(2000, harrysChecking); 18: harrysChecking.withdraw(1500); 19: harrysChecking.withdraw(80); 20: ch10/accounts/AccountTester.java Continued
  • 50. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. 21: momsSavings.transfer(1000, harrysChecking); 22: harrysChecking.withdraw(400); 23: 24: // Simulate end of month 25: momsSavings.addInterest(); 26: harrysChecking.deductFees(); 27: 28: System.out.println("Mom's savings balance: " 29: + momsSavings.getBalance()); 30: System.out.println("Expected: 7035"); 31: 32: System.out.println("Harry's checking balance: " 33: + harrysChecking.getBalance()); 34: System.out.println("Expected: 1116"); 35: } 36: } ch10/accounts/AccountTester.java (cont.)
  • 51. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. 01: /** 02: A checking account that charges transaction fees. 03: */ 04: public class CheckingAccount extends BankAccount 05: { 06: /** 07: Constructs a checking account with a given balance. 08: @param initialBalance the initial balance 09: */ 10: public CheckingAccount(double initialBalance) 11: { 12: // Construct superclass 13: super(initialBalance); 14: 15: // Initialize transaction count 16: transactionCount = 0; 17: } 18: 19: public void deposit(double amount) 20: { 21: transactionCount++; ch10/accounts/CheckingAccount.java Continued
  • 52. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. 22: // Now add amount to balance 23: super.deposit(amount); 24: } 25: 26: public void withdraw(double amount) 27: { 28: transactionCount++; 29: // Now subtract amount from balance 30: super.withdraw(amount); 31: } 32: 33: /** 34: Deducts the accumulated fees and resets the 35: transaction count. 36: */ 37: public void deductFees() 38: { 39: if (transactionCount > FREE_TRANSACTIONS) 40: { 41: double fees = TRANSACTION_FEE * 42: (transactionCount - FREE_TRANSACTIONS); 43: super.withdraw(fees); 44: } ch10/accounts/CheckingAccount.java (cont.) Continued
  • 53. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. 45: transactionCount = 0; 46: } 47: 48: private int transactionCount; 49: 50: private static final int FREE_TRANSACTIONS = 3; 51: private static final double TRANSACTION_FEE = 2.0; 52: } ch10/accounts/CheckingAccount.java (cont.)
  • 54. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. 01: /** 02: A bank account has a balance that can be changed by 03: deposits and withdrawals. 04: */ 05: public class BankAccount 06: { 07: /** 08: Constructs a bank account with a zero balance. 09: */ 10: public BankAccount() 11: { 12: balance = 0; 13: } 14: 15: /** 16: Constructs a bank account with a given balance. 17: @param initialBalance the initial balance 18: */ 19: public BankAccount(double initialBalance) 20: { 21: balance = initialBalance; 22: } 23: ch10/accounts/BankAccount.java Continued
  • 55. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. 24: /** 25: Deposits money into the bank account. 26: @param amount the amount to deposit 27: */ 28: public void deposit(double amount) 29: { 30: balance = balance + amount; 31: } 32: 33: /** 34: Withdraws money from the bank account. 35: @param amount the amount to withdraw 36: */ 37: public void withdraw(double amount) 38: { 39: balance = balance - amount; 40: } 41: 42: /** 43: Gets the current balance of the bank account. 44: @return the current balance 45: */ ch10/accounts/BankAccount.java (cont.) Continued
  • 56. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. 46: public double getBalance() 47: { 48: return balance; 49: } 50: 51: /** 52: Transfers money from the bank account to another account 53: @param amount the amount to transfer 54: @param other the other account 55: */ 56: public void transfer(double amount, BankAccount other) 57: { 58: withdraw(amount); 59: other.deposit(amount); 60: } 61: 62: private double balance; 63: } ch10/accounts/BankAccount.java (cont.)
  • 57. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. 01: /** 02: An account that earns interest at a fixed rate. 03: */ 04: public class SavingsAccount extends BankAccount 05: { 06: /** 07: Constructs a bank account with a given interest rate. 08: @param rate the interest rate 09: */ 10: public SavingsAccount(double rate) 11: { 12: interestRate = rate; 13: } 14: 15: /** 16: Adds the earned interest to the account balance. 17: */ ch10/accounts/SavingsAccount.java Continued
  • 58. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Output: Mom's savings balance: 7035.0 Expected: 7035 Harry's checking balance: 1116.0 Expected: 1116 18: public void addInterest() 19: { 20: double interest = getBalance() * interestRate / 100; 21: deposit(interest); 22: } 23: 24: private double interestRate; 25: } ch10/accounts/SavingsAccount.java (cont.)
  • 59. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. If a is a variable of type BankAccount that holds a non-null reference, what do you know about the object to which a refers? Answer: The object is an instance of BankAccount or one of its subclasses. Self Check 10.12
  • 60. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. If a refers to a checking account, what is the effect of calling a.transfer(1000, a)? Answer: The balance of a is unchanged, and the transaction count is incremented twice. Self Check 10.13
  • 61. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Java has four levels of controlling access to fields, methods, and classes: • public access oCan be accessed by methods of all classes • private access oCan be accessed only by the methods of their own class • protected access oSee Advanced Topic 10.3 • package access oThe default, when no access modifier is given oCan be accessed by all classes in the same package oGood default for classes, but extremely unfortunate for fields Access Control
  • 62. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. •Instance and static fields: Always private. Exceptions: • public static final constants are useful and safe • Some objects, such as System.out, need to be accessible to all programs (public) • Occasionally, classes in a package must collaborate very closely (give some fields package access); inner classes are usually better • Methods: public or private • Classes and interfaces: public or package • Better alternative to package access: inner classes • In general, inner classes should not be public (some exceptions exist, e.g., Ellipse2D.Double) • Beware of accidental package access (forgetting public or private) Recommended Access Levels
  • 63. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. What is a common reason for defining package-visible instance fields? Answer: Accidentally forgetting the private modifier. Self Check 10.14
  • 64. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. If a class with a public constructor has package access, who can construct objects of it? Answer: Any methods of classes in the same package. Self Check 10.15
  • 65. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • All classes defined without an explicit extends clause automatically extend Object Object: The Cosmic Superclass
  • 66. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Object: The Cosmic Superclass • All classes defined without an explicit extends clause automatically extend Object • Most useful methods: • String toString() • boolean equals(Object otherObject) • Object clone() • Good idea to override these methods in your classes
  • 67. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • 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]" • 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]" Overriding the toString Method Continued
  • 68. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Object.toString prints 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" Overriding the toString Method (cont.)
  • 69. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • To provide a nicer representation of an object, override toString: public String toString() { return "BankAccount[balance=" + balance + "]"; } • This works better: BankAccount momsSavings = new BankAccount(5000); String s = momsSavings.toString(); // Sets s to "BankAccount[balance=5000]" Overriding the toString Method
  • 70. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Overriding the equals Method • Equals tests for equal contents Continued
  • 71. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Overriding the equals Method (cont.)
  • 72. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Define the equals method to test whether two objects have equal state • When redefining equals method, you cannot change object signature; use a cast instead: public class Coin { . . . public boolean equals(Object otherObject) { Coin other = (Coin) otherObject; return name.equals(other.name) && value == other.value; } . . . } Overriding the equals Method Continued
  • 73. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • You should also override the hashCode method so that equal objects have the same hash code Overriding the equals Method (cont.)
  • 74. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Should the call x.equals(x) always return true? Answer: It certainly should – unless, of course, x is null. Self Check 10.16
  • 75. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Can you implement equals in terms of toString? Should you? Answer: If toString returns a string that describes all instance fields, you can simply call toString on the implicit and explicit parameters, and compare the results. However, comparing the fields is more efficient than converting them into strings. Self Check 10.17
  • 76. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Copying an object reference gives two references to same object BankAccount account2 = account; • Sometimes, need to make a copy of the object Overriding the clone Method Continued
  • 77. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Overriding the clone Method (cont.) Continued
  • 78. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Define clone method to make new object (see Advanced Topic 10.6) • Use clone: BankAccount clonedAccount = (BankAccount)account.clone(); • Must cast return value because return type is Object Overriding the clone Method (cont.)
  • 79. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. The Object.clone method • Creates shallow copies Continued
  • 80. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Does not systematically clone all subobjects • Must be used with caution • It is declared as protected; prevents from accidentally calling x.clone() if the class to which x belongs hasn't redefined clone to be public • You should override the clone method with care (see Advanced Topic 10.6) The Object.clone method (cont.)
  • 81. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Scripting Languages
  • 82. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Use inheritance for complex frames to make programs easier to understand • Design a subclass of JFrame • Store the components as instance fields • Initialize them in the constructor of your subclass • If initialization code gets complex, simply add some helper methods Using Inheritance to Customize Frames
  • 83. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Lauren – I’m not sure what is supposed to go here. Example: Investment Viewer Program
  • 84. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Of course, we still need a class with a main method: Lauren – I’m not sure what is supposed to go here. Example: Investment Viewer Program
  • 85. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Example: Investment Viewer Program (cont.) Lauren – I’m not sure what is supposed to go here.
  • 86. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. How many Java source files are required by the investment viewer application when we use inheritance to define the frame class? Answer: Three: InvestmentFrameViewer, InvestmentFrame, and BankAccount. Self Check 10.18
  • 87. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Why does the InvestmentFrame constructor call setSize(FRAME_WIDTH, FRAME_HEIGHT), whereas the main method of the investment viewer class in Chapter 9 called frame.setSize(FRAME_WIDTH, FRAME_HEIGHT)? Answer: The InvestmentFrame constructor adds the panel to itself. Self Check 10.19
  • 88. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Use JTextField components to provide space for user input final int FIELD_WIDTH = 10; // In characters final JTextField rateField = new JTextField(FIELD_WIDTH); • Place a JLabel next to each text field JLabel rateLabel = new JLabel("Interest Rate: "); Processing Text Input Continued
  • 89. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Supply a button that the user can press to indicate that the input is ready for processing Processing Text Input Continued
  • 90. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • The button's actionPerformed method reads the user input from the text fields (use getText) Class AddInterestListener implements ActionListener { public void actionPerformed(ActionEvent event) { double rate = Double.parseDouble(rateField.getText()); . . . } } Processing Text Input (cont.)
  • 91. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. 01: import javax.swing.JFrame; 02: 03: /** 04: This program displays the growth of an investment. 05: */ 06: public class InvestmentViewer3 07: { 08: public static void main(String[] args) 09: { 10: JFrame frame = new InvestmentFrame(); 11: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 12: frame.setVisible(true); 13: } 14: } ch10/textfield/InvestmentViewer3.java
  • 92. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. 01: import java.awt.event.ActionEvent; 02: import java.awt.event.ActionListener; 03: import javax.swing.JButton; 04: import javax.swing.JFrame; 05: import javax.swing.JLabel; 06: import javax.swing.JPanel; 07: import javax.swing.JTextField; 08: 09: /** 10: A frame that shows the growth of an investment with variable interest. 11: */ 12: public class InvestmentFrame extends JFrame 13: { 14: public InvestmentFrame() 15: { 16: account = new BankAccount(INITIAL_BALANCE); 17: 18: // Use instance fields for components 19: resultLabel = new JLabel("balance: " + account.getBalance()); 20: ch10/textfield/InvestmentFrame.java Continued
  • 93. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. 21: // Use helper methods 22: createTextField(); 23: createButton(); 24: createPanel(); 25: 26: setSize(FRAME_WIDTH, FRAME_HEIGHT); 27: } 28: 29: private void createTextField() 30: { 31: rateLabel = new JLabel("Interest Rate: "); 32: 33: final int FIELD_WIDTH = 10; 34: rateField = new JTextField(FIELD_WIDTH); 35: rateField.setText("" + DEFAULT_RATE); 36: } 37: 38: private void createButton() 39: { 40: button = new JButton("Add Interest"); 41: ch10/textfield/InvestmentFrame.java (cont.) Continued
  • 94. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. 42: class AddInterestListener implements ActionListener 43: { 44: public void actionPerformed(ActionEvent event) 45: { 46: double rate = Double.parseDouble( 47: rateField.getText()); 48: double interest = account.getBalance() 49: * rate / 100; 50: account.deposit(interest); 51: resultLabel.setText( 52: "balance: " + account.getBalance()); 53: } 54: } 55: 56: ActionListener listener = new AddInterestListener(); 57: button.addActionListener(listener); 58: } 59: 60: private void createPanel() ch10/textfield/InvestmentFrame.java (cont.) Continued
  • 95. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. 61: { 62: panel = new JPanel(); 63: panel.add(rateLabel); 64: panel.add(rateField); 65: panel.add(button); 66: panel.add(resultLabel); 67: add(panel); 68: } 69: 70: private JLabel rateLabel; 71: private JTextField rateField; 72: private JButton button; 73: private JLabel resultLabel; 74: private JPanel panel; 75: private BankAccount account; 76: 77: private static final int FRAME_WIDTH = 450; 78: private static final int FRAME_HEIGHT = 100; 79: 80: private static final double DEFAULT_RATE = 5; 81: private static final double INITIAL_BALANCE = 1000; 82: } ch10/textfield/InvestmentFrame.java (cont.)
  • 96. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. What happens if you omit the first JLabel object? Answer: Then the text field is not labeled, and the user will not know its purpose. Self Check 10.20
  • 97. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. If a text field holds an integer, what expression do you use to read its contents? Answer: Integer.parseInt(textField.getText()) Self Check 10.21
  • 98. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • Use a JTextArea to show multiple lines of text • You can specify the number of rows and columns: final int ROWS = 10; final int COLUMNS = 30; JTextArea textArea = new JTextArea(ROWS, COLUMNS); • setText: to set the text of a text field or text area • append: to add text to the end of a text area • Use newline characters to separate lines: textArea.append(account.getBalance() + "n"); • To use for display purposes only: textArea.setEditable(false); // program can call setText and append to change it Text Areas
  • 99. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. • To add scroll bars to a text area: JTextArea textArea = new JTextArea(ROWS, COLUMNS); JScrollPane scrollPane = new JScrollPane(textArea); Text Areas
  • 100. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. 01: import java.awt.event.ActionEvent; 02: import java.awt.event.ActionListener; 03: import javax.swing.JButton; 04: import javax.swing.JFrame; 05: import javax.swing.JLabel; 06: import javax.swing.JPanel; 07: import javax.swing.JScrollPane; 08: import javax.swing.JTextArea; 09: import javax.swing.JTextField; 10: 11: /** 12: A frame that shows the growth of an investment with variable interest. 13: */ 14: public class InvestmentFrame extends JFrame 15: { 16: public InvestmentFrame() 17: { 18: account = new BankAccount(INITIAL_BALANCE); 19: resultArea = new JTextArea(AREA_ROWS, AREA_COLUMNS); 20: resultArea.setEditable(false); 21: ch10/textarea/InvestmentFrame.java Continued
  • 101. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. 22: // Use helper methods 23: createTextField(); 24: createButton(); 25: createPanel(); 26: 27: setSize(FRAME_WIDTH, FRAME_HEIGHT); 28: } 29: 30: private void createTextField() 31: { 32: rateLabel = new JLabel("Interest Rate: "); 33: 34: final int FIELD_WIDTH = 10; 35: rateField = new JTextField(FIELD_WIDTH); 36: rateField.setText("" + DEFAULT_RATE); 37: } 38: 39: private void createButton() 40: { 41: button = new JButton("Add Interest"); 42: ch10/textarea/InvestmentFrame.java (cont.) Continued
  • 102. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. 43: class AddInterestListener implements ActionListener 44: { 45: public void actionPerformed(ActionEvent event) 46: { 47: double rate = Double.parseDouble( 48: rateField.getText()); 49: double interest = account.getBalance() 50: * rate / 100; 51: account.deposit(interest); 52: resultArea.append(account.getBalance() + "n"); 53: } 54: } 55: 56: ActionListener listener = new AddInterestListener(); 57: button.addActionListener(listener); 58: } 59: 60: private void createPanel() 61: { 62: panel = new JPanel(); 63: panel.add(rateLabel); 64: panel.add(rateField); 65: panel.add(button); ch10/textarea/InvestmentFrame.java (cont.) Continued
  • 103. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. 66: JScrollPane scrollPane = new JScrollPane(resultArea); 67: panel.add(scrollPane); 68: add(panel); 69: } 70: 71: private JLabel rateLabel; 72: private JTextField rateField; 73: private JButton button; 74: private JTextArea resultArea; 75: private JPanel panel; 76: private BankAccount account; 77: 78: private static final int FRAME_WIDTH = 400; 79: private static final int FRAME_HEIGHT = 250; 80: 81: private static final int AREA_ROWS = 10; 82: private static final int AREA_COLUMNS = 30; 83: 84: private static final double DEFAULT_RATE = 5; 85: private static final double INITIAL_BALANCE = 1000; 86: } ch10/textarea/InvestmentFrame.java (cont.)
  • 104. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. What is the difference between a text field and a text area? Answer: A text field holds a single line of text; a text area holds multiple lines. Self Check 10.22
  • 105. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. Why did the InvestmentFrame program call resultArea.setEditable(false)? Answer: The text area is intended to display the program output. It does not collect user input. Self Check 10.23
  • 106. Big Java by Cay Horstmann Copyright © 2008 by John Wiley & Sons. All rights reserved. How would you modify the InvestmentFrame program if you didn't want to use scroll bars? Answer: Don't construct a JScrollPane and add the resultArea object directly to the frame. Self Check 10.24