Java - 상속(2) - super()

2020. 8. 23. 10:21Java/Java

반응형

한 클래스에서 생성자를 호출하기 위해서 this()를 사용하였다. 

 

만약 상속의 관계에 있는 경우 부모 클래스의 생성자를 호출하는 방법이 있다.

 

바로, super를 사용하는 것이다.

 

 

class A extends B{
A(){
	super();
  }
}



class B {
System.out.println("B");
}

위와 같은 코드에서 A를 호출한다면 A의 생성자에 있는 super()은 부모 클래스인 B의 생성자를 호출한다.

 

결국 console에 B가 출력 될 것이다.

 


더 복잡한 코드이다. 주석에 써놓은 숫자 순서대로 실행이 된다.

 

예제 1.

class Parent extends Object { //상속관계 =>object()호출 (3) (9)
	 public Parent() {
		 super();//(2) (8)
		 System.out.println("난 parent 기본생성자 호출됨!");//(4) (10)
	 }
	 @Override //어노테이션
		public String toString() {
			// TODO Auto-generated method stub
			return "내용을 변경하고 싶다.";
		}
}
//class Child extends Object
class Child extends Parent{
	public Child() {
		super();//(7)
		System.out.println("난 Child 기본생성자 호출됨!");//(11)
	}
}
public class Inheritest extends Object {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
          Parent p=new Parent();//(1)
          System.out.println("p=>"+p);//(5)
          System.out.println("p.toString()=>"+p.toString());
          Child c=new Child();//(6)
          System.out.println("c=>"+c);//(12)
          System.out.println("c.toString()=>"+c.toString());
	}
}

 

 


예제 2.

public class SuperTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		C c=new C("홍길동");//1)
	}
}
class A extends Object{ //Object(){}//(5)
	public A() {
		super();//(4)
		System.out.println("난 A의 생성자 호출됨!");//(6)
	}
}
class B extends A{
	public B() {
		super();//
		System.out.println("난 B의 생성자 호출됨!");//
	}
	//추가
	public B(String s) {
		super();//(3)
		System.out.println(s);//7) 홍길동
	}
}
class C extends B{
	public C() {
		System.out.println("난 C의 생성자 호출됨!");
	}
	public C(String s) {//홍길동
		super(s);//(2) 기본생성자는 생략이 가능->인수가 있는 생성자는 호출->반드시 선언해야한다
		System.out.println(s);// 8) 홍길동
	}
}

상속을 받은 자식 클래스에서 super()을 통해서 부모의 생성자를 호출했다.

 

super()은 부모의 객체를 가르키는 방법이다. 이를 통해서 부모 객체의 변수 및 메서드를 호출 가능하다.

 

자식 클래스에서   super().메서드이름 으로 부모 클래스의 메서드를 호출 할 수 있다.

 

 

예제 코드

class Person {
	String name;
	int age=20;//default값 적용
	
	void print() {
		System.out.println("person 메서드호출=>"+name);
	}
}

class Man extends Person {
	int age=40;//상속을 받은 멤버변수와 같은 이름의 변수를 한번더 자식클래스에 선언가능
	/*
	 * 
	String name;
	int age=20;//default값 적용
	
	void print() {
		System.out.println("person 메서드호출=>"+name);
	}
	 */
	void print() {
		System.out.println("자식클래스의 age=>"+this.age);//40->Man의 age
		System.out.println("부모클래스의 age=>"+super.age);//20=>부모클래스객체.멤버변수
		//System.out.println("name의 저장된값=>"+name);//super.부모의 메서드호출
		super.print();
	}
}
public class SuperTest2 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Man m=new Man();
        m.name="홍길동";
        m.print();//오버라이딩한 메서드 print() 호출된다.
	}
}

 

반응형

'Java > Java' 카테고리의 다른 글

Java - final  (0) 2020.08.23
Java - 접근지정자  (0) 2020.08.23
Java - 상속(1)  (0) 2020.08.23
Java - 배열  (0) 2020.08.23
Java - this  (0) 2020.08.21