Post

Extends, Overriding

โœ… Extends

  • if extends, extends the field and method of parent class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Car {
    public void move(){}
}

public class GasCar extends Car{
    public void fillGas(){}

}

public class ElectricCar extends Car{
    public void charge(){}

}

public class CarMain {
    public static void main(String[] args) {
    ElectricCar electricCar = new ElectricCar()
    electricCar.charge();
    electricCar.move(); //electricCar can move(parent car class)
    }
}
  • ๐Ÿ‘๐Ÿป if I want to add openDoor() to all cars, just add to Car class
    • as both GasCar and ElectricCar extends Cars, can easily add field, methods
  • ๐Ÿ‘๐Ÿป save code repetition
    • move() can be called both in GasCar, ElectricCar

โœ… Extends and memory

  • 1๏ธโƒฃ when child class extending a parent class is created, in memory, both child and parent class is made
  • Electric car class extends the Car class
  • when ElectricCar electricCar = newElectricCar();
  • in memory, it looks like this

Image

  • When method is called
  • 2๏ธโƒฃ first find in created instance type
    • if ElectricCar electricCar = new ElectricCar();, look in ElectricCar
  • 3๏ธโƒฃ if method does not exist,
  • look in extends parent type, look in Car
  • if method does not exist in any parent, compile error
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Car {
    public void move(){}
}

public class ElectricCar extends Car{
    public void charge(){}

}

public class CarMain {
    public static void main(String[] args) {
    ElectricCar electricCar = new ElectricCar();
    electricCar.charge();
    electricCar.move();
    }
}
  • โœ”๏ธ call method electricCar.charge();
  • in ElectricCar electricCar = new ElectricCar();, there is both Car and Electric car
  • ElectricCar๊ฐ”๋”๋‹ˆ Car๋„ ์žˆ๊ณ  Electric car๋„ ์žˆ์Œ
  • look in ElectricCar first
  • bc electricCar type is ElectricCar, find ElectricCar first
  • ์•„ ๋‚˜๋Š” electricCar ํƒ€์ž…์ด๋„ค. electricCar ๋จผ์ € ์ฐพ์Œ

  • โœ”๏ธ call method electricCar.move();
  • look in ElectricCar first
  • ๋‚˜๋Š” electricCar type์ด๋‹ˆ๊นŒ electricCar๋จผ์ € ์ฐพ์•˜๋Š”๋ฐ, move()์—†์Œ
  • method move() does not exist
  • look in Car(parent class) next
  • ๊ทธ๋Ÿฌ๋ฉด ๋ถ€๋ชจ ํด๋ž˜์Šค Car์ฐพ์Œ

โœ… Extends and overriding

  • child class can override parent class method and recreate a new method
1
2
3
4
5
6
7
8
public class Car { //parent
    public void move(){}
}

public class ElectricCar extends Car { //child
    @Override
    public void move(){} //override
}

Image

  • โœ”๏ธ call method electricCar.move();
  • electricCar type is ElectricCar, find ElectricCar first
  • there is move() in ElectricCar
  • does not find parent class for move()
  • โญ๏ธ ์ž์‹ ํด๋ž˜์Šค์—์„œ field/method ์ฐพ์•˜์œผ๋‹ˆ๊นŒ ๋ถ€๋ชจ ํด๋ž˜์Šค๊นŒ์ง€ ์ฐพ์ง€ ์•Š์Œ
  • โ“ field/method ์ด๋ฆ„์ด ๊ฐ™์•„๋„ ๋ถ€๋ชจ ํด๋ž˜์Šค ์ฐธ์กฐํ•˜๊ณ  ์‹ถ์œผ๋ฉด? โžก๏ธ super

Overriding ๐Ÿ†š Overloading

  • Overloading: create several method with same method name, different parameter
  • Overriding: in extends relationship, child class recreates parent method

โœ… Overriding conditions

  • same method name
  • same parameter
  • same return value
  • broader access modifier
  • static โŒ : method overriding takes place in heap area of memory
    • static is in method area of memory
  • final โŒ : final means method cannot be altered, thus cannot override
  • private โŒ : private means only accessible in same class, cannot be accessed in child class
  • constuctor is not overrideable

โœ… Overriding and protected

  • public
  • protected: same package, allow extends in different package
  • default: same package
  • private: same class

  • Parent private field and method can NOT be used by child
  • Parent defaut field and method can be used only if parent and child are in same package
  • Parent protected field and method can be used even if parent and child are in different package

  • If parent and child are in different packageโ€ฆ
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Parent {
    public int publicValue;
    protected int protectedValue;
    int defaultValue;
    private int privateValue;
}

public class Child extends Parent{
    publicValue = 1;
    protectedValue = 2; //even if different package, extends can use protected field
    //defaultValue //only same package
    //privateValue
}

โœ… Super

  • when child class @Override parent class, child field/method will be used
  • however, if child class wants to use parent class field/method, use super
  • super: in same field/method name of child/parent class, use parent class
1
2
3
4
5
public class Parent {
    public String value = "parent"; //same field name

    public void hello(){} //same method name
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Child extends Parent{ //extends parent
    public String value = "child"; //same field name

    @Override
    public void hello(){} //same method name โžก๏ธ override

    public void call(){
        System.out.println("this.value= " + this.value); //find in my class(child)
        System.out.println("super.value= " + super.value); //โœ”๏ธ find in parent

        this.hello(); //find in my class(child)
        super.hello(); //โœ”๏ธ find in parent
    }
}

โœ… Super and Constructor

  • when create child instance, both child instance and parent instance is created
  • in child constructor, calls parent constructor with super
  • โญ๏ธ order: parent โžก๏ธ child
    • classA
    • classB extends classA
    • classC extends classB
    • order: classA โžก๏ธ classB โžก๏ธ classC
    • ๊ฒฐ๋ก : ์ƒ์† ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ ์ž์‹๋งŒ ์ƒ์„ฑํ•ด๋„ ํ•ญ์ƒ ๋ถ€๋ชจ๊ฐ€ ์ƒ์„ฑ๋˜๋Š”๋ฐ, ์ˆœ์„œ๋Š” ๋ถ€๋ชจ๊ฐ€ ๋จผ์ € ์ƒ์„ฑ์ด ๋˜๊ณ , ์ž์‹์ด ์ƒ์„ฑ๋œ๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ClassA {
    public ClassA() { //classA constructor //3๏ธโƒฃ
        System.out.println("class A constructor"); //4๏ธโƒฃ
    }
}

public class ClassB extends ClassA{
    public ClassB(int a, int b){ //classB constructor
        super(); //call parent classA constructor //2๏ธโƒฃ
        System.out.println("Class B constructor a= " + a + " b= "+ b); //5๏ธโƒฃ
    }
}

public class ClassC extends ClassB{
    public ClassC(int a, int b) { //classC constructor
        super(a, b); //call parent classB constructor //1๏ธโƒฃ
        System.out.println("Class c constructor"); //6๏ธโƒฃ
    }
}
  • โœ”๏ธ Result
1
2
3
class A constructor
Class B constructor a= 7 b= 1
Class c constructor

โœ…

This post is licensed under CC BY 4.0 by the author.