Subclasses Jan 14 2019 Composition The most common way to use one class within another is composition just have a variable of that type Examples class LunarLanderGame LunarLander lander new LunarLander class MaxPlayer String name String is a class Game game Game is a class Composition is suitable when one class is composed of objects from another class or needs frequent reference to objects of another class 2 Composition vs Inheritance Inheritance is appropriate when one class is a special case of another class Example 1 Example 2 class Animal class Dog extends Animal class Cat extends Animal class Player class ComputerPlayer extends Player class HumanPlayer extends Player Use inheritance only when one class clearly specializes another class and should have all the features of that superclass Use composition in all other cases 3 Inheritance class Animal int row column will be inherited private Model model inherited but inaccessible Animal cannot be inherited void move int direction will be inherited class Rabbit extends Animal inherits row column move but not constructor model really is inherited but you can t access it int distanceToEdge new variable not inherited int hideBehindBush new method not inherited 4 Assignment A member of a subclass is a member of the original class a rabbit is an animal Animal animalBehindBush Rabbit myRabbit animalBehindBush myRabbit perfectly legal myRabbit animalBehindBush not legal myRabbit Rabbit animalBehindBush legal syntax but requires a runtime check 5 Assignment II animalBehindBush myRabbit is legal but why int NUMBER OF ANIMALS 8 Animal animals new Animal NUMBER OF ANIMALS animals 0 new Rabbit animals 1 new Seagull animals 2 new Snail for int i 0 i NUMBER OF ANIMALS i animals i move legal if defined in Animal 6 Assignment III From previous slide for int i 0 i NUMBER OR ANIMALS i animals i allowMove legal if defined in Animal But for int i 0 i NUMBER OR ANIMALS i if animals i instanceof Rabbit Rabbit animals i tryToHide Here tryToHide is defined only for rabbits We must check whether animals i is a rabbit We must cast animals i to Rabbit before Java will allow us to call a method that does not apply to all Animals After the if test you might think Java knows that animals i is a Rabbit but it doesn t 7 Arrays of Objects When you declare an array you must specify the type of its elements Animal animals However Object is a type so you can say Object things declaration things new Object 100 definition You can put any Object in this array things 0 new Fox But before Java 5 you cannot do this things 1 5 why not 8 Wrappers Each kind of primitive has a corresponding wrapper or envelope object byte short int long char boolean float double Byte Short Integer not Int Long Character not Char Boolean Float Double 9 Wrapper constructors Each kind of wrapper has at least one constructor Byte byteWrapper new Short shortWrapper new Integer intWrapper new Long longWrapper new Character charWrapper value Boolean booleanWrapper value Float floatWrapper new Double doubleWrapper Byte byte value Short short value Integer int value Long long value new Character char new Boolean boolean Float float value new Double double value 10 More wrapper constructors Every wrapper type except Character has a constructor that takes a String as an argument Example Boolean b new Boolean true The constructors for the numeric types can throw a NumberFormatException Example Integer i new Integer Hello 11 Wrapper deconstructors You can retrieve the values from wrapper objects byte by byteWrapper byteValue short s shortWrapper shortValue int i intWrapper intValue long l longWrapper longValue char c charWrapper charValue boolean bo booleanWrapper booleanValue float f floatWrapper floatValue double d doubleWrapper doubleValue 12 Additional wrapper methods Wrapper classes have other interesting features variables Integer MAX VALUE 2147483647 methods Integer toHexString number anyType toString 13 Back to arrays Why bother with wrappers Object things new Object 100 Prior to Java 5 you cannot do this things 1 5 But you can do this things 1 new Integer 5 You cannot do this int number things 1 But you can do this int number Integer things 1 intValue 14 Auto boxing and auto unboxing Since version 5 Java will automatically box wrap primitives when necessary and unbox unwrap wrapped primitives when necessary You can now do the following where things is an array of Object things 1 5 instead of things 1 new Integer 5 int number Integer things 1 instead of int number Integer things 1 intValue but not int number int things 1 15 equals and other methods Some methods such as equals take an Object parameter Example if myString equals abc JUnit s assertEquals expected actual also takes objects as arguments Auto boxing and unboxing while convenient can lead to some strange problems Integer foo new Integer 5 Integer bar new Integer 5 Now foo 5 is true bar 5 is true foo equals bar is true foo equals 5 is true foo bar is false 16 Types and values A variable has both a type and a value Consider Animal animal The type of variable animal is Animal The type of a variable never changes The syntax checker can only know about the type The value of animal might sometimes be a rabbit and at other times be a fox Messages such as animal run are sent to the value The value object determines which method to use 17 Sending messages Java must ensure that every message is legal That is the object receiving the message must have a corresponding method But when the Java compiler checks syntax it can t know what the value of a variable will be it has to depend on the type of the variable If the variable is of type T then either Class T must define an appropriate method or Class T must inherit an appropriate method from a superclass or Class T must implement an interface that declares an appropriate method 18 Overriding methods class Animal int decideMove return Model STAY class Rabbit extends Animal override decideMove int decideMove same signature return random Model MIN DIRECTION Model MAX DIRECTION 19 Overriding methods II When you override a method You must have the exact same signature Otherwise you are just overloading the method and both versions of the method are available When you override a method you cannot make it more private In this example Animal defines a method Every subclass of Animal must inherit that method including subclasses of subclasses Making a method more private would defeat inheritance 20 Some
View Full Document
Unlocking...