Java入门(八)——关键字this和super
目录
this关键字
* 用法及含义:
* this.属性名——调用对象:
- 在构造方法中使用this关键字对属性赋值,this表示当前对象具有变量,没有this的一端是参数传递的值
* this.方法名(实参)——调用对象:
- Java允许对象的一个成员方法直接调用另一个成员方法,可以省略this前缀
- static修饰的方法中不能使用this引用【Java语法规定,静态成员不能直接访问非静态成员】
- 如果传递一个对象的引用到static修饰的静态方法,需要创建其自身的对象,通过这个对象的引用,调用非静态方法和访问非静态数据成员
* this(实参)——访问构造方法:
- 用来访问本类的构造方法
- 只能使用在构造方法中,并且为第一条语句
- this能出现在实例方法和构造方法
- 不能出现在静态方法中
- 用来区分局部变量和成员变量,this不能省略
super关键字
* 用法及含义:
* super.属性名——访问父类的属性
* super.方法名(实参)——访问父类的方法
* super(实参)——访问父类的构造方法
- 表示通过子类的构造方法调用父类的构造方法
- 模拟现实世界场景:现有父再有子
- 只能使用再构造方法中,并且为第一条语句
- 能出现在实例方法和构造方法中
- 不能使用在静态方法中
- 当父中有,子中有,想要在子中访问“父的特征”,不能省略super
- super(实参)的作用是:初始化当前对象的父类特征,并非是创建新对象
- super代表的是“当前对象”特征的继承
总结
- 如果构造方法都没有出现this()和super(),那么便默认有一个super();来继承父类的无参数构造方法
- 由于this()和super()都只能出现再构造方法的第一条语句,所以两者不能同时在一个构造方法中出现
- 无论怎么调用,父类的构造方法都会使用
范例代码
class Teacher{
String name="张三";
public Teacher(String name){
System.out.println("this.name-->"+this.name);//张三
this.name=name;//this不能省略,用来区分局部变量和成员变量
System.out.println("name-->"+name);//lisi
}
public void run1(String r) {
System.out.println("这里是"+r);
}
public void run2() {
this.run1("run2");//调用本类的方法
//this可以省略
}
public Teacher() {
this("王五");//无参数构造方法调用本类中有参数的构造方法
}
}
class Sudents extends Teacher{
public Sudents() {//默认存在super(),所以调用父类的无参数构造方法
}
public Sudents(String name) {
super("学生A");//调用父类的有参数构造方法
System.out.println(super.name);//因为原来父亲的属性被更改,所以输出父类的属性为更改后的
}
public void s() {
System.out.println(super.name);//输出父类的属性
super.run1("子类的普通方法");
}
}
public class ThisAndSuper {
public static void main(String[] agrs) {
Teacher t=new Teacher("lisi");//创建对象的有参数构造方法调用
System.out.println("------------------------");
t.run1("run1");
t.run2();
System.out.println("------------------------");
Teacher tt=new Teacher();//创建对象的无参数构造方法调用
System.out.println("------------------------");
Sudents s=new Sudents();
new Sudents("老师A");
s.s();
}
}