Java面向对象之——继承(2)如何访问成员方法和成员变量

目录

前言

1.访问成员变量

1.1 规则

1.2 代码实现

1.3 类中访问时如何区分局部变量,本类成员变量和父类成员变量?

2.访问成员方法

2.1规则

2.2代码实现


前言

上一篇文章中介绍了继承的定义,类图以及代码实现。今天小编继续带大家学习在继承类中如何访问成员变量和成员方法。

1.访问成员变量

1.1 规则

两种情况(成员变量重名与不重名的情况)

成员变量不重名的情况下:【1】如果创建的父类对象,那么只能使用父类的东西,没有任何子类的东西。【2】如果创建的是子类对象,也就是说new的子类,那么子类父类的成员变量和成员方法都可以使用,子类没有的方法向父类找。

在父子类的继承关系当中,如果成员变量重名,则创建子类对象时,访问有两种方式:

【3】直接通过子类对象访问成员变量:    等号左边是谁,就优先用谁,没有则向上(父类)找。

【4】间接通过成员方法访问成员变量:    该方法属于谁,就优先用谁,没有则向上找。

1.2 代码实现

//父类
public class Fu {
    int numFu=10;
    int num=100;

    public void methodFu(){
        //用的是本类当中的num
        System.out.println(num);
    }
}
//子类
public class Zi extends Fu{
    int numZi=20;
    int num=200;

    public void methodZi(){
        //因为本类当中有num,所以这里用的是本类的num
        System.out.println(num);
    }
}
//使用
public class Demo01ExtendsField {
    public static void main(String[] args) {
        //【1】如果创建的父类对象,那么只能使用父类的东西,没有任何子类的东西。
        Fu fu=new Fu();     //创建父类对象
        System.out.println(fu.numFu);   //10
        System.out.println(fu.num);     //100

        //【2】如果创建的是子类对象,也就是说new的子类,那么子类父类的成员变量和成员方法都可以使用.
        Zi zi=new Zi();
        System.out.println(zi.numZi);       //20
        System.out.println(zi.numFu);       //10
        System.out.println("*****************************");

        //【3】重名:直接通过子类对象访问成员变量:等号左边是谁,就优先用谁,没有则向上(父类)找。
        System.out.println(zi.num);     //优先子类,200

        //【4】重名:间接通过成员方法访问成员变量:    该方法属于谁,就优先用谁,没有则向上找。
        zi.methodZi();      //200 ,这个方法是子类的,优先用子类的,没有再向上(父类)
        zi.methodFu();      //100 ,这个方法实在父类当中定义的,属于父类,优先使用父类
    }
}

1.3 类中访问时如何区分局部变量,本类成员变量和父类成员变量?

格式:

局部变量:直接写成员变量名

本类的成员变量: this.成员变量名

父类的成员变量:super.成员变量名

//父类
public class Fu {
    int num=10;
}
//子类
public class Zi extends Fu {
    int num=20;
    public void method(){
        int num=30;
        System.out.println(num);        //30,局部变量
        System.out.println(this.num);   //20,本类的成员变量
        System.out.println(super.num);  //30,父类的成员变量
    }
}

2.访问成员方法

2.1规则

在父子类的继承关系中,创建子类对象,访问成员方法的规则: 创建的对象是谁,则优先用谁,如果没有,则向上(父类)找。如果子类覆盖重写了父类的方法,创建的是子类对象,优先使用子类方法。

2.2代码实现

public class Fu {
    public void methodFu(){
        System.out.println("父类方法执行!");
    }

    public void method(){
        System.out.println("父类重名方法执行!");
    }
}

public class Zi extends Fu {
    public void methodZi(){
        System.out.println("子类方法执行!");
    }

    public void method(){
        System.out.println("子类重名方法执行!");
    }

}

public class Demo01ExtendsMethod {
    public static void main(String[] args) {
        Fu fu=new Fu();
        fu.methodFu();  //父类方法执行!

        Zi zi=new Zi();
        zi.methodZi();   //子类方法执行!new子类,优先用子类
        zi.methodFu();  //父类方法执行!子类当中没有,则向父类找

        //创建的是new子类对象,所以优先使用子类方法
        zi.method();        //子类重名方法执行!
    }
}

猜你喜欢

转载自blog.csdn.net/wtt15100/article/details/108117150