扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
同一个对象,在不同时刻表现出来的不同形态就叫多态
多态的形式:
有 继承 / 实现 关系
有方法重写
有父(类 / 接口)引用指向(子 / 实现)类对象👇
//父类引用 指向 子类对象
父类 对象名 = new 子类名();
//父接口引用 指向 实现类对象
接口名 对象名 = new 实现类名();
public class Animal() {public int height = 10;
public void eat() {Sout: "动物吃东西";
}
}
class Cat extends Animal() {public int height = 20;
public int weight = 40;
@Override
public void eat() {Sout: "猫吃鱼";
}
public void play() {Sout: "猫玩老鼠";
}
}
3.1 成员变量编译看左边,运行看左边 (因为成员变量没有重写)
javac
在编译代码的时候,会看左边(父类)有没有这个成员变量java
在运行代码的时候,会拿左边(父类)的成员变量的值作为最终值public class Demo() {public static void main(String[] args) {Animal ani = new Cat();
Sout: ani.height;// 输出:10 (来自父类)
Sout: ani.weight;// 报错,因为Animal类里没有成员变量weight
}
}
3.2 成员方法编译看左边,运行看右边 (因为成员方法有重写)
javac
在编译代码的时候,会看左边(父类)有没有这个成员方法java
在运行代码的时候,会拿右边(子类)的成员方法作为最终值public class Demo() {public static void main(String[] args) {Animal ani = new Cat();
ani.age();// 输出:猫吃鱼 (来自子类)
ani.play();//报错,因为Animal类没有成员方法play()
}
}
4 多态的利与弊
好处定义方法时,使用父类型作为参数,可以接收所有的子类对象
。以后再使用的时候,只需要使用具体的子类型参与操作即可。提高了程序的扩展性
在多态形式下,右边对象可以实现解耦合,便于扩展和维护。
如 A extends C, B extends C。C类中有一个工作:打扫卫生。
起初A类对象在打扫卫生:C c = new A();
c.work();
现在想让B类对象去打扫卫生,只需要改变子类对象C c = new B();
,后续所有的代码都不需要更改。
public class Demo() {public static void main(String[] args) {Animal ani = new Cat();
ani.age();// 输出:猫吃鱼 (来自子类)
ani.play();//报错,因为Animal类没有成员方法play()
}
}
class Animal() {public int height = 10;
public void eat() {Sout: "动物吃东西";
}
}
class Cat extends Animal() {public int height = 20;
public int weight = 40;
@Override
public void eat() {Sout: "猫吃鱼";
}
public void play() {Sout: "猫玩老鼠";
}
}
5 多态的转型
5.1 向上转型(自动类型转换)从子到父
//向上转型
Animal ani = new Cat();
5.2 向下转型(强制类型转换)从父到子
作用: 可以转为真正的子类类型,从而调用子类独有的功能
转换类型与真实对象类型不一致的时候会报错,所以:
转型需谨慎,要加以判断:
语法:a instanceof B
//变量a是不是B类型,如果是,返回true
public class Demo() {public static void main(String[] args) {Animal ani = new Cat();
//ani是不是猫类型?是就转型,不是就不转
if(ani instanceof Cat) {//向下转型
Cat cat = (Cat)ani;
//此时就可以用子类的特有功能
cat.play();
} else {System.out.println("没有该类型,无法转换");
}
}
}
关于强转前的判断,jdk14以后有新特性:
语法:a instanceof B b
//变量a是不是B类型,如果是,则强转为B类型,转换后的变量名更改为b;如果不是不强转,结果为false
if(ani instanceof Cat cat) {cat.play();
} else {System.out.println("没有该类型,无法转换");
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流