您的位置:首页 > 编程语言 > Java开发

java语言基础(36)——面向对象(多态的代码体现以及成员之间的访问关系)

2017-04-16 18:49 519 查看
首先我们回顾一下多态的前提和体现:

1 有继承关系

2 有方法重写

3 有父类引用指向子类对象

用代码说话:

class Animal
{
public int maxAge = 0;

public void call(){
System.out.println("动物会叫");
}

public static void sleep(){
System.out.println("动物需要睡觉");
}
}
class Cat extends Animal // 继承
{
public int maxAge = 20;
public int averageAge = 15;

public void call(){ // 方法重写
System.out.println("小猫喵喵叫");
}

public void zhuoLaoShu(){
System.out.println("小猫会捉老鼠");
}

public static void sleep(){
System.out.println("小猫需要睡觉");
}
}
class Dog extends Animal // 继承
{
public int maxAge = 30;
public int averageAge = 20;

public void call(){ // 方法重写
System.out.println("小狗汪汪叫");
}

public void watchDoor(){
System.out.println("小狗会看门");
}

public static void sleep(){
System.out.println("小狗需要睡觉");
}
}

class DuoTaiDemo
{
public static void main(String[] args){
Animal a = new Cat(); // 父类引用指向子类对象
Animal a1 = new Dog(); // 父类引用指向子类对象

// (1)多态中成员变量之间的访问关系
// 规律:编译看左边 运行看左边
// 父类有什么就使用什么,父类没有就报错
System.out.println(a.maxAge); // 0
System.out.println(a1.maxAge); // 0
//System.out.println(a.averageAge); // 编译报错 找不到符号 averageAge
//System.out.println(a1.averageAge);// 编译报错 找不到符号 averageAge

System.out.println("-----------");

//(2)多态中构造方法之间的访问关系
//规律: 创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化

System.out.println("-----------");

// (3) 多态中成员方法之间的访问关系
// 规律:编译时看左边,执行时看右边
// 编译时外界看到的是父类,只能调用父类中有的方法
// 而执行的时候,其实是子类的call方法覆盖了父类的call方法,
// 所以执行的是子类中的call方法。
a.call();//输出 小猫喵喵叫 证明调用了子类的call方法
//a.zhuoLaoshu();//编译报错 :找不到符号a.zhuoLaoshu();
a1.call();//输出 小狗汪汪叫 同样证明调用了子类的call方法
//a1.watchDoor();//编译报错 :找不到符号a1.watchDoor();

System.out.println("-----------");

// (4) 多态中静态方法之间的访问关系
// 规律:编译看左边,执行看左边
// 由于静态是和类相关的,所以静态不存在重写
a.sleep(); // 动物需要睡觉 证明调用了父类的sleep方法
a1.sleep();// 动物需要睡觉 证明调用了父类的sleep方法

}
}

通过上述代码分析,我们不难总结出,多态中,编译时,还是看父类的各成员,只有在执行的时候,由于成员方法有重写现象,执行了子类的成员方法,像成员属性,和静态方法,还是执行父类的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐