390 likes | 392 Vues
COMP 110: Introduction to Programming. Tyler Johnson Apr 8, 2009 MWF 11:00AM-12:15PM Sitterson 014. Announcements. Lab 8 is due tomorrow by midnight. Questions?. Today in COMP 110. Go over Program 4 More Inheritance Programming Demo. Program 4. Inheritance. Section 8.3 in text.
E N D
COMP 110:Introduction to Programming Tyler Johnson Apr 8, 2009 MWF 11:00AM-12:15PM Sitterson 014
Announcements • Lab 8 is due tomorrow by midnight
Today in COMP 110 • Go over Program 4 • More Inheritance • Programming Demo
Inheritance • Section 8.3 in text
Inheritance • Define a general class • Later, define specialized classes based on the general class • These specialized classes inherit properties from the general class
Inheritance Hierarchies • Put these classes into an inheritance hierarchy Crocodile Human Reptile Animal Mammal Whale Animal Reptile Mammal Crocodile Human Whale
The is-a relationship • This inheritance relationship is known as an is-a relationship • A Doctoral student is a Grad student • A Grad student is a Student • A Student is a Person • Is a Person a Student? • Not necessarily!
When to Use Inheritance • Use inheritance when an is-a relationship is present • A Student is a Person, Student inherits from Person • Do not confuse an is-a relationship with a has-a relationship • A Student has a date of enrollment, so an object of class Date should be an instance variable of the Student class, and should not inherit from it
The Keyword extends public classDerived_Class_NameextendsBase_Class_Name { Declaration_of_Added_Instance_Variables Definitions_of_Added_And_Overridden_Methods } public class Student extends Person { // stuff goes here } • A derived (child) class inherits the public instance variables and public methods of its base (parent) class
public class Person { // ... public void printInfo() { System.out.println("Name: " + name); } } public class Student extends Person { // ... public void printInfo() { System.out.println("Name: " + getName()); System.out.println("ID: " + getID()); } } Method Overriding Overridden • The printInfo method in the class Student overrides the printInfo method inherited from the class Person
Overriding Methods • Java handles this situation as follows: • If a derived class defines a method with the same name, number and types of parameters, and return type as a method in the base class, the derived class’ method overrides the base class’ method • The method definition in the derived class is the one that is used for objects of the derived class
Overriding Methods • Why is it useful? • You often want derived classes to perform custom behavior public class Circle extends Shape { public void draw(Graphics g) { g.drawOval(…arguments…); } } public class Shape { public void draw(Graphics g) { } } public class Rectangle extends Shape { public void draw(Graphics g) { g.drawRect(…arguments…); } }
The Keyword super • Last time we saw that the keyword super could be used to invoke the constructor of the base class public class Student extends Person { private int id; public Student() { super(); id = -1; } } public class Person { private String name; public Person() { name = "No name yet"; } } Student student = new Student(); //name is set to No name yet, and id is set to -1
The Keyword super • The use of super must always be the first action taken in the constructor • Not required to be specified, but if it is, it must come first • Java will automatically call the default constructor of the base class if super is not specified Equivalent public Student() { super(); id = -1; } public Student() { id = -1; } public Student() { id = -1; super(); } OK OK ERROR
The Keyword super • You cannot use repeated supers • If specified, specify only once public Student() { super(); super("No name yet"); id = -1; } public Student() { super(); id = -1; } OK ERROR
The Keyword super • What if the base class is a derived class? public class Student extends Person { private int id; public Student() { super(); id = -1; } } public class Person { private String name; public Person() { name = "No name yet"; } } public class Undergraduate extends Student { privateint level; public Undergraduate() { super(); //calls constructor of Student, not Person level = -1; } }
public class Person { // ... public void printInfo() { System.out.println("Name: " + name); } } public class Student extends Person { // ... public void printInfo() { System.out.println("Name: " + getName()); System.out.println("ID: " + getID()); } } Method Overriding Overridden • Is there a way to call the printInfo() method of the class Person from within the class Student? • Yes
Calling Overridden Methods public class Person { // ... public void printInfo() { System.out.println("Name: " + name); } } public class Student extends Person { // ... public void printInfo() { super.printInfo(); System.out.println("ID: " + getID()); } } • The keyword super can also be used to call overridden methods of a base class
Inheritance and Overloading public class Person { private String name; public void setData(String newName) { name = newName; } } public class Student extends Person { private int id; public void setData(String newName, int newID) { setData(newName); id = newID; } Overloaded • Methods with a different number or type of parameters are overloaded, not overridden
Type Compatibilities Given this inheritance heirarchy… Person Athlete HighJumper ExtremeAthlete Skydiver XGamesSkater
Is This Code Legal? Person p = new Person(); Yes! Person Athlete HighJumper ExtremeAthlete Skydiver XGamesSkater
Is This Code Legal? HighJumper h = new HighJumper(); Yes! Person Athlete HighJumper ExtremeAthlete Skydiver XGamesSkater
Is This Code Legal? Person p = new Athlete(); Yes! An Athlete is a Person, so this is okay Person Athlete HighJumper ExtremeAthlete Skydiver XGamesSkater
Is This Code Legal? Person p = new SkyDiver(); Yes! A SkyDiver is a Person, so this is okay Person Athlete HighJumper ExtremeAthlete Skydiver XGamesSkater
Is This Code Legal? Skydiver s = new Person(); No! A Person is not necessarily a Skydiver, so this is illegal Person Athlete HighJumper ExtremeAthlete Skydiver XGamesSkater
Is This Code Legal? Athlete ath = new Athlete();XGamesSkater xgs = ath; No! An Athlete is not necessarily an XGamesSkater, so this is illegal Person Athlete HighJumper ExtremeAthlete Skydiver XGamesSkater
Dynamic Binding Person person = new Person("John Smith"); person.printlnfo(); //calls printInfo of Person class Student student = new Student("John Smith", 42352352); student.printlnfo(); //calls printInfo of Student class Person p = new Student(“Tom Jones", 733234242); p.printInfo(); //which printInfo method is called? The printInfo method of the Student class is called because p is really a student!
The Operator instanceof • We can test whether an object is of a certain class type using the instanceof operator: public void objectType(Person p) { if(p instanceof Student) { System.out.println("p is an instance of the class Student"); } else if(p instanceof GradStudent) { System.out.println("p is an instance of the class GradStudent"); } … } • Syntax: objectinstanceofClass_Name
The Class Object • Every class in Java is derived from the class Object • Every class in Java is an Object Object Person Animal Student Employee Reptile Mammal Crocodile Human Whale
The Class Object • The Java class Object provides methods that are inherited by every class • For example • equals, toString • These methods should be overridden with methods appropriate for the classes you create
Printing Objects to Screen • The method println is overloaded to accept objects as an argument • System.out.println(int i) • System.out.println(double d) • System.out.println(Object o) • When printing an object with System.out.println(Object o), the object’s toString() method is called and the result is printed public void println(Object o) { System.out.println(o.toString()); //dynamic binding }
Overriding toString public class Person { private String name; public Person() { name = "No name yet"; } public void setName(String newName) { name = newName; } //converts a Person object to a String, overrides toString in the class Object public String toString() { return"Name: " + name + "\n"; } public static void main(String[] args) { Person person = new Person(); person.setName("John Smith"); System.out.println(person); //prints "Name: John Smith" to screen (without quotes) } }
Overriding toString public class Student extends Person { privateint id; public Student() { super(); id = -1; } public void setID(String newName) { name = newName; } //converts a Person object to a String, overrides toString in the class Person public String toString() { return"Name: " + name + "\nID: " + id + "\n"; } public static void main(String[] args) { Student student = new Student(); student.setName("John Smith"); student.setID(342652342); System.out.println(student); //prints "Name: John Smith" // "ID: 342652342" to screen (without quotes) } }
Programming Demo • Programming with inheritance • Sports • Define the following classes Person Athlete HighJumper ExtremeAthlete Skydiver XGamesSkater
Sports • Each class has a method called jump • Simply prints a message to screen • Person • System.out.println("Whee!"); • Athlete • System.out.println("I jump well!"); • ExtremeAthlete • System.out.println("EXTREMEEEEEEEEEE JUMP!"); • HighJumper • System.out.println("I jump REALLY HIGH!"); • ShotPutter • System.out.println("I don't jump very much."); • XGamesSkater • System.out.println("360 nollie to frontside air");
Sports • Write a class called Sports that demonstrates • Type compatibility • Dynamic binding • instanceof operator
Friday • No recitation, enjoy the Holidays