在子类中调用父类中的方法,父类方法中的this指向谁?

父类:

public class Fu {
    public Fu(){
        System.out.println(this.getClass().getName());
        this.f1();
    }

    public void f1(){
        System.out.println("1234");
    }
}

子类:

public class Zi extends Fu{
    public Zi(){

    }

    public void hello(){
        System.out.println("hello");
    }
}

测试类

public class test {
    public static void main(String[] args) {
        Zi zi = new Zi();
    }
}

输出结果为:
Zi
1234
在执行System.out.println(this.getClass().getName()); 语句时就充分说明,this是指向子类对象的。
当执行this.f1(); 时,子类中没有这个方法,所以去父类中找。结果输出为1234。

//可以理解为
//在执行 Zi zi = new Zi(); 时
public Zi(){
	super();
}
//代码执行等同于
public Zi(){
	System.out.println(this.getClass().getName());
    this.f1();
}
//所以当你将 f1 方法换成 Zi的hello 方法时,输出为
//Zi
//hello

但是成员变量是否和成员方法的结果是一致的呢???
父类:

public class Fu {
    int a = 11;
    public Fu(){ }

    public Fu(int i){
        System.out.println(this.getClass().getName());
        this.f1();
        System.out.println(this.a);
    }

    public void f1(){
        System.out.println("1234");
    }
}

子类:

public class Zi extends Fu{
    int a = 12;
    public Zi(){
        super(1);
    }

    public void f1(){
        System.out.println("hello");
    }
}

测试类

public class test {
    public static void main(String[] args) {
        Zi zi = new Zi();
        System.out.println(zi.a);
    }
}

输出结果
在子类中调用父类中的方法,父类方法中的this指向谁?_第1张图片

/**
执行流程为:
Zi zi = new Zi();    ---------->
super(1);            ---------->
System.out.println(this.getClass().getName());  //ZI
this.f1();   //hello
System.out.println(this.a);   //11  ------->
完成zi对象的创建   -------->
System.out.println(zi.a);    //12
*/

借用其他前辈的一句话
java中继承关系的父子类,相同的方法会被重写,那相同的变量会怎样呢?

答案是变量没有重写之说,如果子类声明了跟父类一样的变量,那意谓着子类中将有两个相同名称的变量;
出处:

https://blog.csdn.net/ccccdddxxx/article/details/7896216?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159452917819195264502806%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=159452917819195264502806&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v3~pc_rank_v3-1-7896216.pc_ecpm_v3_pc_rank_v3&utm_term=java+%E7%BB%A7%E6%89%BF+%E6%88%90%E5%91%98%E5%8F%98%E9%87%8F%E8%AE%BF%E9%97%AE%E7%9A%84%E7%89%B9%E7%82%B9

我对前辈这句话的理解就是,变量不存在重写,只是两者作用的范围不一样。当子类中没有和父类重名的变量时,父类变量作用范围 是自己和其他子类且可以任意调用。 当子类中 有和父类重名的变量时,那么父类的作用范围就受到了限制,在子类中,只能通过super去调用,this的方法就不能调用了。

结合图片和案例:
在子类中调用父类中的方法,父类方法中的this指向谁?_第2张图片
自己的总结:
当子类父类中的成员没有冲突时,子类都可以通过this去调用。
当 成员方法 重名,子类就会将父类中的方法进行重写。如果还想调用父类中的方法只能通过 super去进行调用。
当时成员变量不存在覆盖重写:在子类中只能通过super调用父类的,但是你都进去父类 这个类里面去了,在去调用this.变量名,只能调用到父类的。super圆圈里也属于this。

你可能感兴趣的:(javaEE,java)