一.this关键字
1.实例一:
(1)需求:使用Java类描述一个动物;
(2)实例:
class Animal{
String name; //成员变量
String color;
public Animal(String n,String c){
name = n;
color = c;
}
public void eat(){
String name = "老鼠"; //局部变量
System.out.println(name+"在吃……");
}
}
class Demo1{
public static void main(String[] args){
Animal dog = new Animal("狗","白色");//此时在内存中存在两份name数据
Animal cat = new Animal("猫","黑色");
cat.eat();
}
}
存在的问题:
当我们new一个动物cat时,让cat去调用eat方法,结果显示的却是老鼠在吃;
也就是说当存在同名的成员变量与局部变量时,在方法的内部访问的是局部变量,那是因为Java采取的是就近原则访问的,要解决这个问题就需要使用this关键字;
.this关键字的作用:
(1)如果存在同名的成员变量与局部变量时,在方法内部默认是访问局部变量的数据,可以通过this关键字指定访问成员变量的数据;
(2)在一个构造函数中可以调用另外一个构造函数初始化对象;
5.this关键字要注意的事项:
(1)存在同名的成员变量与局部变量时,在方法的内部访问的是局部变量(Java采取的是“就近原则”的机制访问的);
(2)如果在一个方法中访问了一个变量,该变量只存在成员变量的情况下,那么Java编译器会在该变量的前面添加this关键字;
6.this关键字调用其他的构造函数要注意的事项:
(1)this关键字调用其他的构造函数时,this关键字必须要位于构造函数中的第一个语句;
(2)this关键字在构造函数中不能出现相互调用的情况,因为是一个死循环;
二.super关键字
1. super关键字代表了父类空间的引用;
2. super关键字的作用:
(1) 子父类存在着同名的成员(包括变量和方法)时,在子类中默认是访问子类的成员,可以通过super关键字指定访问父类的成员;
(2) 创建子类对象时,默认会先调用父类无参的构造方法,可以通过super关键字指定调用父类的构造方法。
(1) 如果在子类的构造方法上没有指定调用父类的构造方法,那么java编译器会在子类的构造方法内加上super()语句。
(2) super关键字调用父类的构造函数时,该语句必须要是子类构造函数中的第一个语句。
(3) super与this关键字不能同时出现在同一个构造函数中调用其他的构造函数。因为两个语句都需要第一个语句。
(1) 代表的事物不一致。
① super关键字代表的是父类空间的引用。(并不能代表对象,只是代表一个对象中的一块内存而已)
② this关键字代表的是所属函数的调用者对象。
(2) 使用前提不一致。
① super关键字必须要有继承关系才能使用。
② this关键字不需要存在继承关系也可使用。
(3) 调用构造函数的区别:
① super关键字是调用父类的构造函数。
② this关键字是调用本类的构造函数。
3. super关键字调用父类构造方法要注意的事项:
注意:是两个关键字不能同时出现在同一个构造函数中去调用其他的构造函数,里面还是可以写this.num = num。并不是说不能出现this。
4. super关键字与this关键字的区别:
.实例:
class Father {
int x = 1;
Father() {
System.out.println("这是父类无参的构造方法");
}
Father(int x) {
this.x = x;
System.out.println("这是父类有参的构造方法");
}
void speak() {
System.out.println("我是父类");
}
}
class Son extends Father {
int y = 1;
Son() {
System.out.println("这是子类无参的构造方法");
}
Son(int y) {
this.y = y+x;
System.out.println("这是子类带参的构造方法");
}
void run() {
super.speak(); //访问父类的函数
System.out.println("我是子类");
}
}
class Demo1{
public static void main(String[] args) {
Son s = new Son(3);
System.out.println(s.y); //4
}
}
super关键字主要存在于子类方法中,用于指向子类对象中的父类对象;可以访问父类的属性、函数以及构造函数。