CS62 - Fall 2020 - Class 2

Example code in this lecture

   Inheritance

Lecture notes

  • inheritance
       - we can build a new class that is an extension of another class
       - the original class is said to be the superclass (or parent class) and the new class the subclass (or child class)
       - to do this, in the class header, you use the keyword "extends", e.g.

          public class B extends A{
             ...
          }

       - the subclass:
          - inherits all public methods from the superclass
             - e.g. given an object of type B, we can call any method that A had on B
          - can access any instance variables that are declared public *or* protected
          - can call any methods that are declared as public *or* protected
       - additions in the subclass
          - you can then add any additional instance variables and methods in the subclass
             - these will be available normally in the subclass, but NOT in the superclass
          - if you define a method with the same "signature" as in the superclass, it will override it

  • protected
       - labeling a variable as protected allows the child class to access that variable, but no other classes
       - labeling a method as protected allows the child class to access those methods, but no other classes


  • the Java class hierarchy
       - *everything* in Java is a subclass of some class (except for 1 class in Java)
       - you can only inherit from one class
       - if you don't inherit from a class, by default, you inherit from the class Object
       - You can see the object hierarchy at: https://docs.oracle.com/javase/8/docs/api/java/lang/package-tree.html


  • Look at Inheritance code
       - We have a class called A that has a private and protected instance variables
       - Two public methods
       - B is a class that inherits from A
          - we indicate this with the keyword "extends"
       - B has all of the instance variables of A
          - however, it can only access those that are protected or public
          - in the resetInt method, we can access number
          - if we tried to access the text variable, we would get an error

  • super
       - if the superclass has a constructor that has parameters, then it needs information to be constructed
       - when a subclass extends a superclass, it, in essence, has a version of the superclass nested inside of it
       - because of this, when constructing the subclass, the superclass also need to be constructed
       - to call the superclass's construct, you use the keyword "super"
       - it has to be the *first* thing that happens in the constructor of the sublcass

  • Variable type
       - the type of a variable defines what methods we can call on the associated object:

          A blah = ...;

          // some code

          // What methods can I call on blah?
          - only the public methods of A

       - Why is it ok to assign a B object to a variable of type A?
          - A blah = new B(...);

          - What methods can we call on blah?
             - only the public methods of A?
          - Does B have all of those methods?
             - Yes!
          - Will they have the same functionality as A's public methods?
             - not if B overrode them, i.e., wrote a method with the same type signature

  • types
       - an A object is of type A
       - a B object is of type B
       - a B object can also of type A! (remember it has an A inside it and all of the functionality of an A)
       - For example, the following are all legal:
          A temp = new A(10, "blah");
          B temp = new B(10, "blah");
          A temp = new B(10, "blah");
       
          - but the following is not:
          B temp = new A(10, "blah");

  • look at the test method in the B class in Inheritance code
       - What will be printed out when we run it?
          10
          0
          10
       - notice that the B class inherits all of the public methods from the A class
          - specifically, we call the getNumber method and it gets the method description from the A class
       - also note that even though we do not have any instance variables declared, we inherit all the instance variables from A (number and text)
       - If we tried to call the resetInt method on an A object, it won't work!

  • look at test2
       - What will be printed out?
          test
       - We've declared a variable of type A, why can we assign a B object to it?
          - All B object have the A methods!
       - Why can't we can't the resetInt method?
          - Even though it's a B object (and we know it), the Java compiler can't guarantee it:
             For example:

             A a;

             if( rand.randInt(2) == 1 ){
                a = new A(10, "test");
             }else{
                a = new B(10, "test");
             }

             // we have no idea if a references an A or a B!