您的位置:首页 > 职场人生

黑马程序员-----Java基础-----多态

2015-08-13 08:47 525 查看
                 ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流!
-------

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

 1,多态的体现

              父类的引用指向了自己的子类对象。

               父类的引用也可以接收自己的子类对象。

 2,多态的前提

  必须是类与类之间有关系,要么继承,要么实现。

  通常还有一个前提,存在覆盖。

 3,多态的好处

  多态的出现大大的提高了程序扩展性。

 4,多态的应用

 

 5,弊端

  提高了扩展性,但是只能使用父类的引用访问父类中的成员。

 

  Animal a = new Cat();类型提升,向上转型。

  a.eat();

 

  如果想要调用猫的特有方法时,如何操作?

 

  Cat c = (cat)a;强制将父类的引用转成子类类型,向下转型。

  c.catchMouse();

 

  千万不要出现这样的操作,将父类对象转成子类对象:

  我们不能转换的是父类应用指向自己的子类对象时,该应用

  可以被提升,也可以被强制转换。

  多态自始至终都是子类对象在做着变化。

  Animal a = new Aanimal();这是错误的。

  Cat c = (Cat)a;

 

 6.多态的特点XX重要

  在多态成员函数的特点

  在编译时期,参阅引用类型变量所属的类中是否有调用的方法,如果有

  编译通过,没有编译失败。

  在运行时,参阅对象所属的类中是否有调用方法。

  简单总结就是,成员函数在多态调用时,编译看左边,运行看右边。

 

  在多态中成员变量的特点;

  无论编译还是运行,都参考左边(引用型变量所属的类)。

 

  在多态中,静态成员函数特点:

  无论编译还是运行,都参考左边。

 

  Fu

  int num = 5

  Zi

  int num = 8

 

  Fu f = new Zi();

  System.out.println(f.num);--5

 

  Zi z = new Zi();

  System.out.println(z.num);--8

 

 class Fu

 {

  void method1()

  {

  System.out.println("Fu-1");

  }

  void method2()

  {

  System.out.println("Fu-2");

  }

 }

 class Zi extends Fu

 {

  void method1()

  {

  System.out.println("Zi-1");

  }

  void method3()

  {

  System.out.println("Zi-2");

  }

 }

 

 class Demo

 {

 public static void main(String[] args)

  Zi z = new Zi();

  z.method1();

  z.method2();

  z.method3();结果是:zi-fu-zi

 

  Fu f = new Zi();

  f.method1();

  f.method2();//结果是zi1 , fu2 。

 

  f.method3();//编译失败,父类中没有3的方法。

 }

abstract class Animal

{
abstract void eat();

}

class Cat extends Animal

{
void eat()
{
System.out.println("吃鱼");
}
void catchmouse()
{
System.out.println("抓老鼠");
}

}

class Dog extends Animal

{
void eat()
{
System.out.println("啃骨头");
}
void Kanjia()
{
System.out.println("看家");
}

}

class Pig extends Animal

{
void eat()
{
System.out.println("饲料");
}
void GongDi()
{
System.out.println("拱地");
}

}

public class Duotai {
public static void main(String[] args) {
/*Cat c = new Cat();
c.eat();
Dog d = new Dog();
d.Kanjia();
function(c);
function(d);*/

/*Animal c = new Animal();
c.eat();*/

function(new Cat());
function(new Dog());
}
public static void function(Animal a)//Animal a = new Cat();
{
a.eat();

/*Cat c = (Cat)a;
c.catchmouse();*/
//判断一下是猫还是够。
if(a instanceof Cat)
{
Cat c = (Cat)a;
c.catchmouse();
}
else if(a instanceof Dog)
{
Dog c = (Dog)a;
c.Kanjia();
}

//a.Kanjian.();运行出错,不是共性的。
}

/*public static void function(Cat c)
{
c.eat();
}
public static void function(Dog d)
{
d.eat();
}*/

}

需求:电脑运行实例,基于主板。

class MainBoard

{
public void run()
{
System.out.println("MainBoard run");
}
public void useNetCard(NetCard c)
{
c.open();
c.close();
}

}

public class DuoTai 

{
public static void main(String[] args
dd4c
)
{
MainBoard mb = new MainBoard();
mb.run();
mb.useNetCard(new NetCard());
}

}

class NetCard

{
public void open()
{
System.out.println("open");
}
public void close()
{
System.out.println("close");
}

}

-------------使用接口和多态的应用

interface PCI

{
public void open();
public void close();

}

class MainBoard

{
public void run()
{
System.out.println("MainBoard run");
}
public void usePCI(PCI p)
{
if(p!=null)
{
p.open();
p.close();
}
}

}

public class Duo 

{
public static void main(String[] args)
{
MainBoard mb = new MainBoard();
mb.run();
mb.usePCI(null);
mb.usePCI(new NetCard());
mb.usePCI(new SoundCard());
}

}

class NetCard implements PCI

{
public void open()
{
System.out.println("NetCard-open");
}
public void close()
{
System.out.println("NetCard-close");
}

}

class SoundCard implements PCI

{
public void open()
{
System.out.println("SoundCard-open");
}
public void close()
{
System.out.println("SoundCard-close");
}

}

--------------多态扩展示例

需求:数据库的操作

1,连接数据库,JDBC Hibernate

2,操作数据库 , c creat r read u update d delete

3,关闭数据库。

class UserInfoByJDBC

{
public void add(User user)
{
1,JDBC连接数据库
2,使用spl添加语句添加数据
3,关闭连接
}
public void delete(User user)
{
1,JDBC连接数据库
2,使用spl添加语句删除数据
3,关闭连接
}

}

//一年后更换UserInfoByJDBC 为   UserInfoByHibernate

/*class UserInfoByHibernate

{
public void add(User user)
{
1,Hibernate连接数据库
2,使用spl添加语句添加数据
3,关闭连接
}
public void delete(User user)
{
1,Hibernate连接数据库
2,使用spl添加语句删除数据
3,关闭连接
}

}*/

public class Duo 

{
public static void main(String[] args)
{
UserInfoByJDBC  UserInfoByJDBC();
//UserInfoByHibernate ui = new UserInfoByHibernate
ui.add();
ui.delete();
}

}

--------------------------------------

interface UserInfoDao

{
public void add(User user);

public void delete(User user);

}

public class Duo 

{
public static void main(String[] args)
{
//UserInfoByJDBC  UserInfoByJDBC();
//UserInfoByHibernate ui = new UserInfoByHibernate();
UserInfoDao ui = 这里可以用 UserInfoByJDBC();或者一年以后更换新的UserInfoByHibernate();
ui.add();
ui.delete();
}

}

class UserInfoByJDBC这个要implements UserInfoDao

或者:

class UserInfoByHibernate个要implements UserInfoDao

            -----<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流!
-------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: