> Java > java지도 시간 > Java에서 이 키워드의 사용에 대한 자세한 설명

Java에서 이 키워드의 사용에 대한 자세한 설명

黄舟
풀어 주다: 2017-10-14 09:35:36
원래의
1731명이 탐색했습니다.

이 글은 주로 Java this 키워드 사용에 대한 관련 정보를 자세히 소개합니다. 이 내용이 필요한 친구들은

Java this 키워드를 참조하세요. of Usage

생성자 메소드의 this 키워드

생성자 메소드는 new 키워드를 통해 클래스의 객체가 생성될 때 자동으로 호출됩니다. 프로그램에서는 메소드 이름을 통해 다른 메소드를 호출할 수 없습니다. 클래스 이름)을 호출합니다. 하지만 클래스에 생성자가 여러 개 있는 경우 하나의 생성자에서 이(paras...)를 통해 다른 생성자를 호출할 수 있습니다.
이를 사용하여 다른 생성자를 호출하는 데에는 다음과 같은 제약이 있습니다.

1) 다른 생성자는 생성자 내에서만 이를 통해서만 호출할 수 있으며 일반 메소드에서는 사용할 수 없습니다.
2) 이를 통해 생성자는 재귀적으로 호출될 수 없습니다. 즉, 생성자 내에서 이를 통해 직접 또는 간접적으로 생성자 자체를 호출할 수 없습니다.

예:


class test {
  test() {
    this(1);
  }
  test(int a){
    this();
  }
  test(int a, int b) {
    this(1, 2);
  }
}
로그인 후 복사

test() 메서드는 test(int) 생성자를 호출하고 test(int) 생성자는 재귀 호출을 구성하는 test() 생성자를 호출합니다. test(int, int)에서 자신을 호출하는 것도 재귀 호출을 구성합니다. 모두 허용되지 않습니다.

3) 이를 통해 다른 생성자를 호출하는 작업은 생성자의 첫 번째 줄에서 실행되어야 합니다. super 호출은 부모 클래스의 생성자도 생성자의 첫 번째 줄에서 실행되어야 하므로 이를 통해 생성자를 호출하는 것과 super가 동시에 동일한 생성자에 나타날 수는 없습니다. 하나의 생성자에서 다른 생성자를 여러 번 호출할 수 없습니다.
생성자에서 this 키워드를 사용하여 이 클래스의 멤버 변수 및 멤버 함수에 액세스할 수도 있습니다. 사용법은 비생성자 메서드의 this 키워드와 동일합니다.

비생성자 메서드의 This 키워드

Java에서는 this 키워드를 통해 클래스의 멤버 변수와 메서드를 호출할 수 있습니다. 사용법은 다음과 같습니다.

1) this.xxx; 클래스의 멤버 변수 xxx에 액세스
2) this.yyy(paras…) 클래스의 멤버 메소드 yyy에 액세스
3) 현재 클래스 객체의 참조

this 키워드 클래스의 멤버 변수 및 멤버 함수에 대한 액세스에는 액세스 권한 제어가 적용되지 않습니다. 전용 멤버 변수 및 메서드를 포함하여 이 클래스의 모든 멤버 변수 및 메서드에 액세스할 수 있습니다. 이를 통해 이 클래스의 정적 멤버에 접근할 수도 있습니다. 그러나 정적 멤버는 클래스 이름을 통해 직접 접근할 수 있으므로, 이를 통해 접근하면 "정적 필드 ×××는 a에서 접근해야 합니다"라는 경고 메시지가 나타납니다. 정적 방법". 클래스의 정적 멤버나 정적 블록 내에서는 사용할 수 없습니다.

상속 관계에서 this 키워드

상속 관계에서 부모 클래스의 this 키워드가 항상 부모 클래스의 변수와 메서드를 나타내지는 않습니다. 이 키워드의 네 가지 용도는 위에서 언급한 바와 같으며 아래에 나열되어 있습니다.

1) this(paras…); 다른 생성자에 액세스
2) this.xxx; 클래스의 멤버 변수 xxx에 액세스
3) this.yyy(paras…); 클래스의 멤버 메서드에 액세스
4 ) ; 현재 클래스 객체에 대한 참조

첫 번째 유형의 경우 하위 클래스에 동일한 매개변수가 있는 생성자가 있는지 여부에 관계없이 this(paras...);
두 번째 유형의 경우 하위 클래스가 멤버 변수를 재정의하는지 여부에 관계없이 this.xxx는 항상 상위 클래스의 멤버 변수에 액세스합니다.
세 번째 유형의 경우 하위 클래스가 멤버 메서드를 재정의하면 this.yyy(paras...); 하위 클래스가 멤버 메서드를 재정의하지 않으면 this.yyy(paras)가 액세스됩니다. ...); 상위 클래스의 멤버 메서드에 액세스합니다.
네 번째 유형의 경우 이는 항상 하위 클래스의 객체를 나타냅니다.

예:


public class ClassTest {
  public static void main(String[] args) {
    Child child = new Child();
    child.show();
  }
}

class Parent {
  public String str;
  Parent(){
    this(1);
  }
  Parent(int a) {
    this.str = "Parent";
    this.show();
  }
  public void show() {
    System.out.println(this.str);
  }
}

class Child extends Parent {
  public String str;
  Child() {
  }
  Child(int a) {
    str = "Child";
  }
  public void show() {
    System.out.println(str);
    super.show();
  }
}
로그인 후 복사

main() 함수에는 new Child() 및 child.show()라는 두 개의 명령문이 있습니다.

첫 번째 구문 new Child()가 실행되면 Child 클래스의 생성자가 실행됩니다. 그러나 Child 클래스는 Parent 클래스의 하위 클래스이므로 Parent 클래스의 생성자가 먼저 실행됩니다. Child 클래스의 매개변수 없는 생성자는 부모 클래스나 이 클래스의 다른 생성자를 호출하기 위해 super 및 this를 사용하지 않으므로 부모 클래스의 매개변수 없는 생성자가 호출됩니다. This(1)은 부모 클래스의 매개변수 없는 생성자 Parent()에서 호출되고 실행됩니다. 이 호출은 부모 클래스에 정수 매개변수를 가진 생성자를 실행한다는 의미입니다. 그러나 하위 클래스에도 정수 매개변수를 가진 생성자가 있습니다. 실행되지 않습니다. 상위 클래스에 정수 매개변수가 있는 생성자 메소드는 this.str="Parent"를 실행합니다. 여기서 This.str은 상위 클래스의 멤버 변수 str을 나타내지만 하위 클래스에도 str 멤버 변수가 없습니다. 사용. 상위 클래스의 멤버 변수 str을 "Parent"에 할당한 후 this.show()가 실행됩니다. 상위 클래스에 show() 메서드가 있지만 하위 클래스가 show() 메서드를 재정의하기 때문입니다. show()에 의해 실행되는 하위 클래스의 show() 메서드입니다. 서브 클래스의 show() 메소드는 먼저 str을 인쇄하는 작업을 수행합니다. 이때 인쇄되는 것은 분명히 서브 클래스의 str입니다. null이 인쇄되므로 값이 할당되지 않습니다. 그런 다음 하위 클래스의 show() 메서드는 super.show()를 실행합니다. 즉, 상위 클래스의 show() 메서드가 호출됩니다. 상위 클래스의 show() 메서드에서 this.str을 인쇄하는 작업은 다음과 같습니다. This.str은 또한 상위 클래스의 멤버 변수 str을 나타내므로 "Parent"가 인쇄됩니다.

第二条语句child.show()先是执行子类的show()方法,子类的show()先是打印了子类的str值(null),然后执行了父类的show()打印了父类的str值(”Parent”)。

两条语句的打印结果为null, Parent, null, Parent。

如果将第一条语句改为new Child(1),则执行的是子类的有一个整数参数的构造方法,仍然是先执行父类的无参构造方法,初始化父类的str为”Parent”,然后执行子类的show(),子类的show()打印子类的str值(null),然后执行父类的show(),父类show()打印父类的str值(”Parent”),然后执行子类的构造方法将子类的str初始化为”Child”。 第二条语句child.show()先是执行子类的show()方法,子类的show()先是打印了子类的str值(”Child”),然后执行了父类的show()打印了父类的str值(”Parent”)。

两条语句的打印结果为null, Parent, Child, Parent。

super和this的异同

super在一个类中用来引用其父类的成员,它是在子类中访问父类成员的一个桥梁,并不是任何一个对象的引用,而this则表示当前类对象的引用。在代码中Object o = super;是错误的,Object o = this;则是允许的。
super关键字的作用在于当子类中覆盖了父类的某个成员变量,或者重写了父类的某个成员方法时还能够访问到父类的成员变量和成员方法。如果子类中没有重写父类的成员变量和成员方法,则子类会继承父类的所有非private的成员变量和成员方法。这时在子类中无论通过this来访问成员和通过super来访问成员,结果都是一样的。

super.getClass()和this.getClass()

getClass()是Object类定义的一个final方法,所有Java类的getClass()都继承自Object类。如前文所述,如果子类没有重写父类的某个成员方法,那么通过super来访问还是还是通过this来访问结果都是一样的。因此,super.getClass()和this.getClass()结果是一样的。Object类的getClass()方法返回的是该对象的运行时类,一个对象的运行时类是该对象通过new创建时指定的类。因此,super.getClass()和this.getClass()返回的都是new对象时指定的类。

例如:


public class ClassConstructorTest {
  public static void main(String[] args) {
    Child child = new Child();
    child.show();
  }
}

class Parent {
  private Parent mSelf;
  Parent(){
    mSelf = this;
  }
  public void show() {
    System.out.println(this.getClass().getName());
    System.out.println(super.getClass().getName());
    System.out.println(mSelf.getClass().getName());
  }
}

class Child extends Parent {
  public void show() {
    System.out.println(this.getClass().getName());
    System.out.println(super.getClass().getName());
    super.show();
  }
}
로그인 후 복사

打印的类名都是Child。

위 내용은 Java에서 이 키워드의 사용에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿