> For the complete documentation index, see [llms.txt](https://peterlulu666.gitbook.io/tek-system-java-developer/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://peterlulu666.gitbook.io/tek-system-java-developer/week-3/lab/inheritance-and-object-type-casting.md).

# Inheritance and Object Type Casting

Lab Overview:

In this lab, we will demonstrate how to use Object type-casting and inheritance using Java.

Instructions:

Here is a more in-depth example of inheritance with type-casting. Consider the following classes:

Create a class named `Person`, and write the code below.

```java
public class Person {
   String         name;
   static int     lifeSpan = 60;
   static double  ageFactor = 1.0;

   public Person() {
       name = "";
   }
   public Person(String aName) {
       name = aName;
   }
   public String getName() { return name; }
   public void setName(String aName) { name = aName; }
   public String toString() {
       return("Hello, my name is " + name);
   }
   public String talk() {
       return("I have nothing to say.");
   }
   public String walk() {
       return("I have nowhere to go.");
   }
   public static double lifeSpan() {
       return(lifeSpan * ageFactor);
   }
}

```

Create a class named `Boy`, and write the code below.

```java
public class Boy extends Person {
   static double   ageFactor = 1.1;

   public String talk() {
       return(super.talk() + " ... but I love Java class.");
   }
   public String walk() {
       return("I am now walking");
   }
}

```

Create a class named `Girl`, and write the code below.

```java
public class Girl extends Person {
   static double   ageFactor = 1.3;
   public Girl(String aName) {
       name = "Ms." + aName;
   }

   public String talk() {
       return("Hello! " + jump());
   }
   public String jump() {
       return("I am jumping.");
   }
   public static double lifeSpan() {
       return(lifeSpan * ageFactor);
   }
}

```

Create a class named `TestPeople`, and write the code below

```java
public class TestPeople {
   public static void main(String args[]) {
       Person aPerson;
       Boy jimmy;
       Girl betty;
       aPerson = new Person("Fred");
       jimmy = new Boy();
       betty = new Girl("Betty");

       // Boy b = new Person();  // Throw Error
       // Girl g = new Person()  // Throw Error

       System.out.println(aPerson);
       System.out.println(aPerson.talk());
       System.out.println(aPerson.walk());
       System.out.println();

       System.out.println(jimmy);
       System.out.println(jimmy.talk());
       System.out.println(jimmy.walk());
       System.out.println();

       System.out.println(betty);
       System.out.println(betty.talk());
       System.out.println(betty.walk());
       System.out.println();

       System.out.println((Person)jimmy);
       System.out.println(((Person)jimmy).talk());
       System.out.println(((Person)jimmy).walk());
       System.out.println();

       System.out.println((Person)betty);
       System.out.println(((Person)betty).talk());
       System.out.println(((Person)betty).walk());
       System.out.println();

       System.out.println(Person.lifeSpan());
       System.out.println(Boy.lifeSpan());
       System.out.println(Girl.lifeSpan());

       System.out.println(((Boy)aPerson).talk());
   }
}

```

Output:

```
Hello, my name is Fred.
I have nothing to say.
I have nowhere to go.

Hello, my name is
I have nothing to say... but I love Java class.
I am now walking.

Hello, my name is Ms.Betty.
Hello! I am jumping.
I have nowhere to go.

Hello, my name is
I have nothing to say... but I love Java class.
I am now walking.

Hello, my name is Ms.Betty
Hello! I am jumping.
I have nowhere to go.

60.0
60.0
78.0

Exception in thread "main" java.lang.ClassCastException: objectTypeCasting.Person cannot be cast to objectTypeCasting.Boy
	at objectTypeCasting.TestPeople.main(TestPeople.java:44)

```

The `lifespan()` method did not work in the way expected. That is because for class methods, method look-ups occur at compile time. The `lifeSpan()` method in the `Person` class is used by both the `Boy` and `Person` classes. In this case, since the method is static and is declared in the `Person` class, the `ageFactor` from the `Person` class is used. However, the `Girl` class has its own `lifeSpan()` method, so the `ageFactor` within the `Girl` class is used in that case.&#x20;

{% file src="/files/5TXBk9LAlyUb5La6Y9VV" %}
