多态的概念:
所谓多态,其实就是一种物质多种状态。比如动物有吃的功能,够吃骨头 ,兔子吃草,猫吃鱼。
程序中的多态:
多态:同一个引用类型,使用不同的实例而执行不同操作;
打印机 打印机1 = new 黑色打印机();
打印机 打印机2 = new 彩色打印机();
网银接口 网银1 = new 京东();
网银接口 网银2 = new 淘宝();
语法:(特征)
1) 方法重写。
2) 父类引用 -> 子类对象
接口引用 -> 实现类对象
多态应用:
1) 类 多态;
2) 接口多态;
3) 参数多态。
多态的好处:
1)屏蔽了子类的差异,更换 子类对象;
2)一个父类类型 可以接收 所有的子类对象。
练习1:使用多态实现下图的功能。有狗和猫 宠物店 宠物店 动物需要看病
分析:猫和狗 抽象为动物类 宠物医院 依赖于动物
package com.test.inter;
//宠物类
class Pet{
private String name;
public void eat(){
System.out.println("吃东西");
}
public Pet(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//狗
class Dog extends Pet{
public Dog(String name) {
super(name);
// TODO Auto-generated constructor stub
}
public void eat(){
System.out.println("吃骨头");
}
public void lookDoor(){
System.out.println("看家");
}
}
//猫
class Cat extends Pet{
public Cat(String name) {
super(name);
// TODO Auto-generated constructor stub
}
public void eat(){
System.out.println("吃鱼");
}
public void mouse (){
System.out.println("抓老鼠");
}
}
//宠物医院
class PetHospital{
public void treatment(Pet pet){
System.out.println("给"+pet.getName()+"看病,看好了吃:");
pet.eat();
if(pet instanceof Dog){
Dog dog = (Dog)pet;
System.out.println("吃饱了之后");
dog.lookDoor();
}else if(pet instanceof Cat){
Cat cat = (Cat)pet;
System.out.println("吃饱了之后");
cat.mouse();
}
}
}
public class TestHospital {
public static void main(String[] args) {
// TODO Auto-generated method stub
Pet dog = new Dog("萨摩耶");
PetHospital ph = new PetHospital();
ph.treatment(dog);
Pet cat = new Cat("挪威森林猫");
ph.treatment(cat);
}
}
运行结果:
给萨摩耶看病,看好了吃:
吃骨头
吃饱了之后
看家
给挪威森林猫看病,看好了吃:
吃鱼
吃饱了之后
抓老鼠
练习2:有数学老师 语文老师 数学老师会跳舞 语文老师会唱歌 当然他们都上课。请用多态实现
package com.test.inter;
class Teatcher{
private String name;
public Teatcher(){
}
public Teatcher(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void attend(){
System.out.println("燃烧的蜡烛");
}
}
class STeatcher extends Teatcher{
public void attend(){
System.out.println("教学课");
}
public void sing(){
System.out.println("会唱歌");
}
}
class YTeatcher extends Teatcher{
public void attend(){
System.out.println("语文课");
}
public void dance(){
System.out.println("会跳舞");
}
}
public class TestTeacher {
public static void main(String[] args) {
// TODO Auto-generated method stub
Teatcher t1 = new YTeatcher();
t1.setName("苏东坡");
System.out.println(t1.getName());
t1.attend();
YTeatcher y= (YTeatcher)t1;
y.dance();
Teatcher s2 = new STeatcher();
s2.setName("爱因斯坦");
System.out.println(s2.getName());
s2.attend();
STeatcher st = (STeatcher)s2;
st.sing();
}
}
练习3:
实现:
网银接口 网银1 = new 京东();
网银接口 网银2 = new 淘宝();
package com.test.inter;
interface WY {
void zf();
}
class JD implements WY{
@Override
public void zf() {
// TODO Auto-generated method stub
System.out.println("京东实现支付");
}
}
class TB implements WY{
@Override
public void zf() {
// TODO Auto-generated method stub
System.out.println("淘宝实现支付");
}
}
public class TestJY {
public static void main(String[] args) {
// TODO Auto-generated method stub
WY tb = new TB();
tb.zf();
WY jd = new JD();
jd.zf();
}
}