-
다형성
참조변수를 통한 객체 접근
-클래스로부터 객체를 생성하고 생성된 객체의 주소 값을 참조 변수에 넣어 줄 때 참조 변수의 타입에 따라 생성된 객체에 접근할 수 있는 영역은 달라진다.
Overriding
-부모 클래스가 가지고 있는 메서드를 자식 클래스에서 다시 구현한 것을 가르킨다.
-메서드를 Overriding을 하고 부모 클래스의 메서드를 호출 하고자 할 때는 super를 이용한다.
참조변수의 활용
-부모 클래스형 참조 변수를 통해 객체에 접근하면 부모 클래스의 영역에 접근을 하지만 호출하려는 메서드가 Overriding된 경우에는 자식 클래스에서 재 정의한 메서드가 호출이 된다.
참조변수는 하나의 틀이고 객체는 실제 안에 들어가는 내용물이라고 생각하면 될 것같다.
틀에 없는 내용물은 들어가지 못한다. 하지만 틀에 정의되어 있으면 그 틀 안에 실제 내용물(객체, 오버라이딩 된 메서드등)이 들어간다.
메인
public class PolyTest { public static void main(String[] args) { // TODO Auto-generated method stub Class1 c1 = new Class1(); SuperClass super1 = new Class1();//참조변수는 부모로, 객체생성은 자식 클래스로 선언 //생성자 관련해서 : 생성자가 있다면 객체를 생성만 해줘도 생성자가 실행된다. //Class1은 SuperClass를 상속받고 있으므로 SuperClass의 생성자가 실행이 된다. //자식 클래스에도 생성자가 있을 경우 먼저 부모클래스의 생성자를 호출하고, //자식클래스의 생성자를 호출한다. System.out.println("---------------"); //부모클래스에 있는 변수와 메서드를 사용할 때 //Class1은 SuperClass를 상속받고 있으므로 부모 클래스의 변수와 메서드를 사용할 수 있다.(제한자에 따라 다를 수 있다.) c1.superV1 = 100; c1.superMethod(); super1.superV1 = 200; super1.superMethod(); System.out.println("--------------"); //자식클래스에 있는 변수와 메서드를 사용할 때 c1.class1V1 = 300;//c1은 참조변수 객체변수 모두 Class1이므로 당연히 가능 c1.class1Method(); //클래스1로 객체 생성을 했지만 참조변수로 부모 클래스 형을 받은 경우 // super1.class1V1 = 400; // super1.classMethod(); //에러가 발생한다. //객체는 객체를 생성할 때 사용한 클래스는 클래스 1이지만 //해당 객체의 주소값을 담고 있는 참조변수가 부모클래스형 참조변수기 때문에 //접근할 수 있는 영역은 부모클래스의 한정된다. //즉, 자식클래스형 참조 변수로 선언할 경우에는 모든 변수, 메서드 접근가능 //부모클래스로 객체에 접근할 때는 부모클래스 영역밖에 접근 할 수 없다. c1.superMethod2(); super1.superMethod2();//자식클래스에서 오버라이딩한 메서드가 출력이 된다. //즉 부모클래스형 참조변수로 메서드를 호출할 경우 //원래 부모클래스에 있는 메서드를 자식클래스가 오버라이딩 했다면 //그 메서드는 호출하면 자식클래스에서 오버라이딩한 메서드가 호출이 된다. } }
부모클래스
public class SuperClass { //생성자 public SuperClass() { System.out.println("부모클래스의 생성자"); } public SuperClass(int a) { System.out.println("부모 클래스의 생성자2 - a :" + a); } int superV1; public void superMethod() { System.out.println("superClass의 메서드 - superV1 : " + superV1); } public void superMethod2() { System.out.println("superClass의 메서드2"); } }
자식클래스
//Class1은 SuperClass를 상속받고 있다. public class Class1 extends SuperClass{ public Class1() { //자식클래스의 생성자에서 부모클래스의 생성자를 선택해서 호출.(파라미터에 값을 줘서) super(100); System.out.println("자식클래스의 생성자"); } int class1V1; public void class1Method() { System.out.println("Class1의 메서드 - class1V1 :" + class1V1); } public void superMethod2() { System.out.println("자식클래스에서 overRidng한 superMethod2"); //오버라이딩한 메서드에서 부모클래스가 가지고 있는 메서드를 호출하고 싶을 때 super.superMethod2(); } }
참조 : 인프런 -안드로이드를 위한 자바 - 다형성
참조 : https://asfirstalways.tistory.com/168
'java' 카테고리의 다른 글
폴더가 존재하는지 존재하지 않는지 보고 존재하지 않으면 생성 (0) 2020.05.09 File.mkdir()과 File.mkdirs()의 차이점 (0) 2020.05.09 Stream개념 (0) 2020.05.09 generic (0) 2020.05.07 Calendar (0) 2020.05.07