이 글은java에 대한 관련 지식을 주로 키워드로 소개하고, 그 차이점도 함께 살펴보겠습니다.
추천 학습: "java 비디오 튜토리얼"
this
키워드의 기능은 "현재"를 의미하는 의미에 매우 가깝습니다.2. Function
this
关键字比较难理解,它的作用和其词义很接近,表示“当前”的意思。
this
关键字可以用来修饰、调用:属性、方法、构造器。this
关键字只能在方法内部使用。
它在方法内部使用,即这个方法所属对象的引用;
它在构造器内部使用,表示该构造器正在初始化的对象。
当在方法内需要用到调用该方法的对象时,就用
this
。具体的:我们可以用this
来区分属性和局部变量。比如:this.name = name;
this
理解为:当前对象或当前正在创建的对象
在类的方法中,我们可以使用this.属性
或this.方法
的方式,调用当前对象属性或方法。但是,通常情况下,我们都选择省略this.
。特殊情况下,如果方法的形参和类的属性同名时,我们必须显式的使用this.变量
的方式,表明此变量是属性,而非形参。
使用this
访问属性和方法时,如果在本类中未找到,会从父类中查找。
代码演示:
class Person{ // 定义Person类 private String name ; private int age ; public Person(String name,int age){ this.name = name ; this.age = age ; } public void getInfo(){ System.out.println("姓名:" + name) ; this.speak(); } public void speak(){ System.out.println(“年龄:” + this.age); } }
在类的构造器中,我们可以使用
this.属性
或this.方法
的方式,调用当前正在创建的对象属性或方法。但是,通常情况下,我们都选择省略this.
。特殊情况下,如果构造器的形参和类的属性同名时,我们必须显式的使用this.变量
的方式,表明此变量是属性,而非形参。
我们在类的构造器中,可以显式的使用
this(形参列表)
的方式,调用本类中指定的其它构造器。
构造器中不能通过
this(形参列表)
方式调用自身的构造器。
如果一个类中有n个构造器,则最多有 n - 1个构造器中使用了
this(形参列表)
规定:
this(形参列表)
必须声明在当前构造器的首行。
构造器内部,最多只能声明一个
this(形参列表)
,用来调用其它的构造器。
除构造器之外,编译器禁止在其它任何方法中调用构造器。
代码演示:
class Person{ // 定义Person类 private String name ; private int age ; public Person(){ // 无参构造器 System.out.println("新对象实例化") ; } public Person(String name){ this(); // 调用本类中的无参构造器 this.name = name ; } public Person(String name,int age){ this(name) ; // 调用有一个参数的构造器 this.age = age; } public String getInfo(){ return "姓名:" + name + ",年龄:" + age ; } }
代码演示:
public class Leaf { int i = 0; Leaf increment(){ i++; return this; } void print(){ System.out.println("i = "+i); } public static void main(String args[]){ Leaf x = new Leaf(); x.increment().increment().increment().print();//i = 3 }}
(1)
super
理解为:父类的
(2)在Java类中使用super来调用父类中的指定操作:
super
可用于访问父类中定义的属性。
super
可用于调用父类中定义的成员方法。super
可用于在子类构造器中调用父类的构造器。
尤其当子父类出现同名成员时,可以用super
表明调用的是父类中的成员,super
的追溯不仅限于直接父类。super
和this
的用法相像,this
代表本类对象的引用,super
이
키워드를 사용하여 속성, 메서드 및 생성자를 수정하고 호출할 수 있습니다.
this
키워드는 메소드 내에서만 사용할 수 있습니다.
3. 이 키워드를 언제 사용해야 할까요? 메서드 내에서 해당 메소드를 호출하는 객체를 사용해야 할 경우에는이것
을 사용하세요. 구체적으로는this
를 사용하여 속성과 지역 변수를 구분할 수 있습니다. 예:this.name = name;
3.1 수정 속성 및 메서드
this
는 현재 개체 또는 개체로 이해됩니다. 현재 생성 중인
클래스 메서드에서this.property
또는this.method
를 사용하여 현재 개체의 속성이나 메서드를 호출할 수 있습니다. 그러나 일반적으로this.
를 생략합니다. 특별한 경우, 메소드의 형식 매개변수가 클래스의 속성과 동일한 이름을 갖는 경우this.variable
을 명시적으로 사용하여 변수가 형식 매개변수가 아닌 속성임을 나타내야 합니다.
this
를 사용하여 속성과 메서드에 액세스할 때 이 클래스에 없으면 상위 클래스에서 검색됩니다. 코드 데모:public class Person { private String name; private int age; private Date birthDate; public Person(String name, int age, Date d) { this.name = name; this.age = age; this.birthDate = d; } public Person(String name, int age) { this(name, age, null); } public Person(String name, Date d) { this(name, 30, d); } public Person(String name) { this(name, 30); } }public class Student extends Person { private String school; public Student(String name, int age, String s) { super(name, age); school = s; } public Student(String name, String s) { super(name); school = s; }// 编译出错: no super(),系统将调用父类无参数的构造器。 public Student(String s) { school = s; } }로그인 후 복사로그인 후 복사3.2 생성자 호출
클래스 생성자에서this.property
또는this.method를 사용할 수 있습니다.
메소드를 사용하여 현재 생성 중인 객체의 속성이나 메소드를 호출합니다. 그러나 일반적으로this.
를 생략합니다. 특별한 경우, 생성자의 형식 매개변수가 클래스의 속성과 동일한 이름을 갖는 경우this.variable
을 명시적으로 사용하여 변수가 형식 매개변수가 아닌 속성임을 나타내야 합니다. 클래스 생성자에서이(형식 매개변수 목록)
를 명시적으로 사용하여 이 클래스에 지정된 다른 생성자를 호출할 수 있습니다. 생성자는this(형식 매개변수 목록)
메서드를 통해 자체 생성자를 호출할 수 없습니다. 클래스에 n개의 생성자가 있는 경우 는 최대 n - 1을 가질 수 있습니다.이 (공식 매개변수 목록)
가 생성자에 사용됩니다. 규정:이(정식 매개변수 목록)
는현재 생성자의 첫 번째 줄에 선언되어야 합니다. 생성자 내에서는 다른 생성자를 호출하는 데 사용되는 최대 하나의this(형식 매개변수 목록)
만 선언할 수 있습니다. 생성자를 제외하고 컴파일러는 다른 메서드에서 생성자를 호출하는 것을 금지합니다. 코드 데모: rrreee3.3 현재 객체 반환
코드 데모: rrreee 2. "super" 키워드 사용 1 개요( 1)super
는 다음과 같이 이해됩니다: 상위 클래스의 (2) Java 클래스에서 super를 사용하여 상위 클래스에서 지정된 작업을 호출합니다:super 상위 클래스에 정의된 속성 에 액세스하는 데 사용할 수 있습니다.
super
는 상위 클래스에 정의된멤버 메서드를 호출하는 데 사용할 수 있습니다.super
는 하위 클래스 생성자에서 상위 클래스의생성자를 호출하는 데 사용할 수 있습니다.
특히 동일한 이름을 가진 멤버가 하위 또는 상위 클래스에 나타나는 경우super
를 사용하여 상위 클래스의 멤버를 호출하고 있음을 나타낼 수 있습니다. super는 직계 부모 클래스에만 국한되지 않습니다.super
는this
와 유사합니다.this
는 이 클래스의 객체에 대한 참조를 나타내고super
는 클래스의 메모리 공간 식별자를 나타냅니다. 2. 을 사용하여 하위 클래스에서 상위 클래스의 구조를 명시적으로 호출합니다.
我们可以在子类的方法或构造器中。通过使用"
super.属性
“或”super.方法
“的方式,显式的调用父类中声明的属性或方法。但是,通常情况下,我们习惯省略”super.
"。
当子类和父类中定义了同名的属性时,我们要想在子类中调用父类中声明的属性,则必须显式的使用"
super.属性
"的方式,表明调用的是父类中声明的属性。
当子类重写了父类中的方法以后,我们想在子类的方法中调用父类中被重写的方法时,则必须显式的使用"
super.方法
"的方式,表明调用的是父类中被重写的方法。
(1)子类中所有的构造器默认都会访问父类中空参数的构造器。
(2)当父类中没有空参数的构造器时,子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器,否则编译出错。同时,只能”二选一”,不能同时出现,且必须放在构造器的首行。
(3)在类的多个构造器中,至少有一个类的构造器中使用了"super(形参列表)",调用父类中的构造器。
代码演示:
public class Person { private String name; private int age; private Date birthDate; public Person(String name, int age, Date d) { this.name = name; this.age = age; this.birthDate = d; } public Person(String name, int age) { this(name, age, null); } public Person(String name, Date d) { this(name, 30, d); } public Person(String name) { this(name, 30); } }public class Student extends Person { private String school; public Student(String name, int age, String s) { super(name, age); school = s; } public Student(String name, String s) { super(name); school = s; }// 编译出错: no super(),系统将调用父类无参数的构造器。 public Student(String s) { school = s; } }
No. | 区别点 | this | super |
---|---|---|---|
1 | 访问属性 | 访问本类中的属性,如果本类没有此属性则从父类中继续查找 | 直接访问父类中的属性 |
2 | 调用方法 | 访问本类中的方法,如果本类没有此方法则从父类中继续查找 | 直接访问父类中的方法 |
3 | 调用构造器 | 调用本类构造器,必须放在构造器的首行 | 调用父类构造器,必须放在子类构造器的首行 |
(1)从结果上来看:(继承性)
子类继承父类以后,就获取了父类中声明的属性或方法。
创建子类的对象,在堆空间中,就会加载所有父类中声明的属性。
(2)从过程上来看:
当我们通过子类的构造器创建子类对象时,我们一定会直接或间接的调用其父类的构造器,进而调用父类的父类的构造器,…直到调用了java.lang.Object
类中空参的构造器为止。正因为加载过所有的父类的结构,所以才可以看到内存中有父类中的结构,子类对象才可以考虑进行调用。
(3)明确:虽然创建子类对象时,调用了父类的构造器,但是自始至终就创建过一个对象,即为
new
的子类对象。
推荐学习:《java视频教程》
위 내용은 Java의 this 및 super 키워드에 대한 상세 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!