区别点 | this | super |
访问属性 | 访问本类中的属性,如果本类没有此属性则从父类中继续查找 | 直接查找父类中的属性 |
调用方法 | 访问本类中的方法,如果本类没有此方法则从父类中继续查找 | 直接查找父类中的方法 |
调用构造器 | 访问本类中的构造器,必须放在构造器的首行 | 访问父类中的构造器,必须放在子类构造器的首行 |
关键字this
1. this的定义
this可以理解成当前对象, this可以调用类的属性,方法,构造器 。它在方法内部使用,即这个方法所属对象的引用;
它在构造器内部使用,表示该构造器正在初始化的对象.
2. this的使用
this 调用类中的属性和方法
(1) 在方法(构造器)中,可以通过使用"this."来调用当前对象(正在创建的对象)的属性和方法。 往往我们都会省略掉"this."。(2) 但是如果方法的(构造器的)形参和属性的名字相同时,那么就必须使用 "this."用来区分属性和局部变量
this 调用构造器
格式 :this(形参列表)作用 :调用 本类中的其它构造器
说明:
1. this(形参列表)必须放在构造器的首行
2. 同一个构造器中最多只能有一个this(形参列表)
3. 如果一个类有N个构造器,那么最多只能有N-1个this(形参列表)
4. 构造器中 不能通过"this(形参列表)"的方式调用自身构造器
class Person{ // 定义Person类
String name;
String job;
Person(String name){
this.name = name;//此处的this不能省,因构造器的形参和属性的名字相同
}
Person(String name, String job){
this(name);//调用本类中的其他构造器
this.job = job;
}
public void getInfo(){
System.out.println("Person类 --> " + this.name) ;
}
public boolean compare(Person p){
return this.name == p.name;
}
}
public class PersonTest{
public static void main(String args[]){
Person per1 = new Person("张三") ;
Person per2 = new Person("李四") ;
per1.getInfo() ; // 当前调用getInfo()方法的对象是per1
per2.getInfo() ; // 当前调用getInfo()方法的对象是per2
boolean b = per1.compare(per2);// b = false
}
}
关键字super
1. super的定义
Java类中使用super来调用 父类中的指定操作, super可以调用父类的属性,方法,构造器 。2. super的使用
super调用父类中的属性和方法
(1) 在子类的构造器和方法中可以使用"super."调用父类中的属性和方法,我们可以省略"super."。(2) 如果子类和父类中的属性名相同或者子类重写了父类中的方法, 那么必须使用"super."来区分调用的是子类的还是父类的。
super调用父类中的构造器
格式 :super(形参列表)说明 :
1. 子类中所有的构造器默认都会访问父类中空参数的构造器 当父类中没有空参数的构造器时,子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器。
2. super(形参列表)和this(形参列表)同时只能有一个,并且必须放在构造器的首行
3. 如果子类构造器中既未显式调用父类或本类的构造器,且父类中又没有无参的构造器,则编译出错
4. 在子类的构造器中如果没显示的使用super(形参列表)和this(形参列表),默认使用super()
总结 :创建子类对象必调父类构造器
//使用super调用方法
class Person {
protected String name = "张三";
protected int age;
public String getInfo() {
return "Name: " + name + "\nage: " + age;
}
}
class Student extends Person {
protected String name = "李四";
private String school = "New Oriental";
public String getSchool() {
return school;
}
public String getInfo() {//使用super调用父类中的方法
return super.getInfo() + "\nschool: " + school;
}
}
public class StudentTest {
public static void main(String[] args) {
Student st = new Student();
System.out.println(st.getInfo());
/*输出结果
Name: 张三
age: 0
school: New Oriental
*/
}
}
//使用super调用构造器
class Creature {
public Creature() {
System.out.println("Creature无参数的构造器");
}
}
class Animal extends Creature {
public Animal(String name) {
System.out.println("Animal带一个参数的构造器,该动物的name为" + name);
}
public Animal(String name, int age) {
this(name);
System.out.println("Animal带两个参数的构造器,其age为" + age);
}
}
public class Wolf extends Animal {
public Wolf() {
super("灰太狼", 3);
System.out.println("Wolf无参数的构造器");
}
public static void main(String[] args) {
new Wolf();
}
/*
输出结果为:
Creature无参数的构造器
Animal带一个参数的构造器,该动物的name为灰太狼
Animal带两个参数的构造器,其age为3
Wolf无参数的构造器
*/
}