그만큼 this 키워드는 현재 클래스의 참조를 가리키는 반면 super 키워드는 부모 클래스의 참조를 가리킵니다. this 현재 클래스의 변수 및 메서드에 액세스하는 데 사용할 수 있습니다. super 하위 클래스에서 상위 클래스의 변수와 메서드에 액세스하는 데 사용할 수 있습니다.
부터 this 그리고 super 키워드는 객체의 인스턴스와 관련이 있으므로 정적 블록이나 정적 메서드 내에서 사용할 수 없습니다. 그렇게 하지 않으면 컴파일 오류가 발생합니다. 정적 컨텍스트에서 참조할 수 없는 비정적 콘텐츠.
그만큼 this 키워드는 일반적으로 아래와 같이 메서드의 매개변수에 의해 인스턴스 변수가 가려질 때 사용됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class A
{
public int x = 0;
public int y = 0;
}
class B extends A
{
public int x, y;
// 인스턴스 변수 `x`, `y`는 생성자의 매개변수에 의해 가려집니다.
B(int x, int y)
{
this.x = x;
this.y = y;
}
void print()
{
System.out.println("Base class : {" + x + ", " + y + "}");
System.out.println("Super class: {" + super.x + ", " + super.y + "}");
}
}
class Main
{
public static void main(String[] args)
{
B obj = new B(1, 2);
obj.print();
}
}
다운로드 코드 실행
결과:
Base class : {1, 2}
Super class: {0, 0}
그만큼 super 키워드는 부모 클래스의 비공개가 아닌(공개, 보호 또는 기본) 메서드 및 변수에 대한 액세스를 허용합니다. 그러나 하위 클래스 내에서 상위 클래스의 private 멤버에 액세스하는 것은 불가능합니다.
그만큼 super 키워드는 클래스가 부모 클래스의 메서드를 재정의하고 재정의된 메서드를 호출해야 할 때 유용합니다. 이것은 다음을 사용하여 수행할 수 있습니다. super. 이것은 아래에 설명되어 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Vehicle
{
public void drive() {
System.out.println("Driving a Vehicle");
}
}
class Car extends Vehicle
{
@Override
public void drive() {
System.out.println("Driving a Car");
}
public void driveParent() {
super.drive();
}
}
class Main
{
public static void main(String[] args)
{
Car c = new Car();
c.drive();
c.driveParent();
}
}
다운로드 코드 실행
결과:
Driving a Car
Driving a Vehicle
2. 사용 this() 대 super() 방법
전화 this() 생성자 내에서 메서드가 현재 클래스에 정의된 다른 생성자를 호출합니다. 이것이 작동하려면 재귀 생성자 호출이 허용되지 않으므로 생성자를 오버로드해야 합니다. 반면에, super() 부모 클래스에 정의된 생성자를 호출합니다.
우리는 부를 수 없다 this() 그리고 super() 생성자 본문 외부의 메서드. 또한 다음 중 하나를 호출하면 this() 또는 super() 생성자 본문의 첫 번째 줄이어야 합니다. 이것은 또한 동일한 생성자 내에서 두 메서드를 동시에 호출할 수 없음을 의미합니다.