一、this 关键字
1、this 演示
vi Person.java
public class Person {
    String name;
    int age;
    //显示声明构造器
    public Person(String s , int i){
        name = s;
        age = i;
    }
    public void setAge(int age){
        age = age;
    }
}
vi PersonTest.java
public class PersonTest {
    public static void main(String[] args) {
        Person p1  = new Person("jack",20);
        p1.setAge(11);
        System.out.println(p1.name + p1.age);
    }
}
我们上面写了一段代码,看起来没什么问题,但是是有坑的。 我们先执行一下test文件
jack20可以看到和我们的预期的jack11是不相符的, p1.setAge(11) 没有生效,相关的逻辑如下
    public void setAge(int age){
        age = age;
    }我们给形参定义的名称age,和成员属性是一样的,直接这么用谁也不知道那个是那个,在这里就可以通过this.age 来声明这个age是当前类下面的age,不是当前方法下的age
vi Person.java
public class Person {
    String name;
    int age;
    //显示声明构造器
    public Person(String s , int i){
        name = s;
        age = i;
    }
    public void setAge(int age){
        this.age = age;
    }
}

2、多个构造器
有一种情况,我们可能根据传入的参数数量或者类型不同,会进行不同类型的形参接受来区分不同的后续逻辑
vi Person.java
public class Person {
    String name;
    int age;
    //显示声明构造器
    public Person(){
       System.out.println("111");
    }
    public Person(String s ){
        System.out.println("111");
        name = s;
    }
    public Person(String s , int i){
        System.out.println("111");
        name = s;
        age = i;
    }
    public void setAge(int age){
        this.age = age;
    }
}
vi PersonTest.java
public class PersonTest {
    public static void main(String[] args) {
        Person p1  = new Person();
        Person p2  = new Person("jack");
        Person p3  = new Person("jack",20);
    }
}
返回
111
111
111我们上面定义了3个构造器,可以通过传参不同自动识别到不同逻辑的构造器中,像这种在构造器中重复的代码,也是可以通过this继承的
vi Person.java
public class Person {
    String name;
    int age;
    //显示声明构造器
    public Person(){
       System.out.println("111");
    }
    public Person(String s){
        this();   //添加 直接用this 会去找Person() 形参为空的构造器
        name = s;
        System.out.println("构造器2  (String s )");
    }
    public Person(String s , int i){
        this(s);   //添加 Person(s)  会找形参变量名称为s 的变量
        name = s;
        age = i;
    }
    public void setAge(int age){
        this.age = age;
    }
}

我们在构造器2和构造器3中分别添加了一个this() 和this(s)的操作,他的含义是,第二个构造器会继承形参为空的同名构造器,继承的时候会在初始化时自动执行对应下面的属性, 第三个构造器会去继承同名构造器的形参为s的操作 ,同理,如果我们单独去调用构造器3,那么他会执行第二个构造器,第二个构造器又会继承形参为空的构造器,执行效果如下
vi PersonTest.java
public class PersonTest {
    public static void main(String[] args) {
        Person p3  = new Person("jack",20);
    }
}

3、this小结

二、继承
1、继承案例
vi Person.java
class Person {
    public String name;
    public int age;
    public String zex;
}
class Student {
    public String name;
    public int age;
    public String zex;
    public String school;
}
我上面写了两个类,但他们存在大量重复的属性,当遇到这种冗余代码,我们可以通过继承来简化代码,继承的关键字是extends,写在子类定义的后面,如下
vi Person.ava
class Person {
    public String name;
    public int age;
    public String zex;
}
class Student extends Person {
    public String school;
}
Student 类会继承Person的所有属性和方法,并且增加一个自身的school的属性
2、继承使用的逻辑

在java中,如果没有声明继承的类,那么会默认继承java.lang.object

三、方法的重写
我们上面说了继承,被继承的类称为父类,继承的类称为子类,当子类不想使用父类中继承的某个方法时,子类可以重写定义继承的方法
vi person.java
class Person {
    public String name;
    public int age;
    public String zex;
    //新增方法
    public Account sed(){
        System.out.println("123");
        return null;
    }
}
class Student extends Person {
    public String school;
}
vi PersonTest.java
public class PersonTest {
    public static void main(String[] args) {
        //调用子类Student调用继承的方法
        Student s3  = new Student();
        s3.sed();
    }
}
我们在上面继承的案例上添加了一个方法sed ,但是我们想要在通过子类进行调用的时候时候使用子类自己的方法, 实际操作就是在子类下定义一个相同名称的方法
vi Person.java
class Person {
    public String name;
    public int age;
    public String zex;
    //新增方法
    public Account sed(){
        System.out.println("123");
        return null;
    }
}
class Student extends Person {
    public String school;
    //新增子类独立方法
    public Account sed(){
        System.out.println("456");
        return null;
    }
}
重写和重载的区别

四、super 关键字
我们虽然在子类中定义了重写方法,但是我们依旧可以对父类中被重写的方法进行调用
1、子类调用父类方法

说白了,现在就是想要在子类里面直接去调用父类的方法
vi Person.java
class Person {
    public String name;
    public int age;
    public String zex;
    //新增方法
    public Account sed(){
        System.out.println("123");
        return null;
    }
}
class Student extends Person {
    public String school;
    public Account sed(){
        System.out.println("456");
        return null;
    }
    public Account test1(){
        //子类调用父类方法
        super.sed();
        return null;
    }
}
vi PersonTest.java
public class PersonTest {
    public static void main(String[] args) {
        Student s3  = new Student();
        s3.test1();
    }
}
上面我们是继承了父类的子类需要加super,如果不继承的话,子类能直接调用父类方法,sed(); 或者this.sed(); 这里加不加this.都是调用父类的方法,因为子类没有重写
如果子类和父类中都有定义相同名称的变量,那么就近原则,子类变量优先,子类没有该变量,才会去找父类的值
2、super调用方法

3、调用父类的构造器

我们在子类的构造器中,使用super()的时候会去调用父类的空参构造器,如果要调用带参数的构造器,那么需要在super(参数),super()调用构造器,必须在第一行
4、super调用构造器的过程






















