——- android培训、java培训、期待与您交流! ———-
我热爱我的热爱,并将继续坚持我的热爱,生活终会好起来,我会是那匹黑马。
一、多态 :可以理解为 事物存在的多种体现形式
1:多态在程序中 的体现;
父类的引用指向了自己子类的对象
父类的引用也可以接受自己子类的对象
2:多态的前提
必须是类与类之间有关系,要么继承要么实现
存在覆盖
3:多态的好处
大大提高了程序的扩展性
4:多态的弊端
只能使用父类的引用访问父类中的成员
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 Pig extends Animal
{
public void eat()
{
System.out.println("饲料");
}
public void gongDi()
{
System.out.println("拱地");
}
}
class DuoTaiDemo
{
public static void main(String[] args)
{
//Cat c = new Cat();
//c.eat();
//Dog d = new Dog();
//d.eat();
//Cat c = new Cat();
//Animal c = new Cat(); // 类型提升 也称为向上转型
//如果想要调用猫的特有方法,怎么操作;
//强制将父类的引用转成子类类型。向下转型;
//多态始终是子类对象在做着变化
//c.eat();
function(new Cat());
function(new Dog());
function(new Pig());
}
public static void function(Animal a)
{
a.eat();
}
/*
public static void function(Animal c)
{
c.eat();
if(c instanceof Cat){
Cat cc=(Cat)c;
c.catchMouse();
}
}
public static void function(Dog d)
{
d.eat();
}
*/
}
二、多态注意事项
举例说明:
学生:
学习,睡觉。
可以将这两类事物进行抽取。
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 DuoTaiDemo3
{
public static void main(String[] args)
{
DoStudent ds = new DoStudent();
ds.doSome(new BaseStudent());
ds.doSome(new AdvStudent());
}
}
多态中成员 的特点
函数特点:
编译时,参阅引用性变量所属的类中是否有调用的方法有,通过;否则失败,运行时,参阅对象所属的类中是否有调用的方法。
总结:成员函数在多态调用时,编译看左边,运行看右边
多态中,成员变量,无论编译运行都参考左边(引用行变量所属的类);
多态中,静态函数,不论编译和运行都参考左边
多态的主板示例
interface PCI
{
public void open();
public void close();
}
class NerCard implements PCI{
public void open(){ System.out.println("NerCard open"); }
public void close (){ System.out.println("NerCard close "); }
}
class SoundCard implements PCI{
public void open(){ System.out.println("SoundCard open"); }
public void close (){ System.out.println("SoundCard close "); }
}
class MainBoard{
public void run(){
System.out.println("MainBoard run");
}
public void usePCI(PCI p){//接口型引用指向实现类的对象
if(0!=null){
p.open();
p.close();
}
}
}
class DuoTaiDemo
{
public static void main(String[] args)
{
MainBoard m=new MainBoard();
m.run();
m.usePCI(null);
m.usePCI(new NerCard ( ) );
m.usePCI(new SoundCard ( ) );
}
}
多态的扩展示例
需求:数据库的操作
1:连接数据库
2:操作数据库
增删改查 create read update delete
3:关闭数据库连接
class UserInfoByJdbc
{
public void add(User user)
{
jsbc 连接数据库操作;
}
}
class UserInfoByHibernate implements UserInfoDao
{
public void add(User user)
{
Hibernate连接数据库操作;
}
}
interface UserInfoDao
{
public void add();
}
class DBoperate implements UserInfoDao
{
public static void main(String args[])
{
/* UserInfoByJdbc uj=new UserInfoByJdbc ();
UserInfoByHibernate uh=new UserInfoByHibernate ();*/
UserInfoDao ud= new UserInfoByJdbc () ;
ud.add();
}
}