go to previous page   go to home page   go to next page highlighting

Would the following work?

System.out.println( item1.toString() );
System.out.println( item2.toString() );

Answer:

Yes, since all objects inherit from Object so all objects have a toString() method.


Type Casts

A new method is added to the Book class:


// Book.java
public class Book extends Goods implements Taxable
{
  protected String author;

  public Book( String des, double pr, String auth)
  {
    super( des, pr );
    author  = auth ;
  }

  public String toString()
  {
    return super.toString() + "author: " + author ;
  }

  public double calculateTax()
  {
    return price * TAXRATE ;
  }
  
  // Newly added method 
  public String getAuthor()
  {
    return author;
  }
}
// Store.java
public class Store
{
  public static void main ( String[] args )
  {
    Taxable item1 = new Book ( "Emma", 24.95, "Austen" );
    System.out.println( "Tax on item 1 "+ item1.calculateTax() );

    System.out.println( "Author: " + item1.getAuthor() );
  }
}

When a variable is of type Taxable all the compiler knows is the "taxable" aspect of the object and the methods in Object. The statement from the above program fails to compile because Taxable objects do not necessarily have the requested method getAuthor().

PS C:\Store> javac Store.java
Store.java:9: error: cannot find symbol
    System.out.println( "Author: " + item1.getAuthor() );
                                          ^
  symbol:   method getAuthor()
  location: variable item1 of type Taxable
1 error
PS C:\Store>

In a larger program there may be Taxable objects that do not have getAuthor(). The compiler can only use the methods associated by the type of the reference variable. In the above program, only the calculateTax() method and methods in Object are associated with the reference variable item1.

A type cast tells the compiler that a particular variable refers to an object of a specific class. To fix the above problem, replace the defective statement with the following.

System.out.println( "Author: " + 
  ((Book)item1).getAuthor() );

Now the getAuthor() method of the object pointed to by item1 can be found because the compiler has been told that item1 points to a Book.

This program is not very sensibly written. If the variable item1 always points to a Book it would be more sensible to make it of type Book. But programs with complicated logic sometimes need such casts.


QUESTION 20:

Why are the parentheses needed around (Book)item1 ?

((Book)item1).getAuthor()

go to previous page   go to home page   go to next page