Java——多态

多态的理解运用:

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

人:男人,女人

动物:猫,狗。

猫 x = new 猫();

动物 x = new 猫();

1,多态的体现
 父类的引用指向了自己的子类对象。
 父类的引用也可以接收自己的子类对象。
2,多态的前提
 必须是类与类之间有关系。要么继承,要么实现。
 通常还有一个前提:存在覆盖。

3,多态的好处
 多态的出现大大的提高程序的扩展性。

4,多态的弊端:
 虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员。

5,多态的应用

6,多态的出现代码中的特点(多态使用的注意事项)

 


第二个问题:如何使用子类特有方法。
*/

/*
动物,
猫,狗。
*/

class Cat extends Animal//定义Cat类并继承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 Fu
{
 static int num = 5;//static修饰成员变量可看作全局变量,因为它此时属于类和类得到加载就会执行static修饰的语句。
 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//继承
{
 static int num = 8;//对num重新赋值,
 @Override//标记表示下面的方法为重写方法,如果没有重写方法编译不能通过。
 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();
//  System.out.println(z.num);

  //f.method1();
  //f.method2();
  //f.method3();

  Fu f = new Zi();//多态性,父类对象f的引用指向了new出来的子类对象。
  System.out.println(f.num);//输出FU的静态成员属性值,
  f.method4();//输出Fu method_4,Fu类method4是static的。

  Zi z = new Zi();
  z.method4();//输出zi method_4

 
  
/*
在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。


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


在多态中,静态成员函数的特点:
无论编译和运行,都参考做左边。


*/


//  Zi z = new Zi();
//  z.method1();
//  z.method2();
//  z.method3();
 }

 

class DuoTaiDemo2
{
 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;
  

  /*
  毕姥爷 x = new 毕老师();

  x.讲课();

  毕老师 y = (毕老师)x;


  y.看电影();
  */
  function(new Dog());
  function(new Cat());


 }
 public static void function(Animal a)//Animal a = new Cat();
 {
  a.eat();
  /*
  if(a instanceof Animal)
  {
   System.out.println("haha");
  }
  else
  */
  if(a instanceof Cat)
  {
   Cat c = (Cat)a;
   c.catchMouse();
  }
  else if(a instanceof Dog)
  {
   Dog c = (Dog)a;
   c.kanJia();
  }


  /*
  instanceof : 用于判断对象的类型。 对象 intanceof 类型(类类型 接口类型) 
  */
 
 }
 


}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值