290 likes | 381 Views
Inheritance. Chapter 8. Inheritance. Superclass. subclass of Animal superclass of dog and cat. Subclass. Superclass has its own fields and methods. Subclass inherits all of superclass fields and methods and adds some of its own. Subclass has its own fields and methods.
E N D
Inheritance Chapter 8
Inheritance Superclass subclass of Animal superclass of dog and cat Subclass
Superclass has its own fields and methods Subclass inherits all of superclass fields and methods and adds some of its own Subclass has its own fields and methods
Inheritance Advantages • One superclass for lots of subclasses • Saves code rewriting for client • Save code rewriting within class • Note: There does not have to be an object of a superclass – there are no “animal” objects
Shapes Example • Circle has: • color, xPosition, yPosition, Diameter • Triangle has: • color, xPosition, yPosition, length, height • Make a parent: Shape
Subtyping Shape s1 = new Shape(); // ok Circle c = new Circle(); // ok Triangle t = new Triangle(); // ok Shape s2 = new Circle(); // ok Circle c2 = new Shape(); // NOT ok --------- c.findCircumference ( ); // ok if method exists s2.findCircumference( ); // NOT ok (Circle)s2.findCircumference(); // ok s2 is a Circle
public class Shape { private String color; private int xPosition; private int yPosition; Shapes() // constructor { // do something constructor-like } // methods } Inheritance code for Shape parent classes are no different from any classes we have written.
public class Circle extends Shape { private int diameter; Circle() { super(); // Shapes ctor // more constructor stuff } // other Circle methods } Inheritance code for Circle inheritance is implement with “extends” Must call parent constructor as first line of subclass constructor
Superclass constructor call • Subclass constructors must always contain a 'super' call. • If none is written, the compiler inserts one (without parameters) • works only, if the superclass has a constructor without parameters • Must be the first statement in the subclass constructor.
arrow with open head means inherits from Shapes Don't try this at home: Shapes inheritance is natural, but doesn't work well with what we know now. One problem: Circle cannot access private fields of Shape (like xPosition), so cannot draw itself. But Shape doesn't know enough about Circles to draw it. So, draw() can’t be in Circle or Shape, so circles can't be drawn (one solution is to write an accessor that makes xPosition and yPosition available to Circle, but not general public. Chapter 9 (protected) ).
Inheritance: what do we know? • extends // used in subclass • superclass has no indication inheritance is being used • super() // calls constructor of superclass • must be first statement of subclass
Book Example: DoME "Database of Multimedia Entertainment" • stores details about CDs and videos • CD: title, artist, # tracks, playing time, got-it, comment • Video: title, director, playing time, got-it, comment • allows (later) to search for information or print lists This and the next 10 slides are from OBWJ instructor web page.
Subclasses public class CD extends Item { private String artist; private int numberOfTracks; // constructors and methods omitted. } public class Video extends Item { private String director; // constructors and methods omitted. }
Inheritance and constructors public class Item { private String title; private int playingTime; private boolean gotIt; private String comment; /** * Initialise the fields of the item. */ public Item(String theTitle, int time) { title = theTitle; playingTime = time; gotIt = false; comment = ""; } // methods omitted }
Inheritance and constructors public class CD extends Item { private String artist; private int numberOfTracks; /** * Constructor for objects of class CD */ public CD(String theTitle, StringtheArtist, int tracks, int time) { super(theTitle, time); artist = theArtist; numberOfTracks = tracks; } // methods omitted }
Database source code public class Database { private ArrayList items; /** * Construct an empty Database. */ public Database() { items = new ArrayList(); } /** * Add an item to the database. */ public void addItem(Item theItem) { items.add(theItem); } ... } otherwise would have one addItem for CDs, one for videos (that's how original is)
Subtyping and parameter passing public class Database { public void addItem(Item theItem) { ... } } Video video = new Video(...); CD cd = new CD(...); database.addItem(video); database.addItem(cd); subclass objects may be passed to superclass parameters
Class diagram with inheritance Much cleaner. subtyping takes care of different types.
Polymorphic variables • Object variables in Java are polymorphic.(They can hold objects of more than one type.) • They can hold objects of the declared type, or of subtypes of the declared type.
The Object class All classes inherit from Object.
Polymorphic collections • All collections are polymorphic. • The elements are of type Object.public void add(Object element)public Object get(int index)
Practice 8.11: Assume we have 4 classes: Person, Teacher, Student and PhDStudent. Teacher and Student are both subclasses of Person. PhDStudent is a subclass of Student. Which of the following are legal and why? Person p1 = new Student( ); Person p2 = new PhDStudent( ); PhDStudent phd1 = new Student ( ); Teacher t1 = new Person( ); Student s1 = new PhDStudent( ); s1 = p1; s1 = p2; p1 = s1; t1 = s1; s1 = phd1; phd1 = s1;
Practice 2 8.17 Look at the code below. You have four classes (O, X, T and M) and a variable of each of these. O o; X x; T t; M m; The following assignments are all legal: m = t; m = x; o = t; The following assignment are all illegal: o = m; o = x; x = o; What can you say about the relationships of these classes?