Java基础之多态

tech2025-05-26  5

文章目录

多态代码示例1.定义一个动物类2.创建狗类继承动物类3.示例测试类 总结多态中的数据类型装换

多态

多态: 同一种事物,在不同时刻表现不同的状态

Java编程中多态存在的三个必要条件

要有继承(包括接口的实现)要有方法重写父类引用指向子类对象

代码示例

1.定义一个动物类

package Polymorphism; /** * 动物类 * */ public class Animal { // 静态成员变量 static int num = 10; // 非静态成员变量 int number = 1; // 动物的固有属性--名字,年龄 private String name; private int age; // 动物的共有行为(功能 方法) public void eat() { System.out.println("Animal eat"); } public static void sleep() { System.out.println("Animal sleep"); } // setXxx,getXxx成员方法 public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } }

2.创建狗类继承动物类

package Polymorphism; /* * 狗类继承动物类 */ public class Dog extends Animal { // 静态成员变量 static int num = 20; // 非静态成员变量 int number = 2; // 狗的私有属性---品种 private String type; // 狗的功能 public void function() { System.out.println("Dog function"); } // 重写父类中非静态方法 public void eat() { System.out.println("Dog eat"); } // 重写父类中的静态方法 public static void sleep() { System.out.println("Dog sleep"); } // setXxx,getXxx成员方法 public void setType(String type) { this.type = type; } public String getType() { return type; } }

3.示例测试类

多态:编译看左边,运行看右边

package Polymorphism; /* * 测试类 * */ public class Test { public static void main(String[] args) { // 定义动物类---父类引用指向子类对象 Animal animal = new Dog(); // 编辑时调用Animal的方法,运行时调用Dog的方法 // 即编辑看左边,运行看右边(非静态成员方法) animal.eat();// 执行Dog(子类)中重写Animal(父类)中的eat方法 // 对于静态方法:编辑看左边,运行也看左边 // 因为静态方法属于类 Animal.sleep(); // 变量不存在被子类覆写这一说法,只有方法存在覆写。 // 非静态成员变量(编译看左边,运行看左边) System.out.println(animal.number+"::"+animal.animal); // 注意:子类可以访问父类中的非私有成员变量 Dog dog = (Dog)animal;// 强制类型转换为Dog System.out.println("dog对象中访问成员变量"+dog.number+"::"+dog.animal+"::"+dog.dog); // 静态成员变量(编译看左边,运行看左边) System.out.println(animal.num+"::"+dog.num); } }

运行结果:

Dog eat Animal sleep 1::11 dog对象中访问成员变量2::11::22 10::20

总结

在编程时一般情况下提倡 低耦合,高聚合。也就是降低联系,增强独立。

多态中的数据类型装换

向上转型:子类类型转换为父类类型 小类型 转 大类型(可以直接转换)

向下转型:把父类类型转换为子类类型 大类型 转 小类型(需要强制类型转换)

在上面最后的案例中,我们发现当父类中有该方法,并且子类中重写该方法时,有编辑看左边,运行看右边。

但是当父类中没有子类的特有方法时,该如何调用???

转型(该案例只是说明向下转型) package Polymorphism; /* * 多态中的类型转换 * * */ public class Demo { public static void main(String[] args) { //创建狗类对象 Animal dog = new Dog(); //创建该类对象 Demo demo = new Demo(); //非静态方法通过对象名调用 demo.feed(dog); } // 封装方法 public void feed(Animal animal) { // 调用子类重写了父类的方法 // 在编译期间调用的是父类中的方法,但是由于子类重写了eat方法,在实际运行时,会调用子类中的eat方法 animal.eat(); // 当只调用子类中的方法时 // 需要类型装换 Dog dog = (Dog)animal; // 向下转型后通过对象名调用方法 dog.function(); } }

运行结果:

Dog eat Dog function
最新回复(0)