多态
多态的转型
abstract class Ainimal
{
public abstract void eat();//抽象
}
class Cat extends Ainimal
{
public void eat()
{
System.out.println("吃鱼");
}
public void CatMouse()
{
System.out.println("抓老鼠");
}
}
class Dog extends Ainimal
{
public void eat()
{
System.out.println("吃骨头");
}
public void kanJia()
{
System.out.println("看家本领");
}
}
class PPig extends Ainimal
{
public void eat()
{
System.out.println("饲料");
}
public void GongDi()
{
System.out.println("拱地");
}
}
public class _02多态_转型 {
public static void main(String[]args)
{
Ainimala = new Cat(); //类型的提升,向上转型 'a'-->表示父类的引用。
a.eat();
//如果想要调用猫的特有方法时,如何操作?
//强制将父类的引用。转成子类类型。
//向下转型。
Cat c = (Cat)a;//将动物的变量名a 转成Cat类型
c.CatMouse();
//千万不要出现这样的操作,就是将父类对象转换成子类类型。
//我们能转换的是父类引用指向了子类的对象时,该引用可以被提升,也可以被转换
//规律:多态自始至终,都是子类对象在做着变化。
//Ainimal a = new Ainimal();
//Cat c = (Cat)a;
/* 毕姥爷的功能:讲课(工商管理)
* 毕老师的功能:讲课(Java),看电影
*
* 毕姥爷 x = new 毕老师();
* x.讲课();
*
* 毕老师 y = (毕老师)x;
* y.看电影();
*/
function(new Cat()); //传值
}
//-------提高代码的扩展性-----------
public static void function(Ainimal a) //Ainimal a = new Cat();
{
//a.eat();
//a.catMouse();//这块是不允许的,因为它不在父类中存在,不是所有动物都具备的功能
if(a instanceof Cat)
{
Cat c = (Cat)a;
c.eat();
c.CatMouse();
}
else if(a instanceof Dog)
{
Dog d = (Dog)a;
d.eat();
d.kanJia();
} else if(a instanceof PPig)
{
PPig p = (PPig)a;
p.eat();
p.GongDi();
}
}
}
多态的使用注意事项
多态中成员的特点
class DFu
{
int num =5;
void methed1()
{
System.out.println("Fumethed_1");
}
void methed2()
{
System.out.println("Fumethed_2");
}
static void methed4()
{
System.out.println("父类:静态所修饰的函数,调用时看左边的引用对象");
}
}
class DZi extends DFu
{
int num = 8;
void methed1()
{
System.out.println("Zimethed_1");
}
void methed3()
{
System.out.println("Zimethed_3");
}
static void methed4()
{
System.out.println("子类:静态所修饰的函数,调用时看左边的引用对象");
}
}
public class _04多态中成员的特点 {
public static void main(String[]args)
{
DFu f = new DZi();
f.methed1();
f.methed2();
//f.methed3(); //失败,因为父类中几有这个函数
System.out.println(f.num);
/*
* 多态中成员函数的特点:
* 在编译时,参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败
* 在运行时,参阅对象所属的类中,是否有调用的方法。
* 简单总结就是:所员函数在多态调用时,编译(看左边)运行(看右边)
*/
f.methed4();
DZi z = new DZi();
z.methed1();
z.methed2();
z.methed3();
System.out.println(z.num);
面试题注意
/*
* 多态中,成员变量的特点:int num;
* System.out.println(f.num);
*System.out.println(z.num);
* 无论编译和运行,都参考左边(引用型变量所属的类)
*/
z.methed4();
/*
* 多态中,静态成员函数的特点:
* 无论编译和运行,都参考左边(引用型变量所属的类)
*/
}
}
多态主板示例
//需求:插入主板电脑运行
class MainCar
{
public void rum()
{
System.out.println("主板运行");
}
//调用各插卡的功能
public void usePCI(PCI p)//PCIp=new PCI();接口型引用,指用自己的子类对象。
{
if(p!=null)
{
p.Open();
p.Close();
}
}
}
//接口
abstract interface PCI
{
public abstract void Open();
public abstract void Close();
}
//网卡
class NetCar implements PCI
{
public void Open()
{
System.out.println("可以上网了");
}
public void Close()
{
System.out.println("关闭上网功能");
}
}
//声卡
class SoundCar implements PCI
{
public void Open()
{
System.out.println("声音:开");
}
public void Close()
{
System.out.println("声音:关");
}
}
public class _05多态的主板示例 {
public static void main(String[]args)
{
MainCar m = new MainCar();
m.rum();//运行主板
m.usePCI(null);//接口不能为空
m.usePCI(new NetCar());//插上网卡
m.usePCI(new SoundCar());//插上声卡
}
}