Programming via Java Subclasses

Similar documents
SUBCLASSES IN JAVA - II

Programming via Java Defining classes

MORE ON LOOPS IN JAVA

Programming via Java User interaction

Chapter 2 ACM Java Graphics

MITOCW watch?v=kz7jjltq9r4

CS-202 Introduction to Object Oriented Programming

Assignment 2: Welcome to Java!

Expressions, Statements, and Control Structures

Computer Science 2 Lecture 4 Inheritance: Trinidad Fruit Stand 02/15/2014 Revision : 1.7

In Java, to create a class named "B" as a subclass of a class named "A", you would write

Super-Classes and sub-classes

COS226 - Spring 2018 Class Meeting # 13 March 26, 2018 Inheritance & Polymorphism

Objects and Graphics

Getting Familiar with ACM_JTF

Software Paradigms (Lesson 3) Object-Oriented Paradigm (2)

Slide 1 CS 170 Java Programming 1

Assignment #2: Simple Java Programs Due: 1:15pm on Friday, April 19th

Subclasses, Superclasses, and Inheritance

COP 3330 Final Exam Review

What is Java? professional software engineering.

Chapter 4 Defining Classes I

CSE wi Final Exam 3/12/18. Name UW ID#

CS 106A, Lecture 11 Graphics

CSE wi Final Exam 3/12/18 Sample Solution

5.6.1 The Special Variable this

CS 106B Lecture 27: Inheritance and Polymorphism in C++

Formal Methods of Software Design, Eric Hehner, segment 1 page 1 out of 5

Variables, Types, and Expressions

CIS 110: Introduction to computer programming

09/02/2013 TYPE CHECKING AND CASTING. Lecture 5 CS2110 Spring 2013

Programming Lecture 2. Programming by example (Chapter 2) Hello world Patterns Classes, objects Graphical programming

Parallel scan. Here's an interesting alternative implementation that avoids the second loop.

CS 1316 Exam 1 Summer 2009

Math Modeling in Java: An S-I Compartment Model

INHERITANCE. Spring 2019

An Introduction to Subtyping

CS107 Handout 37 Spring 2007 May 25, 2007 Introduction to Inheritance

Using Inheritance to Share Implementations

Using the API: Introductory Graphics Java Programming 1 Lesson 8

ITI Introduction to Computing II

ITI Introduction to Computing II

MITOCW watch?v=4dj1oguwtem

Simple Java YEAH Hours. Brahm Capoor and Vrinda Vasavada

Chapter 3 Syntax, Errors, and Debugging. Fundamentals of Java

Java Object Oriented Design. CSC207 Fall 2014

Solutions for Section #4

CS 170 Java Programming 1. Week 7: More on Logic

Module 10 Inheritance, Virtual Functions, and Polymorphism

Polymorphism and Interfaces. CGS 3416 Spring 2018

class Shape { // Color of the shape. (Recall that class Color // is defined in package java.awt. Assume // that this class has been imported.

Chapter 11 Inheritance and Polymorphism. Motivations. Suppose you will define classes to model circles,

Programming Languages and Techniques (CIS120)

CS103 Handout 29 Winter 2018 February 9, 2018 Inductive Proofwriting Checklist

EXPRESSIONS AND ASSIGNMENT CITS1001

22. Inheritance. Java. Summer 2008 Instructor: Dr. Masoud Yaghini

School of Computer Science CPS109 Course Notes Set 7 Alexander Ferworn Updated Fall 15 CPS109 Course Notes 7

6.001 Notes: Section 8.1

Advanced Programming - JAVA Lecture 4 OOP Concepts in JAVA PART II

25. Generic Programming

Making New instances of Classes

Object Oriented Programming and Design in Java. Session 10 Instructor: Bert Huang

Lecture Set 4: More About Methods and More About Operators

2. The object-oriented paradigm

Inheritance and Polymorphism

Data & Procedure Java review

It can be confusing when you type something like the expressions below and get an error message. a range variable definition a vector of sine values

Programming Abstractions

1 Shyam sir JAVA Notes

Interactive Graphics

Object-Oriented Programming

Chapter 10 Inheritance and Polymorphism. Dr. Hikmat Jaber

Slide 1 CS 170 Java Programming 1 Object-Oriented Graphics Duration: 00:00:18 Advance mode: Auto

24. Inheritance. Java. Fall 2009 Instructor: Dr. Masoud Yaghini

Nested Loops Chris Piech CS106A, Stanford University. Piech, CS106A, Stanford University

CS103 Spring 2018 Mathematical Vocabulary

CS Programming Exercise:

Data Structure Design II Chris Piech CS106A, Stanford University. Piech, CS106A, Stanford University

Arrays and functions Multidimensional arrays Sorting and algorithm efficiency

Inheritance (IS A Relationship)

Inheritance Systems. Merchandise. Television Camcorder Shirt Shoe Dress 9.1.1

The compiler is spewing error messages.

A PROGRAM IS A SEQUENCE of instructions that a computer can execute to

} Evaluate the following expressions: 1. int x = 5 / 2 + 2; 2. int x = / 2; 3. int x = 5 / ; 4. double x = 5 / 2.

Inheritance (continued) Inheritance

Inheritance & Polymorphism Recap. Inheritance & Polymorphism 1

CIS 110 Introduction To Computer Programming. February 29, 2012 Midterm

Programming in the Real World

Unit E Step-by-Step: Programming with Python

Lecture Set 4: More About Methods and More About Operators

Chapter 1 Getting Started

Supporting Class / C++ Lecture Notes

Inheritance. Lecture 11 COP 3252 Summer May 25, 2017

COMP-202 Unit 2: Java Basics. CONTENTS: Using Expressions and Variables Types Strings Methods

Inheritance & Polymorphism

Interactive Graphics. Eric Roberts Handout #23 CS 106A January 25, 2016 Interactive Graphics. Computer Graphics and the Utah Teapot.

Polymorphism: Interfaces and Iteration. Fundamentals of Computer Science

Chapter 6 Introduction to Defining Classes

Chapter 14 Abstract Classes and Interfaces

Assignment 1: grid. Due November 20, 11:59 PM Introduction

Transcription:

Programming via Java Subclasses Every class in Java is built from another Java class. The new class is called a subclass of the other class from which it is built. A subclass inherits all the instance methods from its superclass. The notion of being a subclass is transitive: If class A is a subclass of B, and B is a subclass of C, then A is also considered a subclass of C. And if C is a subclass of D, then so is A a subclass of D. The subclass concept has important implications in Java, and we explore the concept in this chapter. 11.1. Fundamentals of subclasses The GOval class is a good example of a subclass: It is a subclass of the GObject class. The GObject class represents abstract objects that might appear inside a graphics window, and a GOval object is a particular shape that will appear. Since all such objects will have a position in the window, GObject defines several methods regarding the object's position, including getx, gety, and move. The GOval class, as a subclass of GObject, inherits all of these methods, as well as adding some of its own, like setfilled. The GLine class, also a subclass of GObject, inherits GObject's methods too, and it adds different methods, like setstartpoint and setendpoint for moving the line's endpoints. (The GLine class does not have a method calledsetfilled.) Subclasses are meant to be more specialized versions of the superclass hence the word subclass, similar to the word subset from mathematics. Ovals are a subset of all shapes, so GOval is defined as a subclass of GObject. Being more specialized, it may make sense for the subclass to be perform specialized methods that don't apply to the more general superclass. The method setfilled doesn't make sense for GObject, because for some shapes (such as lines), the notion of being filled is senseless. But for ovals, it does make sense, and so GOval defines a setfilled method. Often we say that the new class extends the other class, since it contains all of the instance methods of the superclass, plus possibly more that are defined just for the subclass. In fact, our programs have included exactly this word extends: We've started the program with words like public class extends GraphicsProgram.) If we wanted a GCircle class for representing circles, then a good designer would define it as a subclass of GOval, since circles are simply a special type of oval. This class might add some additional methods, such as getradius, that don't make as much sense in the context

of ovals. (The designers of the acm.graphics package didn't feel that circles were sufficiently interesting to include a special class for them, though.) By the way, GCircle would automatically be a subclass of GObject, too, since every circle is an oval, and every oval is a shape. Much like a family tree, classes can be arranged into a diagram called an inheritance hierarchy, showing they relate to each other. Figure 11.1 illustrates an inheritance hierarchy for several classes in the acm.graphics package, plus our hypothetical GCircle class. Figure 11.1: An inheritance hierarchy. (The italicized GCircle is not in acm.graphics.) 11.2. The Object class This chapter began: Every class in Java is built from another Java class. This leads to an obvious question: Does this mean that there are infinitely many classes, each extending the next one? Actually, the sentence wasn't entirely true. There is one special class which does not extend any other class: Object, found in the java.lang package. When defining a class that doesn't seem sensibly to extend any other class (as often happens), a developer would define it to extend the Object class alone. The GObject class is an example of a class whose only superclass is Object. The Object class does include a few methods. Because Object is the ultimate parent of all other classes, all other classes inherit these methods. In this book, we'll examine two of these methods, equals and tostring. boolean equals(object other) Returns true if this object is identical to other. By default, the two objects are regarded as equal only if they are the same object. For some classes (notablystring), equals compares the data within the object to check whether the objects represent the same concept, even if they are two separate objects.

String tostring() Returns a string representation of this object's value. By default, this string is basically nonsense, but for some subclasses the method returns a meaningful string representation. These instance methods can be applied to any object in a program, because every object is a member of some class, and that class must lie somewhere below Objectclass in the inheritance hierarchy, so it will inherit the Object instance methods. Thus, writing ball.tostring() would be legal, no matter what sort of object ballreferences. 11.3. Subclasses and variables Any instance of a class A can also be treated as an instance of a superclass of A. Thus, if B is a superclass of A, then every A object can also be treated as a B objects. As a result, if a variable's type is a class C, then the variable can reference an object whose actual class is some subclass of C. For example, we could rewrite our MovingBallclass so that ball is a GObject variable. GObject ball; // Note that ball is a GObject ball = new GOval(10, 10, 100, 100); // but we assign a GOval to it. add(ball); while(true) { } pause(40); ball.move(1, 0); The ball variable is declared to reference any GObject, including instances of subclasses of GObject. So in the second line, initializing ball to reference a GOval is acceptable. We could also make ball refer to a GRect if we liked, since GRect is also a subclass of GObject. Later in the fragment, the line ball.move(1, 0); is acceptable, because the move method is defined in the GObject class. (The compiler knows that this method will be inherited by any subclass, so it's assured that even if ball's actual class is some subclass, move will still be a legal method.) On the other hand, a program cannot invoke a method not defined for the class that the variable represents, as attempted below. GObject ball; ball = new GOval(75, 75, 50, 50); ball.setfilled(true); // Illegal!!

Should this fragment execute, ball will of course refer to a GOval, and one might think that invoking setfilled should be legal. But the compiler translates the program before execution, and the compiler looks only at the statement in question to determine whether a method invocation is legal. Looking at the setfilled invocation, the compiler knows only that ball references a GObject object; it doesn't look at the rest of the program to deduce the obvious fact that ball will actually be a GOval. Since not all GObject objects have a setfilled method, the compiler will reject the line and the program. You ought to be wondering: Why would I ever want a variable anyway whose type is a superclass of the object that it will actually reference? After all, using the superclass simply restricts what we can do with the object. Most often, this reasoning is correct: The program might as well use the most specific type available. But there are some circumstances where using a more general type is quite useful. A notable example is the add method in the GraphicsProgram class. void add(gobject shape) Adds shape for drawing within this window. If shape's class is written properly, any modifications to shape will be reflected immediately in this window. Using the above reasoning concerning variables, the add method's parameter shape can refer to an instance of any GObject subclass. Thus, this single add method can deal with inserting a GOval, a GRect, or any other subclass of GObject. For the person writing GraphicsProgram, writing add just once for all GObjects is much more convenient than requiring an add method for each possible category of shape. In fact, we can even define our own subclasses of GObject (as we'll do in Chapter 14), and the add method will automatically apply to them, too, with no need to modify GraphicsProgram. 11.4. Example: Psychedelic balls To illustrate an instance where having a GObject variable is useful, let's consider the following goal: Suppose we want a window containing fifty circles, and we want them all to switch colors every quarter second. The obvious way to do it, based on what we've seen so far, is to create fifty different variables, one for each circle. With each quarter second, we'd change the color for the circle to which each variable refers. This way is quite cumbersome, and it involves lots of duplication of code, which is always something we should strive to avoid, since duplication inhibits debugging and enhancing programs.

A much simpler alternative is to use the following two methods from the GraphicsProgram class. GObject getelement(int index) Returns a GObject that has been added into the window. The objects are numbered consecutively starting from 0. int getelementcount() Returns the number of GObjects that are currently in this window. These methods are useful because they relieve us from the problem of having to remember all the shapes within our program: We can instead just ask thegraphicsprogram object to get each shape for us. Note that getelement returns a GObject; this is because a particular shape in the window can be of any subclass ofgobject. Figure 11.2 contains a program accomplishing our task using this technique. Figure 11.2: The PsychedelicBalls program. 1 import acm.program.*; 2 import acm.graphics.*; 3 import java.awt.*; 4 5 public class PsychedelicBalls extends GraphicsProgram { 6 public void run() { 7 // Add all the circles into the window 8 Color cur = Color.BLUE; // set up the colors to switch between 9 Color prev = Color.RED; 10 for(int row = 0; row < 5; row++) { 11 for(int col = 0; col < 10; col++) { 12 double x = (col + 0.5) * getwidth() / 10.0; 13 double y = (row + 0.5) * getheight() / 5.0; 14 GOval ball = new GOval(x - 25, y - 25, 50, 50); 15 ball.setfilled(true); 16 ball.setcolor(cur); 17 add(ball); 18 } 19 } 20

21 // Now repeatedly change out the colors 22 while(true) { 23 pause(250); // wait a quarter second 24 25 Color temp = cur; // swap colors for this frame 26 cur = prev; 27 prev = temp; 28 29 for(int i = 0; i < getelementcount(); i++) { 30 GObject shape = getelement(i); 31 shape.setcolor(cur); 32 } 33 } 34 } 35 } The program has two major sections. The first, lines 7 to 19, runs very quickly at the beginning to add 5 rows of 10 balls each into the window. The computer will spend the remainder of its time in the second part, lines 7 to 19, where it repeatedly waits for a quarter second, swaps into the color for the next frame, and then iterates through all the shapes in the window. The important part for us is line 30, which retrieves each individual ball using the getelement method. Note line 31. It invokes setcolor on each circle, rather than setfillcolor as we've been using in programs until now. It would actually be illegal to invoke setfillcolorhere, since shape is a GObject variable, and setfillcolor isn't defined in the GObject class. However, GObject does define setcolor, so the program is legal as written. (The difference between setcolor and setfillcolor is that setcolor also changes the color of the shape's boundary. However, if setfillcolor has been applied to the shape, then setcolor does not affect the shape's interior.) 11.5. Casting But what if we want to use setfillcolor in line 31 of Figure 11.2? It seems like this should be legal: After all, we already know that all the shapes in the window aregoval objects, and GOval has a setfillcolor method. In fact, Java does provide a way to accomplish this, using casting. This technique casts an object into the mold of a subclass, so that you can then invoke the desired method on it. To tell the computer to cast an object, you enclose the name of the class to which it should be

casted in parentheses before the variable name. For example, we will replace the line shape.setcolor(cur); with the following instead. GOval ball = (GOval) shape; // the cast is on the right side of '=' ball.setfillcolor(cur); With each shape then, the cast will force shape into being treated as a GOval. Our program can assign this into a GOval variable such as ball, and then we can applysetfillcolor to this GOval variable. In fact, since the ball variable is used only once, we can combine the lines together. However, casting is a lower order of precedence than the period operator (the method application operator), just as addition is a lower order of precedence than multiplication in the order of operations. Thus, if we combine the lines, we'll need to enclose the cast in an extra set of parentheses. ((GOval) shape).setfillcolor(cur); If wrote (GOval) shape.setfillcolor(cur);, omitting the parentheses, then the compiler would interpret this as if we had written (GOval) (shape.setfillcolor(cur));. That is, the compiler would think we mean for the computer to invoke setfillcolor on shape first and then to cast whateversetfillcolor returns into a GOval object. The compiler will reject the line, because shape, as a GObject, does not provide a setfillcolor method. In fact, we can abbreviate the loop body even further, because the shape variable is also used only once. Thus, the entire loop body can fit into one line. ((GOval) getelement(i)).setfillcolor(cur); For any of these alternative formulations, it's`worth wondering: What if one of the shapes in the window isn't a GOval? For example, what would happen if we happened to have a GRect somewhere in the picture? In this case, the program would still compile properly. But when the program executes, the computer would soon get to the line where getelement returns the GRect, and it is supposed to cast that GRect into a GOval. At this point, the computer will terminate the program with an exception called a ClassCastException. 11.6. The instanceof operator Sometimes you want to be able to test whether a variable references an object of a particular class. Returning to our PsychedelicBalls example of Figure 11.2, suppose our picture also

included some GRects, which we did not want to flicker between colors. To accomplish this, it would be helpful if, as we iterate through all the shapes of the window in lines 29 to 32, we could test which of the shapes are GOvals and which are GRects. The solution is the instanceof operator. On the left side of this operator is some object, and on its right side is the name of some class. Upon reaching the operator, the computer determines whether the left-side object is an instance of the right-side class, and it substitutes true or false accordingly. We can thus place this operator inside an if statement to determine whether to attempt the cast and invocation of setfillcolor. GObject shape = getelement(i); if(shape instanceof GOval) { } ((GOval) shape).setfillcolor(cur); With this modification, the setfillcolor line will be attempted only for the GOval objects. This will avoid the potential for the ClassCastException that would otherwise occur if the cast within the line were attempted for GRects or GLines. Of course, if the left-side object is an instance of some subclass (or subsubclass, ) of the right-side class, it would still be considered an instance of the right-side class. Thus, if the window contained an instance of our hypothetical GCircle class, it too would flicker between colors. Source: http://www.toves.org/books/java/ch11-subclass/index.html