目录
1.3 类中访问时如何区分局部变量,本类成员变量和父类成员变量?
前言
上一篇文章中介绍了继承的定义,类图以及代码实现。今天小编继续带大家学习在继承类中如何访问成员变量和成员方法。
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(); //子类重名方法执行!
}
}