【java笔记】this和super简介

本来是确认构造函数的运行方式的。
结果看到继承以及super关键字了…^^;;

都说this是类似于指自己的一个指针,super是更像一个关键字。
可能我的了解不是那么深入,觉得this就是指自己super就是指父类。其余没感觉到什么特别。
而且感觉前期了解这些就可以了,后面对Java有更深层次的了解后继续在研究~
下面是我简单的试一试,做个记录…^^

1.this指向自己。
2.super指向父类。
3.多层继承时,super指向离自己最近的上一层父类。
4.不能同时继承类和接口,也不能同时继承抽象类和接口。
5.构造函数中使用this或super时,必须写在第一行。而且不能同时使用。

我先创建了以下文件。
图片备用地址
文件目录结构

先看看每个文件的代码

【Animal】一个普通的类和函数。

package supertest.animal;

public class Animal {
    // 姓名属性,和子类的值不一样
    protected String name = "animalName";

    // 无参构造函数
    public Animal() {
        System.out.println("Animal: There are no parameters");
    }

    // 有参构造函数
    public Animal(String str) {
        System.out.println("parameters:" + str);
    }

    // 父类的函数,子类会重写这个函数
    public void run(String str) {
        System.out.println(str+ ":" + Animal.class);
    }
}

【Horse】子类继承了Animal父类

package supertest.MammalInt;

import supertest.animal.Animal;

public class Horse extends Animal {
    // 姓名属性,和父类的值不一样
    protected String name = "horseName";

    // 无参构造函数
    public Horse() {
        // 这里执行父类有参的构造函数
        super("super has parameters");
        System.out.println("Horse: There are no parameters.");
    }

    // 有参构造函数
    public Horse(String str) {
        System.out.println("parameters:" + str);
    }

    // 查看this和super的name
    public void printName(){
        System.out.println("---------------------this.name------------------------");
        System.out.println("this.name:" + this.name);
        System.out.println("---------------------super.name-----------------------");
        System.out.println("super.name:" + super.name);
    }

    // 重写了父类的run函数
    public void run(String str) {
        System.out.println(str+ ":" + Horse.class);
    }

    // 查看this和super的run函数
    public void testRun(String name) {
        System.out.println("---------------------this.run-------------------------");
        this.run(name);
        System.out.println("---------------------super.run------------------------");
        super.run(name);
    }
}
package test.supertest;

import test.supertest.animal.Animal;
import test.supertest.MammalInt.Horse;

public class main {
    public static void main(String[] args) {
        // 先执行父类的构造函数,然后在执行子类的构造函数
        System.out.println("---------------------constructor----------------------");
        Horse horse = new Horse();

        // 查看this和super的name
        horse.printName();

        // 查看this和super的函数
        horse.testRun("testRun");
    }
}

编译以后,可以查看结果

$ javac supertest/animal/Animal.java supertest/MammalInt/Horse.java supertest/main.java

$ java supertest.main
---------------------constructor----------------------
parameters:super has parameters
Horse: There are no parameters.
---------------------this.name------------------------
this.name:horseName
---------------------super.name-----------------------
super.name:animalName
---------------------this.run-------------------------
testRun:class supertest.MammalInt.Horse
---------------------super.run------------------------
testRun:class supertest.animal.Animal

欢迎大家的意见和交流

email: li_mingxie@163.com