多态

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

多态:可以理解为事物存在的多种体现形态。

-----------------------------------
1,多态的体现
父类的引用指向了自己的子类对象。
//动物 x = new 猫();
----------------------------------
2,多态的前提
1) 必须是类与类之间有关系。要么继承(extends),要么实现(implements)。
2) 通常还有一个前提:存在覆盖(重写)。
3)父类引用指向自己的子类对象
----------------------------------
3,多态的好处
预先定义的程序可以运行后期程序的内容。
多态的出现大大的提高程序的扩展性。
----------------------------------
4,多态的弊端:
虽然可以预先使用,但是只能访问父类中已有的功能,运行的是后期子类的功能内容。不能预先使用子类中定义的特有功能。
----------------------------------
5,多态的应用
 
在多态中成员函数的特点:
 
1)对于成员函数:// class Fu{}    class Zi extends Fu{}    Fu f = new Zi(); f.method();  
编译时期:看左边。
运行时期:看右边。
 
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
 
2) 对于成员变量(静态成员变量)的特点:
    无论编译和运行,都参考左边(引用型变量所属的类)。
 
[java] view plain copy
public class DuoTai {  
   
public static void main(String[] args) {  
// TODO Auto-generated method stub  
Fu f = new Zi();  
System.out.println("num="+f.num+",num1="+f.num1);  
}  
   
}  
class Fu  
{  
 int num = 6;  
 static int num1 = 7;  
}  
   
   
class Zi extends Fu  
{  
 int num = 88;  
 static int num1 = 99;  
}  




 
3)静态函数:java的静态函数和对象无关,只和声明的类有关,静态函数由类直接引用。
 
[java] view plain copy
class Fu  
{  
void method1()  
{  
System.out.println("fu method_1");  
}  
void method2()  
{  
System.out.println("fu method_2");  
}  
static void method4()  
{  
System.out.println("fu method_4");  
}  
}  
   
   
class Zi extends Fu  
{  
void method1()  
{  
System.out.println("zi method_1");  
}  
void method3()  
{  
System.out.println("zi method_3");  
}  
   
static void method4()  
{  
System.out.println("zi method_4");  
}  
}  
class  DuoTaiDemo4  
{  
public static void main(String[] args)   
{  
//  Fu f = new Zi();  
//  
//  System.out.println(f.num);  
//  
//  Zi z = new Zi();  
   
//f.method1();  
//f.method2();  
//f.method3();  
   
Fu f = new Zi();  
f.method4();  
   
Zi z = new Zi();  
z.method4();  
}  
}  




 
4)向下转型
[java] view plain copy
class Fu{}  
   
class Zi  extends Fu{}  
Fu  fu= new Zi();   //Zi向上转型为了Fu。向上转型,一般多态都采用这种。  
   
Zi  zi = (Zi)fu;    //将代表Zi对象的父类引用fu强制转换成了Zi类型。向下转型。  




 
----------------------------------
 
 
例子1:(抽象类实现多态,有分析过程):
 
[java] view plain copy
abstract class Animal  
{  
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 DuoTaiDemo1   
{  
public static void main(String[] args)   
{  
//Animal a = new Cat();//类型提升。 向上转型。  
//a.eat();  
   
//如果想要调用猫的特有方法时,如何操作?  
//强制将父类的引用。转成子类类型。向下转型。  
///Cat c = (Cat)a;  
//c.catchMouse();  
//千万不要出现这样的操作,就是将父类对象转成子类类型。  
//我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。  
//多态自始至终都是子类对象在做着变化。  
//  Animal a = new Animal();  
//  Cat c = (Cat)a;  
function(new Dog());  
function(new Cat());  
   
   
}  
   
public static void function(Animal a)//Animal a = new Cat();  
{  
a.eat();  
if(a instanceof Cat)  
{  
Cat c = (Cat)a;  
c.catchMouse();  
}  
else if(a instanceof Dog)  
{  
Dog c = (Dog)a;  
c.kanJia();  
}  
   
   
/* 
instanceof : 用于判断对象的类型。 对象 intanceof 类型(类类型 接口类型)   
*/  
}  
   
   
}  




 
----------------------------------
 
 
例子2:(利用抽象类实现多态):
[java] view plain copy
/* 
基础班学生: 
学习,睡觉。 
高级班学生: 
学习,睡觉。 
  
可以将这两类事物进行抽取。 
  
*/  
   
abstract class Student  
{  
public abstract void study();  
public void sleep()  
{  
System.out.println("躺着睡");  
}  
}  
   
class DoStudent  
{  
public void doSome(Student stu)  
{  
stu.study();  
stu.sleep();  
}  
}  
   
class BaseStudent extends Student  
{  
public void study()  
{  
System.out.println("base study");  
}  
public void sleep()  
{  
 System.out.println("坐着睡");  
}  
}  
   
class AdvStudent extends Student  
{  
public void study()  
{  
System.out.println(" adv study");  
}  
}  
   
   
   
   
class  DuoTaiDemo2  
{  
public static void main(String[] args)   
{  
   
DoStudent ds = new DoStudent();  
ds.doSome(new BaseStudent());  
ds.doSome(new AdvStudent());  
   
//  BaseStudent bs = new BaseStudent();  
//  bs.study();  
//  bs.sleep();  
//  AdvStudent as = new AdvStudent();  
//  as.study();  
//  as.sleep();  
}  
   
}  
   




----------------------------------
 
例子3:(利用接口实现多态):
 
[java] view plain copy
/* 
需求: 
电脑运行实例, 
电脑运行基于主板。 
*/  
   
   
interface PCI  
{  
public void open();  
public void close();  
}  
   
class MainBoard  
{  
public void run()  
{  
System.out.println("mainboard run ");  
}  
public void usePCI(PCI p)//PCI p = new NetCard()//接口型引用指向自己的子类对象。  
{  
if(p!=null)  
{  
p.open();  
p.close();  
}  

}  

}  
   
   
class NetCard implements PCI  
{  
public void open()  
{  
System.out.println("netcard open");  
}  
public void close()  
{  
System.out.println("netcard close");  
method();  
}  
}  
   
class SoundCard implements PCI  
{  
public void open()  
{  
System.out.println("SoundCard open");  
}  
public void close()  
{  
System.out.println("SoundCard close");  
}  
}  
   
   
class DuoTaiDemo3   
{  
public static void main(String[] args)   
{  
MainBoard mb = new MainBoard();  
mb.run();  
mb.usePCI(null);  
mb.usePCI(new NetCard());  
mb.usePCI(new SoundCard());  
}  

}  

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值