多态_1

多态_11 多态的概念 某一个事物 在不同时刻 或条件下 表现出来的不同状态 2 Java 语言中的多态指什么呢 同一个对象 的行为 方法 在不同的时刻或条件下 表现出不同的效果 java 语言中的多态 a 编译时多态 方法重载 overload b 运行时多态

大家好,我是讯享网,很高兴认识大家。
1.多态的概念

某一个事物,在不同时刻(或条件下)表现出来的不同状态


讯享网

2.Java语言中的多态指什么呢?

“同一个对象”的行为(方法),在不同的时刻或条件下,表现出不同的效果。

  • java语言中的多态:
  • a. 编译时多态:方法重载(overload)
  • b. 运行时多态: 才是今天所学习的多态
3.举例
 比如,对于一只波斯猫,我们在讨论猫这个主题的时候,我们可以说波斯猫是一只猫: 猫cat = new 波斯猫(); 但是,在我们谈论动物这个主题的时候,我们也可以说波斯猫是一种动物: 动物 animal = new 波斯猫(); 还比如,水在不同温度下的状态。 

讯享网
4.实现多态的前提条件
讯享网 * 1. 继承(有了继承,才有子类对象) * 2. 方法覆盖(父类中被覆盖的方法,才会有多态效果) * 3. 父类引用指向子类实例: * 父类类型 引用变量 = new 子类类型() * 
5.多态的成员访问特征
  1. 成员变量:编译看左边,运行看左边
 也就是说(如果父类子类定义了同名成员变量), 实际访问到的究竟是父类还是子类中定义的成员变量值,取决于引用类型。 比如说: 如果父类引用指向子类对象,那么父类引用.name就是父类本身的name成员变量的值 如果子类引用指向子类对象,那么子类引用.name就是子类本身的name成员变量的值 
  1. 成员方法:编译看左边,运行看右边
讯享网 也就是说: 父类引用实际指向的是哪种子类对象,方法执行的就是哪种子类中定义的方法 
  1. 编译看左边,怎么理解
 * 通过引用变量可以访问到的成员的范围,是由引用变量类型决定的 * a. 访问对象,都是通过引用变量来访问的,引用变量,就相当于我们手上的遥控器 * b. 遥控器提供什么样的功能,我们就只能使用遥控器提供的哪些那些功能,去操作电视机执行哪些功能 * * c. 所以同样的道理,引用变量,就是访问对象时,我们手中的遥控器,引用变量所属类型中包含哪些成员 * 我们通过该类型的引用变量,就只能访问这些,引用类型中定义过的成员 
6.如何简单地理解,多态成员的访问特征
讯享网 * 对于成员变量 * 成员变量表示对象的属性,对象的属性也就是对象的长相(外貌) * 多态中,用父类引用,指向子类实例(对象),就好像给一个子类对象,披上了父类的马甲,所以导致子类对象 * 看起来,样子就是父类对象的样子(外貌),所以通过父类引用访问子类对象的同名成员变量,得到父类中的同名成员变量的值 * * 对于成员方法 * 虽然,子类对象披上了父类的外衣,外貌看起来是父类对象的样子,但是因为实际还是一个子类对象, * 所以表现出的行为还是子类对象自己的行为 
7.代码说明
public class Demo1 { 
    public static void main(String[] args) { 
    //basicPloymorphism(); //声明一个父类类型的引用 Animal animal; //测试多态,成员方法的访问特征 animal = new Dog(); //animal.shout(); //System.out.println("汪汪汪"); //访问成员方法时,运行看右边 System.out.println(animal.name); //xxxAnimal animal = new Cat(); //animal.shout(); //喵喵喵 //animal.favoriate(); System.out.println(animal.name); //xxxAnimal //访问成员变量时,运行看左边 } private static void basicPloymorphism() { 
    //声明一个父类类型的引用 Animal animal; //指向一个子类,Dog类对象 animal = new Dog(); animal.shout(); // System.out.println("汪汪汪"); testPloymorphism(animal); //指向另外一个子类,Cat类对象 animal = new Cat(); animal.shout(); //喵喵喵 testPloymorphism(animal); animal = new Animal(); animal.shout(); //animal shouting testPloymorphism(animal); } public static void testPloymorphism(Animal animal) { 
    animal.shout(); // 究竟执行具体的什么样的行为,是只有在运行的时候, // jvm执行方法调用的时候,才知道究竟执行的是哪个类的方法 } } class Animal { 
    String name = "xxxAnimal"; int i = 100; public void eat() { 
    System.out.println("animal eating"); } public void shout() { 
    System.out.println("animal shouting"); } } class Dog extends Animal { 
    String name = "xxxDog"; @Override public void eat() { 
    System.out.println("狗啃骨头"); } @Override public void shout() { 
    System.out.println("汪汪汪"); } } class Cat extends Animal { 
    String name = "xxxCat"; @Override public void eat() { 
    System.out.println("猫吃鱼"); } @Override public void shout() { 
    System.out.println("喵喵喵"); } //子类自己定义的方法 public void favoriate() { 
    System.out.println("撒娇卖萌"); } } 
8.多态的优点
讯享网 * 多态的好处 提高了程序的维护性(由继承保证) 提高了程序的扩展性(由多态保证) 
9.多态的弊端
* 多态的弊端:不能访问子类特有功能(多态实现的第三个前提,父类引用指向子类对象) * * * * 如何解决多态的弊端呢? 引用变量的类型转化(父类和子类) * 类型转化方向: * a. 子类类型的引用 -> 父类类型的引用(编译器允许的) * b. 父类类型的引用 -> 子类类型的引用(编译器默认不允许的) * 可以通过强制类型转化的语法实现 * * 目标类型 变量 = (目标类型) 待转化的变量 * * * 如何判断,一个引用变量指向的对象,所属实际类型 * instanceof 作用判断某个引用变量所指向的对象,是否是某种类型的对象 * * 对象名 instanceof 目标类型 运算结果 boolen true 表示对象是该目标类型的对象 * false 对象不是该目标类型的对象 * * 对象名所代表的对象,是否是目标类型的对象 * * 对象名实际是 引用变量 * 所有的引用变量 都可以取一个值 null * * null instanceof 某个数据类型 结果 true??? * null instanceof 任何类型 结果固定 都是false 
讯享网public class TestFlaw { 
    public static void main(String[] args) { 
    // Duck duck = new Duck(); // //子类类型的引用 -> 父类类型的引用 // Animal animal = duck; //父类类型的引用 -> 子类类型的引用 Animal a = new Animal(); //System.out.println(a instanceof Duck); //通过强制类型转化 //Duck d = (Duck) a; //ClassCastException //d.swim(); //正确的强制类型转化 //a = new Duck(); // 利用 instanceof 判断a 引用指向的对象 是否是Duck类型的对象 //System.out.println(a instanceof Duck); //Duck du = (Duck) a; //du.swim(); // //collectNew(new Duck()); //collectNew(new Dog()); // //System.out.println(); //验证null instanceof 目标类型 Animal ani = null; System.out.println(null instanceof TestFlaw); System.out.println(ani instanceof Animal); } //利用多态来实现 public static void collectNew(Animal animal) { 
    // 想办法判断,animal引用指向的对象,实际一定要是Duck if(animal instanceof Duck) { 
    //如果是鸭子的话 Duck duck = (Duck) animal; duck.swim(); } //其他类型动物 animal.shout(); //收集声音并研究 } } 
小讯
上一篇 2025-03-17 07:25
下一篇 2025-02-15 10:26

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/31251.html