关于java中的多态:
多态的几个概念: 向上转型 (upcasting) 子类型转换成父类型 自动类型转换 向下转型(downcasting) 父类型转换成子类型 强制类型转换【需要强制类型转换符】 注意:无论是向上转型还是向下转型,两种类型之间必须要有继承关系
package com.bjpowernode.jave.Test06;
public class OverRideTest2 {
public static void main(String[] args) {
//a1是Animal类型的 创建的对象是Bird类型的,其中Animal属于父类 Bird属于子类
//这是子类型转换为父类型 属于自动类型转化
Animal a1 = new Bird();
//在jvm底层中,实际执行的是Bird对象 所以a1.move();的执行结果是------鸟在飞翔
a1.move();
//这里我们不可以调用a1.catchWorm方法,虽然catchWorm()方法是Bird类中的
//因为java程序在执行的时候分为编译阶段和运行阶段 如果编译阶段无法通过的话,就无法进入到运行阶段
//其中编译阶段jvm只检查语法,可以看到a1是Animal类型的,而我们在Animal类中无法找到catchWorm()
//这个方法,所以无法编译通过
//如果我们想要让Animal类型的a1去访问Bird类中的catchWorm()方法,需要进行强制类型转换
Bird b1 = (Bird)a1;
b1.catchWorm();
//下面是一个很著名的异常
/*
* Animal a2 = new Bird();
* Fish f1 = (Fish)a2;
*/
//出现 java.lang.ClassCastException 异常 ** 类型转换异常
//这两句代码在编译阶段不会出现错误 因为a2是Animal类型的,属于父类 f1是Fish类型的 属于子类
//a2强制转换成f1没有问题
//但是在运行期 因为a2的底层是Bird类型 而 f1是Fish类型,Bird与Fish之间没有继承关系 所以无法进行类型转换
/*
* 我们想要避免类型转换异常可以使用instanceof运算符
* 语法结构: 引用 instanceof 数据类型名
* 它的运算结果是一个布尔类型
* 例如:a instanceof Bird
* 结果 true:a这个引用指向的对象是一个Bird类型
* false:a这个引用指向的对象不是一个Bird类型
* */
Animal a2 = new Bird();
if(a2 instanceof Bird) { //如果a2指向Bird对象
Bird b2 = (Bird)a2;
b2.catchWorm();
}
else if(a2 instanceof Fish) { //如果a2指向Fish对象
Fish f2 = (Fish)a2;
f2.swim();
}
}
}
//动物类
class Animal{
public void move() {
System.out.println("动物在移动");
}
}
//鱼类 继承动物类
class Fish extends Animal{
//鱼类继承动物类的move()方法 并进行了方法覆盖
public void move() {
System.out.println("鱼在游泳");
}
public void swim() {
System.out.println("fish swim");
}
}
//鸟类 继承动物类
class Bird extends Animal{
//鸟类继承动物类的move()方法 并进行了方法覆盖
public void move() {
System.out.println("鸟在飞翔");
}
//鸟类特有的方法catchWorm()方法
public void catchWorm() {
System.out.println("鸟在抓虫子");
}
}
多态在实际开发中的作用:
降低程序的耦合度 提高程序的扩展力 能使用多态尽量使用多态 父类型引用指向子类型 核心:面向抽象编程,尽量不要面向具体编程
package com.bjpowernode.jave.Test08;
public class DuoTaiTest1 {
public static void main(String[] args) {
//创建主人对象
Host lele = new Host();
lele.name = "乐乐";
//创建猫对象
Cat c = new Cat();
c.name = "大橘";
//创建狗对象
Dog d = new Dog();
d.name = "金毛";
lele.feed(lele, c);
lele.feed(lele, d);
}
}
//新建一个宠物类
class Pet{
//宠物类中有eat()方法 宠物类属于父类
public void eat() {
System.out.println("宠物在吃东西");
}
}
//新建一个猫类 继承宠物类 猫类属于子类
class Cat extends Pet{
String name;
//方法覆盖
public void eat() {
System.out.println("宠物猫"+this.name+"在吃鱼");
}
}
//创建一个狗类 继承宠物类 狗类属于子类
class Dog extends Pet{
String name;
//方法覆盖
public void eat() {
System.out.println("宠物狗"+this.name+"在吃骨头");
}
}
//创建一个主人类
class Host{
String name;
//定义一个喂宠物的方法
public void feed(Host host,Pet pet) {
System.out.print(this.name+"的");
pet.eat();
}
/*
* 我们设定宠物类,将主人类与宠物类进行绑定,主人类不面向于猫、狗等确定的宠物
* 而是面向于抽象的宠物类,而宠物类为父类可以向猫类、狗类进行自动类型转换
* 这样我们在对程序进行扩展的时候,就可以不需要更改Host类中的代码
* 直接增加一个类即可 例如:
* class Pig{
* String name;
* public void eat() {
System.out.println("宠物猪"+this.name+"在吃菜");
}
* }
* 我们只需要在主程序上创建对象即可SS
* */
}