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

                 ------<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)
{
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>、期待与您交流! -------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值