多态字面意思是,多种形态。
Java中的表现:
Fu f=new Zi();
在父类(或接口)中引用子类对象。
好处
提高了程序后期的维护性和延展性
前提
需要存在继承或者实现关系
要有覆盖操作
abstract class Animal{
abstract void eat();
}
class Cat extends Animal{
public void eat()
{
System.out.println("猫喵喵吃饭");
}
public void Catch()
{
System.out.println("小猫抓老鼠");
}
}
class Dog extends Animal{
public void eat()
{
System.out.println("狗汪汪吃饭");
}
}
class DuoleiDemo{
public static void main(String[] args)
{
Animal a=new Cat(); //自动类型提升 向上转型
a.eat(); //限制了对猫特有功能的访问
//a.Catch()
//Cat c=(Cat) a; //向下转型
c.Catch();
//Dog d=(Dog) a; //不可以同级转换
//当不确定对象是不是属于同级还是上级,就像a不确定能不能转换成Cat时判断
//判断复杂数据类型
if(a instanceof Cat)
{
Cat c=(Cat) a;
}
}
}
多态应用
栗子一子父类
class Person
{
/*要是有很多动物,这样定义会很麻烦
public void weishi(Cat c)
{
System.out.ptintln("人喂小猫吃饭");
}
public void weishi(Dog d)
{
System.out.ptintln("人喂小狗吃饭");
}
*/
void weishi(Animal a)
{
a.eat();
//若想调用子类对象中特有的属性,解决办法和多态类相同
if(a instanceof Cat)
{
Cat c=(Cat) a;
c.Catch();
}
}
}
abstract class Animal{
abstract void eat();
}
class Cat extends Animal{
public void eat()
{
System.out.println("猫喵喵吃饭");
}
public void Catch()
{
System.out.println("小猫抓老鼠");
}
}
class Dog extends Animal{
public void eat()
{
System.out.println("狗汪汪吃饭");
}
}
class DuoleiDemo{
public static void main(String[] args)
{
Person p=new Person();
/*Cat c=new Cat();
Dog d=new Dog();
p.weishi(c);
p.weishi(d);
*/
p.weishi(new Cat()); //匿名对象 相当于Animal a=new Cat();用法和多态一样
p.weishi(new Dog()); //匿名对象
}
}
栗子二接口
class PC
{
void use(USB U)
{
U.open();
U.close();
if(U instanceof Mouse)
{
Mouse m=(Mouse) U;
m.click();
}
if(U instanceof Key)
{
Key k=(Key) U;
k.print();
}
}
/*要设置很多函数这样比较麻烦
void use(Mouse m)
{
m.open();
m.close();
m.print();
}*/
}
interface USB
{
//提取共有的属性
void open();
void close(); //隐藏默认是public abstract所修饰
}
class Key implements USB{
public void open(){
System.out.println("插上键盘");
}
public void close(){
System.out.println("拔出键盘");
}
//键盘特有功能
void print(){
System.out.println("敲击键盘");
}
}
class Mouse implements USB{
public void open(){ //因为使用了接口,所以权限应改成public
System.out.println("插上鼠标");
}
public void close(){
System.out.println("拔出鼠标");
}
//鼠标特有功能
void click(){
System.out.println("点击鼠标");
}
}
class DuoleiDemo{
public static void main(String[] args)
{
Pc p=new Pc();
p.ues(new Mouse());
p.ues(new Key());
}
}