/*
多态:可以理解为事物存在的多种形态
人:男人,女人
动物:猫,狗
猫 x=new 猫();
动物 x=new 猫();
1、多态的体现
父类的引用指向了自己的子类对象
父类的引用也可以接收自己的子类对象
2、多态的前提
必须是类与类之间有关系,要么继承,要么实现
通常还有一个前提:存在覆盖
3、多态的好处
多态的出现大大的提高程序的扩展性
4、多态的弊端
提高了扩展性,但是只能用父类的引用访问父类中的成员
5、多态的应用
6、多态的出现代码中的特点(多态使用的注意事项)
如何使用子类特有的方法:
*/
abstract class Animal
{
public abstract void eat();
}
class Cat extends Animal
{
public void eat()
{
System.out.println("猫吃鱼");
}
public void catchMouse()
{
System.out.println("猫捉老鼠");
}
}
class Dog extends Animal
{
public void eat()
{
System.out.println("狗吃肉");
}
public void kanJia()
{
System.out.println("看家");
}
}
class DuoTaiDemo
{
public static void main(String[] args)
{
// Animal a=new Cat();//类型提升 向上转型
// a.eat();
//如果想要调用猫的特有方法时,如何操作?
//强制将父类的引用专程子类类型
//Cat c=(Cat)a; 向下转型
// Animal a1=new Dog();
// a1.eat();
funtion(new Cat());
funtion(new Dog());
/*
父亲 x=new 儿子();
x.讲课();
儿子 y=(儿子)y;
y.看电影();
多态自始至终都是子类对象在做着变化
*/
}
public static void funtion(Animal a)
{
a.eat();
if (a instanceof Animal)
//instanceof:用于判断对象的类型
//对象 instanceof 类型(类类型 接口类型)
{
System.out.println("动物");
if (a instanceof Cat)
{
Cat c=(Cat)a;
c.catchMouse();
}
else if (a instanceof Dog)
{
Dog d=(Dog)a;
d.kanJia();
}
}
}
}
/*
在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。
如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
总结:成员函数在多态调用时,编译看左边,运行看右边。
在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)
在多态中,静态成员函数的特点:
无论编译和运行,都参考做左边。
*/
class Fu
{
public static String name="fu";
int sum=5;
public static void method1()
{
System.out.println("Fu.......method1"+" name....."+name);
}
public void method2()
{
System.out.println("Fu.......method2"+" sum....."+sum);
}
public void method4()
{
System.out.println("Fu.......method4");
}
}
class Zi extends Fu
{
int sum=9;
public static String name="zi";
public static void method1()
{
System.out.println("Zi.......method1"+"name....."+name);
}
public void method2()
{
System.out.println("Zi.......method2"+" sum....."+sum);
}
public static void method3()
{
System.out.println("Zi.......method3");
}
}
class DuoTaiDemo1
{
public static void main(String[] args)
{
Fu f=new Zi();
f.method1();
f.method2();
f.method4();
System.out.println(f.sum);
}
}
/*
多态基于主板
需求:电脑运行与主板
*/
class MainBoard
{
public void run()
{
System.out.println("MainBoard....run");
}
public void usePCI(PCI p)
{
p.open();
p.close();
}
}
interface PCI
{
public abstract void open();
public abstract void close();
}
class SoundCard implements PCI
{
public void open()
{
System.out.println("soundcard open");
}
public void close()
{
System.out.println("soundcard close");
}
}
class NetCard implements PCI
{
public void open()
{
System.out.println("netcard open");
}
public void close()
{
System.out.println("netcard close");
}
}
class DuoTaiDemo2
{
public static void main(String[] args)
{
MainBoard mb=new MainBoard();
mb.run();
mb.usePCI(new SoundCard());
mb.usePCI(new NetCard());
}
}