多态与动态绑定

声明:代码和图片是本人在学习期间复制尚学堂课件中的资料,对其做一下总结。

abstract class Animal {

private String name;

Animal(String name) {this.name = name;}

/*

public void enjoy(){

System.out.println("叫声......");

}

*/

public abstract void enjoy();

}

abstract class Cat extends Animal {

private String eyesColor;

Cat(String n,String c) {super(n); eyesColor = c;}

/*

public void enjoy() {

System.out.println("猫叫声......");

}

*/

//public abstract void enjoy();

}

class Dog extends Animal {

private String furColor;

Dog(String n,String c) {super(n); furColor = c;}

public void enjoy() {

System.out.println("狗叫声......");

}

}

class Bird extends Animal {

Bird() {

super("bird");

}

public void enjoy() {

System.out.println("鸟叫声......");

}

}

class Lady {

private String name;

private Animal pet;

Lady(String name,Animal pet) { //父类引用指向子类对象,系统会将引用类型当做父类来看待,只能获取父类成员,子类成员被屏蔽掉。要想获取子类成员需要强制类型转换为子类对象,这带来极大的可扩展性。这就是多态。

this.name = name; this.pet = pet;

}

public void myPetEnjoy(){pet.enjoy();}//用父类的引用访问时,只能看到子类中父类的成员,但调用子类的方法时,是当成子类对象来看待的,这就是动态绑定。

}

public class Test {

public static void main(String args[]){

Cat c = new Cat("catname","blue");

Dog d = new Dog("dogname","black");

Bird b = new Bird();

//Lady l1 = new Lady("l1",c);

Lady l2 = new Lady("l2",d);

Lady l3 = new Lady("l3",b);

//l1.myPetEnjoy();

l2.myPetEnjoy();

l3.myPetEnjoy();

}

}

---------------------------------------------------------------
运行结果:猫叫声。。
                  狗叫声。。

---------------------------------------------------------------

多态与动态绑定

时间: 2024-10-17 00:14:28

多态与动态绑定的相关文章

java基础疑难点总结之成员变量的继承,方法重载与重写的区别,多态与动态绑定

1.成员变量的继承 1.1要点 子类用extends关键字继承父类.子类中可以提供新的方法覆盖父类中的方法.子类中的方法不能直接访问父类中的私有域,子类可以用super关键字调用父类中的方法.在子类中可以增加域,增加方法或者覆盖超类的方法,然而绝对不能删除继承的任何域和方法. 在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象.所以所谓的继承使子类拥有父类所有的属性和方法其实可以这样理解,子类对象确实拥有父类对象中所有的属性

Java多态之动态绑定

目录 Java多态之动态绑定 引用变量的类型 编译时类型 运行时类型 方法绑定 静态绑定 动态绑定 方法表 Java多态之动态绑定 上篇回顾:多态是面向对象程序设计非常重要的特性,它让程序拥有 更好的可读性和可扩展性. 发生在继承关系中. 需要子类重写父类的方法. 父类类型的引用指向子类类型的对象. 自始至终,多态都是对于方法而言,对于类中的成员变量,没有多态的说法. 上篇说到:一个基类的引用变量接收不同子类的对象将会调用子类对应的方法,这其实就是动态绑定的过程.在理解动态绑定之前,先补充一些概

QF——OC的多态,动态绑定及实现原理

多态: 封装,继承,多态是面向对象的三大特征. 那多态到底是什么呢? 多态:允许不同的类定义相同的方法,OC能自己判断,不会混乱. 动态类型:程序直到运行时才知道对象所属的类. 动态绑定:基于动态类型,程序直到运行时才能确定要执行的方法. 多态:父类的指针可以指向子类的对象.这句话一定要深刻理解,请看几行代码: Animal * obj = [[Dog alloc] init]; [obj eat]; 虽然该obj前面是Animal类,也就是说它被声明是Animal类的一个指针,但是在运行 [o

java 多态与动态绑定的理解

先来一段百度来的定义和概念 什么是多态: 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法. 多态的作用:消除类型之间的耦合关系. 接着看到了这样

Java之多态(动态绑定)

封装通过合并特征和行为来创建新的数据类型,"实现隐藏"则通过细节"私有化"把接口和实现分离. 继承可以允许向上转型,将对象视为它自己本身的类型或其基类来加以处理,但是这必须满足"is a"关系,而多态则消除类型之间的耦合关系,允许一种类型表现出与其他相似类型之间的区别,只要他们都是从同一个基类导出而来.多态通过分离做什么和怎么做,从另一个角度讲接口和实现分离开. 但是继承的向上转型会缩小接口,使得派生类扩展的方法向上转型之后不能使用. packa

多态和动态绑定

变量设为父类可以给程序的运行带来最大的灵活性. 多态/动态绑定: 在执行期间.当调用方法时,只要方法不唯一,经过了多次重写,那么调用的方法会根据new的方法来确定.可扩展性最好. 在执行期间.判断所引用的对象的实际类型,根据其实际的类型调用其相应的方法. 多态的存在有三个必要的条件: 1.  要有继承关系. 2.  要有重写. 3.  父类引用指向子类对象.

四. Java继承和多态4. 多态和动态绑定

在Java中,父类的变量可以引用父类的实例,也可以引用子类的实例. 请读者先看一段代码: public class Demo { public static void main(String[] args){ Animal obj = new Animal(); obj.cry(); obj = new Cat(); obj.cry(); obj = new Dog(); obj.cry(); } } class Animal{ // 动物的叫声 public void cry(){ Syste

6.Java多态和动态绑定

在Java中,父类的变量可以引用父类的实例,也可以引用子类的实例. 请大家先看一段代码: public class Demo { public static void main(String[] args) { People obj = new People(); // 引用父类实例 obj.say(); obj = new Teacher(); // 引用子类实例 obj.say(); } } class People{ void say(){ System.out.println("大家好,

Java学习资料-方法覆盖、方法重载、多态与动态绑定

1.方法覆盖 方法覆盖就是子类定义一个和父类同名的方法来覆盖父类的方法.当父类方法在某些子类中被覆盖后,通常是子类调用父类,并做一些额外的其它工作. 使用方法覆盖应注意下面一些事项: 不使用super而希望引用父类方法会导致无限的递归,因为子类方法实际上是在调用它自己. 当通过父类引用调用一个方法时,Java会正确地选择与那个对象对应的类的覆盖方法.对于父类提供的方法,子类可以覆盖它,但这不是必须的,即子类也可以使用一个方法的父类版本. 方法覆盖中,子类在重新定义父类已有的方法时,应保持与父类完