Inheritance, part 3 Method overriding

COMP 401, Spring 2013 Lecture 10 2/12/2013 Subclassing So Far

• A subclass inherits implementaon details from its superclass – Fields • Direct access to public and protected fields • No direct access to private fields – Methods • Access to public and protected methods • No access to private methods • Subclass constructors – Should call superclass constructor with super() as first line. • Or, chain to a different constructor • Or, rely on implicit call to super() constructor with no parameters. Subclass Method Polymorphism

• Subclass can overload methods in superclass. – Remember, overloading is providing a different version of an exisng method. • An example of polymorphism • Method signature is different in some way. – lec10.v1 Overriding Methods

• A subclass can “override” a super class method by providing its own definion. – Method signature must be the same. – Original method is visible from subclass • i.e., public, protected, or package-level access • lec10.v2 @Override direcve

• So what’s with the funny “@Override” line that Eclipse includes when generang a stub? – Known as a compiler “direcve”. • Completely oponal, but useful – Indicates that the method is intended to override a superclass method. • Compiler will complain if it does not detect a visible superclass method with the same method signature. • Helpful when you misspell a method name or aempt to override a method not visible to the subclass. • lec10.v3 Class Polymorphism • Previously introduced the idea of “is-a” relaonships – Between a class and interfaces implemented. – Between a class and its superclass hierarchy. • This is also an example of polymorphism – Covariance • Treang an instance of a subclass as a reference typed as the parent class. • This can be typed checked at compile type. – Contravariance • Treang a reference typed as the parent class as an instance of a subclass. • Contravariance can not be type checked in advance at compile me. • Fails if the object is actually “invariant” with respect to the subclass. • lec10.v4, lec10.v4main – Also demonstrates protected base class constructor A Covariant Conundrum

• Problem: class A {! public int m() {return 0;}! – What should happen when }! ! an overriden method is class B extends A {! called on a covariant public int m() {return 1;}! }! reference? ! class C extends B { ! public int m() {return 2;}! C c_obj = new C();! }! B b_obj = (B) c_obj;! A a_obj = (A) c_obj;! ! System.out.println(c_obj.m());! What should these System.out.println(b_obj.m());! lines print? System.out.println(a_obj.m());! Soluon 1: Non-virtual methods

class A {! • Let type of reference public int m() {return 0;}! }! dictate which method ! class B extends A {! definion is used. public int m() {return 1;}! }! ! class C extends B { ! public int m() {return 2;}! C c_obj = new C();! }! B b_obj = (B) c_obj;! A a_obj = (A) c_obj;! ! System.out.println(c_obj.m());! These lines print: System.out.println(b_obj.m());! 2 System.out.println(a_obj.m());! 1 0 Soluon 2: Virtual methods

class A {! • Use method defined by public int m() {return 0;}! }! actual type of object. ! class B extends A {! public int m() {return 1;}! }! ! class C extends B { ! public int m() {return 2;}! C c_obj = new C();! }! B b_obj = (B) c_obj;! A a_obj = (A) c_obj;! ! System.out.println(c_obj.m());! These lines print: System.out.println(b_obj.m());! 2 System.out.println(a_obj.m());! 2 2 Virtual Methods

• Different OOP languages choose to solve this problem in different ways. – C++, C# • Default is non-virtual soluon. • Programmer can force virtual soluon by marking a method with a special “virtual” keyword – Java • Methods are always virtual. • No special keyword needed. • lec10.v5 A virtual problem

• Drawback to the “always virtual” approach. – Consider the situaon in which a subclass just needs a method to “do just a lile more”. • In other words, wants to execute a method as defined in the superclass and then tweak the result. • Or maybe do something in advance of execung a method as defined in the superclass. – Because methods are always virtual, casng this reference to superclass in order to get to method as defined by the superclass won’t work. • lec10.v6 It’s a bird, it’s a plane, it’s…

• … the super keyword. • The super keyword provides exactly this ability to invoke methods on an instance as it is understood at the superclass. • lec10.v7 Whence inheritance

• Related classes with common internals – Note, not just common behavior • Specializaon aer the fact of exisng classes Assignment 3

• Assignment 3 is posted.