1.this对象本身
在Java语言中,当创建一个对象后,Java虚拟机就会为其分配一个指向对象本身的指针,这个指针就是“this”(在java里面没有指针的定义。但是java里面的“指针”无处不在)。
在我们使用this时,this一般出现在类的方法里面,当这个方法还没有调用的时候this指的是谁并不知道,但是实际当中如果new一个对象出来之后,this指的就是当前这个对象,对哪个对象调用这个方法this指的就是谁.如果再new一个对象,这个对象也有自己的this.this指的就是另外一个对象了。
this应用场景:
(1)引用成员变量,this这个关键字其代表的就是对象中的成员变量或者方法。
public class User {
String name; // 定义一个成员变量name
private void SetName(String name) { // 定义一个局部变量name
this.name=name; // 将局部变量的值传递给成员变量
}
}
(2)调用类的构造方法,this这个关键字其代表的就是对象中的成员变量或者方法。
public class User { // 定义一个类,类的名字为User
public User(String name) { // 定义一个带形参的构造方法
}
public User() { // 定义构造方法
this("张三"); // 调用类的构造方法
}
}
(2)返回对象的值,可以使用return this来返回一个类的引用(实际调用这个方法的实例对象)。
public class User {
String name; // 定义一个成员变量name
User setName(String name) { // 定义一个局部变量name
this.name = name; // 将局部变量的值传递给成员变量
return this; //返回对象User
}
public static void main(String[] args) {
User u=new User(); // 创建User对象
User user=u.setName("张三"); // 调用setName,获取返回的新对象
System.out.println(user.name); //打印name的值
}
}
2.super父类对象
super关键字表示对某个类的父类的引用。
super应用场景:
(1)访问被子类的成员隐藏的父类成员。
public class SuperTest {
public String name; // 定义一个成员变量name
public void s() { // 定义一个普通方法
name="父类"; // 给成员变量赋值
System.out.println("super类的名称叫"+name);
}
}
public class ChildTest extends SuperTest{
public void s() { //重写方法s
super.s();// 使用super作为父类对象的引用对象来调用父类对象里面的s()方法
}
public static void main(String[] args) {
ChildTest t=new ChildTest();
t.s();
}
}
(2)调用父类的构造函数,构造函数不会被继承。只会被调用。
public class SuperTest {
public SuperTest() { // 定义一个带形参的构造方法
System.out.println("super类的无参构造方法");
}
public SuperTest(String name) { // 定义构造方法
System.out.println("super类的有参构造方法");
}
}
public class ChildTest extends SuperTest{
public ChildTest(){
super();// 子类所有的 构造函数 默认调用父类的无参构造函数,可省略省略掉super();也可以自行添加到构造函数的第一行(必须是第一行,否则报错)
System.out.println("子类 无参 构造函数");
}
public ChildTest(String name){
super(name);//调用父类中的有参构造函数(应该为构造函数中的第一条语句)
System.out.println("子类 有参 构造函数");
}
}
- 子类所有的 构造函数默认调用父类的无参构造函数,可省略super(),若是想写上必须写在第一行。
- 如果子类的某个构造函数想调用父类的其他的带参数的构造函数,在构造函数的第一行添加 super(val1,val2,…)。
- 添加了super(val1,val2,…),就可以指定调用父类的那个参数类型和数量一致的构造函数。之后在此子类构造函数中,系统不会再默认调用父类无参构造函数。
- super指代父类对象,可以在子类中使用 super.父类方法名();调用父类中的方法。
参考了Yi骑绝尘的Java 子类调用父类构造函数----super()详解。
3.this和super的区别
参考了亿念之茶的Java super和this的异同总结https://blog.csdn.net/lh__huahuan/article/details/50447812
扫描二维码关注公众号,回复:
4903511 查看本文章
- super()和this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。
- super()和this()均需放在构造方法内第一行。
- 尽管可以用this调用一个构造器,但却不能调用两个。
- this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
- this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
- 从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。