面向对象—13—多态

来源:互联网 发布:用手机淘宝秒杀技巧 编辑:程序博客网 时间:2024/05/02 16:19

 

class Fu
{
 int num = 5;
 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
{
 int num = 8;
 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);//5
//  
//  Zi z = new Zi();
//  System.out.println(z.num);//8
  
  //f.method1(); //zi method_1
  //f.method2(); //fu method_2
  //f.method3(); //编译失败,找不到method3()
  
  
  Fu f = new Zi();
  f.method4(); //fu method_4
  
  Zi z = new Zi();
  z.method4(); //zi method_4
/*
在多态中成员函数(即非静态)的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的
      方法。如果有,编译通过。如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。

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


在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)

在多态中,静态成员函数的特点:
无论编译和运行,都参考左边
*/
  
//  Zi z = new Zi();
//  z.method1();//zi method_1
//  z.method2();//fu method_2
//  z.method3();//zi method_3
 }
}

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

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

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("newcard open"); 
 } 
 public void close()
 {
  System.out.println("newcard 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 useNetCard(NetCard c)
 {
  c.open();
  c.close();
 }
}

class NetCard
{
 public void open()
 {
  System.out.println("newcard open"); 
 } 
 public void close()
 {
  System.out.println("newcard close"); 
 }
}
*/
class DuoTaiDemo5
{
 public static void main(String[] args)
 {
  
  MainBoard mb = new MainBoard();
  mb.run();
  
  //mb.useNetCard(new NetCard());
  mb.usePCI(null);
  mb.usePCI(new NetCard());
  mb.usePCI(new SoundCard());
 }
}

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

/*
需求:数据库的操作
数据是:用户信息

1,连接数据库.JDBC Hibernate
2,操作数据库
   c create
   r read
   u update
   d delete

3,关闭数据库连接

*/
interface UserInfoDao
{
 public void add(User user);
 public void delete(User user); 
}

class UserInfoByJDBC implements UserInfoDao //实现接口
{
 public void add(User user)
 {
//  1,JDBC连接数据库
//  2,添加数据
//  3,关闭连接 
 } 
  public void delete(User user)
 {
//  1,JDBC连接数据库
//  2,删除数据
//  3,关闭连接 
 } 
}
class UserInfoByHibernate implements UserInfoDao
{
  public void add(User user)
 {
//  1,Hibernate连接数据库
//  2,添加数据
//  3,关闭连接 
 } 
  public void delete(User user)
 {
//  1,Hibernate连接数据库
//  2,删除数据
//  3,关闭连接 
 } 
}

class DBOperate
{
 public static void main(String[] args)
 {
  // UserInfoByJDBC ui = new UserInfoByJDBC();
  
   UserInfoDao ui = new UserInfoByJDBC();//父类的引用指向自己的子类对象
   ui.add(user);
   ui.delete(user);
 } 
}

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

/*
Object:是所有对象的直接或者间接父类。
该类中定义的肯定是所有对象都具备的功能

Object类中已经提供了对对象是否相同的比较方法。

如果自定义类中也有比较相同的功能,没有必要重新定义。
只要沿袭父类中的功能,建立自己特有比较内容即可。
这就是覆盖。

*/
class Demo //extends Object
{
 private int num;
 Demo(int num)
 {
  this.num = num; 
 }
 public boolean equals(Object obj) // Object obj = new Demo();复写Object中的方法
 {
  if(!(obj instanceof Demo))//判断obj是否是Demo类
   return false;
   
  Demo d = (Demo)obj;//将Object类型强转为Demo类型
  return this.num == d.num;
 }
 
// public boolean equals(Demo d)//参数类型不一样,是重载
// {}

 /*
 public boolean compare(Demo d)
 {
  return this.num == d.num;
 }
 */
 public String toString()
 {
  return "demo:"+num; 
 }
}

class Person
{}

class ObjectDemo
{
 public static void main(String[] args)
 {
  Demo d1 = new Demo(4);
  System.out.println(d1.toString());
  
  Demo d2 = new Demo(7);
  System.out.println(d2.toString());
//  Demo d2 = new Demo(4);
//  Person p = new Person();
//  
//  System.out.println(d1.equals(d2));
//  System.out.println(d1.equals(p));
   
//   Class c = d1.getClass();//获取类
//   
//   System.out.println(d1.toString());
//   System.out.println(c.getName());//获取类名
//   System.out.println(c.getName()+"@@"+Integer.toHexString(d1.hashCode()));
 }
}

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

个人总结:多态成员函数(非静态),编译看左边,运行看右边。多态成员变量和

静态成员函数,编译和运行都看右边。注意掌握instanceof和equals关键字。