Inheritance, part 3 Method overriding
COMP 401, Spring 2013 Lecture 10 2/12/2013 Subclassing So Far
• A subclass inherits implementa on 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 exis ng 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 defini on. – Method signature must be the same. – Original method is visible from subclass • i.e., public, protected, or package-level access • lec10.v2 @Override direc ve
• So what’s with the funny “@Override” line that Eclipse includes when genera ng a stub? – Known as a compiler “direc ve”. • Completely op onal, 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 a empt to override a method not visible to the subclass. • lec10.v3 Class Polymorphism • Previously introduced the idea of “is-a” rela onships – Between a class and interfaces implemented. – Between a class and its superclass hierarchy. • This is also an example of polymorphism – Covariance • Trea ng an instance of a subclass as a reference typed as the parent class. • This can be typed checked at compile type. – Contravariance • Trea ng 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());! Solu on 1: Non-virtual methods
class A {! • Let type of reference public int m() {return 0;}! }! dictate which method ! class B extends A {! defini on 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 Solu on 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 solu on. • Programmer can force virtual solu on 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 situa on in which a subclass just needs a method to “do just a li le 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 execu ng a method as defined in the superclass. – Because methods are always virtual, cas ng 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 • Specializa on a er the fact of exis ng classes Assignment 3
• Assignment 3 is posted.