一、概述
//对象的多态性
//多态的表现,父类型在指向自对象
class animal
{
}
class cat extends animal
{
}
class dog extends animal
{
}
public class Main
{
public static void main(String[] args)
{
//一个对象两种形态
animal 小动物 = new cat();//小动物通过猫创建对象,动物类在指向
/*
* 猫这类事物具备猫的形态,又具备动物的形态。
* 这就是事物的多态性
* 也就是一个对象对应着不同的类型
* 多态在代码中的体现:
* (父类/接口)的引用指向了其子类的对象
* */
}
}
abstract class animal
{
abstract void sing();//叫
}
class cat extends animal
{
void sing()
{
System.out.println("喵喵叫");
}
void fun()//猫的特有功能
{
System.out.println("捉老鼠");
}
}
class dog extends animal
{
void sing()
{
System.out.println("汪汪叫");
}
void fun()//狗的特有功能
{
System.out.println("看家");
}
}
class pig extends animal
{
void sing()
{
System.out.println("哼哼叫");
}
void fun()
{
System.out.println("拱地");
}
}
public class Main
{
public static void main(String[] args)
{
//一只猫
cat 小猫 = new cat();
小猫.sing();
//很多猫
cat 二猫 = new cat();
cat 三猫 = new cat();
catqun(二猫);
catqun(三猫);
//....
//多态的体现,多只动物
dog 小狗1号 = new dog();
cat 小猫1号 = new cat();
catqun(小狗1号);
catqun(小猫1号);
catqun(new pig(););
}
static void catqun(animal c)//animal c = new cat()/dog()/pig();
{
c.sing();
}
}static void catqun(animal c)
{
c.sing();
// c.fun();->animal里没有fun这个方法
}
abstract class animal
{
abstract void sing();//叫
}
class cat extends animal
{
void sing()
{
System.out.println("喵喵叫");
}
void fun()//猫的特有功能
{
System.out.println("捉老鼠");
}
}
class dog extends animal
{
void sing()
{
System.out.println("汪汪叫");
}
void fun()//狗的特有功能
{
System.out.println("看家");
}
}
class pig extends animal
{
void sing()
{
System.out.println("哼哼叫");
}
void fun()
{
System.out.println("拱地");
}
}
public class Main
{
public static void main(String[] args)
{//以前指挥对象做事
/*
* cat 小猫 = new cat();
小猫.sing();
*/
animal a = new cat();//自动类型提升,猫对象提升到了动物,类似byte x = 3;int y = x;
a.sing();
//PS:猫一旦提升到了动物,但是其特有功能无法访问。
//专业说法,向上转型。目的:限制对特有功能的访问
//如果还行用猫的特有功能
//就可以将该对象,向下转型
cat c = (cat)a;//将动物a,向下转型为了猫c
c.fun();
// 向下转型的目的:是为了使用子类中特有的方法
/*animal d = new animal();
* animal f = new dog();
* cat g = (cat)f;
cat e = (cat)d;这种类型不允许,小动物就一定是猫么*/
}
}
/*
* BLF和BLF2的故事
* BLF2是BLF的儿子
* */
class BLF
{
void 功能()
{
System.out.println("用C++写程序");
}
void 说英语()
{
System.out.println("hello,world");
}
}
class BLF2 extends BLF
{
void 功能()
{
System.out.println("用java写程序");
}
void 说汉语()
{
System.out.println("你好,世界");
}
}
public class Main
{
public static void main(String[] args)
{
BLF x = new BLF2();//一天BLF2冒充BLF
x.功能();//只能是用java写程序,因为BLF2只会java
x.说英语();//可以,让BLF2像BLF一样,说英语
//x.说汉语();//不可以,BLF2已经向上转型为BLF,禁止了BLF2特有功能的使用
BLF2 Z = (BLF2)x;//变回来
Z.说汉语();
}
}
原文:http://blog.csdn.net/wjw0130/article/details/39466489