/*
就近原则: 在类当中,如果存在同名的变量名,Java编译器会认为最近的变量名是该语句操作的变量;所以就出现了this
*
* this 关键字的作用:
* 1..如果在同一个函数中,出现了和成员变量同名的变量名,可以利用this来区分不同的变量;this.成员变量 表示的是成员变量
*
* 2..this关键字不仅可以调用普通函数,还能调用类的构造函数
* 注意事项:1.如果一个构造函数A通过this调用构造函数B,那么this必须放在构造函数的第一行
* 2.两个构造函数不能this关键字相互调用,语法不通过,会陷入死循环
3.只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this
4.为什么在静态方法中不能使用this关键字
因为this关键字是指的类对象;而静态方法是属于类的,static随着类的加载而加载,先于对象的创建而创建
5.在构造方法中,意思是调用本类中另一种形式的构造函数(this必须放在第一行)
*/
class Bus {
private int wheel;
private String name;
public Bus() {
this(6);//this关键字还能调用类的构造函数,但必须放在第一行
this.run();//注意:这个是调用的普通的函数;
System.out.println("无参构造函数");
}
public Bus(int wheel) {
//this();//陷入死循环
this.wheel = wheel;
}
public Bus(int wheel, String name) {
//wheel=wheel;//,如果存在同名的变量名,Java编译器会认为最近的变量名是该语句操作的变量
this.wheel = wheel;
this.name = name;
}
public void run(){
System.out.println("车跑了");
}
public void show() {
System.out.println("Name:"+name+"wheel:"+wheel);
}
}
public class TestThis {
public static void main(String[] args) {
Bus bus = new Bus();
bus.show();
}
}
* 子类在创建的时候,会自动调用父类对应的构造函数
* 但是父类的构造函数又不能被子类继承
* 【问题】
创建子类的时候,希望通过子类来初始化从父类继承过来的属性,但是又不能直接调用父类的构造函数
用this关键字不合适,因为这是父类的属性,用父类的构造函数更加合适
* 【原因】
* 在父类的构造函数中,可能存在对于初始化操作的一个限制和约束,这个限制和约束是为了保证代码的业务逻辑符合生活要求,
* 但是如果在子类中直接使用this来赋值继承而来的父类的属性,没有通过判断和约束,可能会导致代码的业务逻辑出现问题
*
* super关键字 调用父类方法 super只能指代直接父类
* 1.super关键字可以调用父类的构造函数和成员方法,也可调用变量名和对象名
super.xxx; //xxx为变量名或对象名
super.xxx(); //xxx为方法名
super(); 调用父类的初始化方法
* 如果调用构造函数,必须放在当前代码块的第一行
* 2.如果在代码中,没有显示调用父类的构造函数,那么Java编译器会在代码的编译阶段,自动帮你补
* 上一个符合条件的父类构造函数(隐式调用)
*
* 3.如果在子类中需要对父类的属性,进行初始化操作,那么只能通过super
* 关键字来调用父类的构造函数,不能在子类的构造函数中直接使用this赋值
* 4.super和this不能在同一个构造函数中去调用其他构造函数,因为super和this关键字在构造函数中都必须在第一行
5.类方法中不能有super