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方法
}
}
通过上述代码分析,我们不难总结出,多态中,编译时,还是看父类的各成员,只有在执行的时候,由于成员方法有重写现象,执行了子类的成员方法,像成员属性,和静态方法,还是执行父类的。
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方法
}
}
通过上述代码分析,我们不难总结出,多态中,编译时,还是看父类的各成员,只有在执行的时候,由于成员方法有重写现象,执行了子类的成员方法,像成员属性,和静态方法,还是执行父类的。
相关文章推荐
- 一.OC基础之:1,OC语言的前世今生 ,2,OC语言入门,3,OC语言与C的差异,4,面向对象,5,类和对象的抽象关系,6,类的代码创建,7,类的成员组成及访问
- C#基础知识复习1代码规范-执行流程(c#)-面向对象-引用命名空间-封装-继承-访问修饰符-虚方法-静态成员-多态-抽象类等
- java语言基础(31)——面向对象(继承中的成员关系)
- java 基础 面向对象(多态中的成员访问特点之静态成员成员方法)
- java语言基础(37)——面向对象(多态中的向上转型和向下转型)
- java语言基础(40)——面向对象(类与类、类与接口及接口与接口的关系)
- Java语言基础{Java_se(05)}-面向对象-封装-构造方法-成员变量,局部变量
- java语言基础(48)——局部内部类访问外部成员和局部成员
- java语言基础(21)——面向对象(成员变量和局部变量的区别)
- java中静态成员与非静态成员之间的访问关系
- java语言基础之构造函数深入以及构造函数和构造代码块比较-作者:逝秋
- java语言基础(44)——不同包下类之间的访问及import关键字的引入
- Java基础详解 (一)Java的类成员访问权限修饰词(以及类访问权限)
- java语言基础(23)——面向对象三大特性(封装、继承、多态)
- Javascript入门基础知识和在HTML中的引用方式以及与JAVA之间的关系
- java语言基础(47)——成员内部类访问外部类的成员(类名.this范围限定)
- java基础(八)Math/代码块/继承成员方法指南的关系/继承中成员变量之间的关系/方法的重写/继承中构造方法之间的关系/this和super的区别
- java语言基础(26)——面向对象(类的设计及成员变量定义注意事项)
- 黑马程序员_Java基础_面向对象(概述、类与对象关系、成员变量、封装private、构造函数和构造代码块、this关键字)
- 黑马程序员-Java语言基础–面向对象 第8天