this
class Person{
int id; //编号
String name; //姓名
int age; //年龄
//构造函数
public Person(int id,String name ,int age){
this.id = id;
this.name = name;
this.age = age;
}
//比较年龄的方法,这是本身就具备的,还有一个和谁比较是未知数
public void compareAge(Person p2){
if(this.age>p2.age){
System.out.println(this.name+"大!");
}else if(this.age<p2.age){
System.out.println(p2.name+"大!");
}else{
System.out.println("同龄");
}
}
}
class Demo7{
public static void main(String[] args) {
Person p1 = new Person(110,"狗娃",17);
Person p2 = new Person(119,"铁蛋",9);
p1.compareAge(p2);
}
}
this是指向本类中某一个对象的一个变量,this相当于文章中第一人称的“我”,所有人描述自己的时候都会说“我”,只要读“我”的这个人发生变化,这个“我”指向的人就变了;而this关键字与之类似,this是抽象的,刚开始并不知道是指代谁,this是每一个对象携带的变量,这个变量所指向的都是自己,this只是起到了一个描述的作用:只要有一个具体的对象来执行的时候,this就用这个对象的this,换一个对象,this就变成另一个对象的this,所以只有在执行的时候才知道指向谁。就像文章中的“我”,只有确定了谁是读这篇文章的,才能确定这个“我”指代谁;
class Student{
int id; //身份证
String name; //名字
public Student(int id,String name){//一个函数的形式参数也是属于局部变量
this(name); //调用了本类的一个参数的构造方法,根据传入的参数确定调用的是本类的哪一个构造方法
this.id = id; //局部变量的id给成员变量的id赋值
System.out.println("两个参数的构造方法被调用了……");
}
public Student(){
System.out.println("无参的构造方法被调用了……");
}
public Student(String name){
this.name = name;
System.out.println("一个参数的构造方法被调用了……");
}
}
class Demo6{
public static void main(String[] args){
Student s = new Student(110,"铁蛋");
System.out.println("编号:"+s.id+" 姓名:"+s.name);
}
}
this关键字调用其他的构造函数要注意的事项:
(1)this关键字调用其他的构造函数时,this关键字必须要位于构造函数中的第一个语句;
(2)this关键字在构造函数中不能出现相互调用的情况,因为是一个死循环;
super
super关键字的作用:
(1) 子父类存在着同名的成员(包括变量和方法)时,在子类中默认是访问子类的成员,可以通过super关键字指定访问父类的成员;
(2) 创建子类对象时,默认会先调用父类无参的构造方法,可以通过super关键字指定调用父类的构造方法。
(3) 如果在子类的构造方法上没有指定调用父类的构造方法,那么java编译器会在子类的构造方法内加上super()语句。
(4) super关键字调用父类的构造函数时,该语句必须要是子类构造函数中的第一个语句。
(5) super与this关键字不能同时出现在同一个构造函数中调用其他的构造函数。因为两个语句都需要第一个语句。(注意:是两个关键字不能同时出现在同一个构造函数中去调用其他的构造函数,里面还是可以写this.num = num。并不是说不能出现this)
this和super区别:
(1) 代表的事物不一致。
① super关键字代表的是父类空间的引用。(并不能代表对象,只是代表一个对象中的一块内存而已)
② this关键字代表的是所属函数的调用者对象。
(2) 使用前提不一致。
① super关键字必须要有继承关系才能使用。
② this关键字不需要存在继承关系也可使用。
(3) 调用构造函数的区别:
① super关键字是调用父类的构造函数。
② this关键字是调用本类的构造函数。