`
sky_eye
  • 浏览: 4446 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

黑马程序员_java面向对象 多态

阅读更多

                                黑马程序员_java面向对象  多态

                        

                      ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、多态

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

一般重点为对象的多态性,像函数也有多态性,如重载。

1、多态的基本体现

      父类的引用指向了自己的子类对象。即Animal c = new Cat()  

      父类的也可以接受自己的子类对象。即public static void function(Animal a)

具体程序解释:

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 DuoTaiDemo
{
 public static void main(String[] args)
 {
  /*
  Cat c = new Cat();..........原先建立对象和其使用方法,即Cat c = new Cat() 通过这种方法建立一个对象,
  c.eat();                            并用 类名.成员 进行调用。但是如果每建立一个对象就得重复使用,代码复用性
  Dog d = new Dog();        太低。建立调用函数的话,只是和对象有关,像function(Cat c),只在Cat对
  d.eat();                            象建立时可用,一旦对象改变又得建立新的函数。既然Cat 和Dog有一样的动作,
  */                                     所以可以进行如下程序的更改。
    

      Animal c = new Cat();.....................通过父类建立对象,指向子类对象,一般有继承和实现关系的类与类
       c .cat();                                           就可以应用
     function(new Cat());.........................函数调用方法,此处new Cat(),其实就是Animal c = new Cat();

}
 public static void function(Animal a)
 {
  a.eat();
 }
}

2、多态的好处

      多态的出现,提高了程序的拓展性

3、多态的前提

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

      一般来说,存在覆盖。就是说一般多态是对事物共性的描述。

此处注意:对事物共性的描述,其实就是集成,即是对事物共性部分进行抽取,单独成一类,该私有的私有,该抽象的抽象

4、多态的弊端

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

 

而且要注意类型的转换:

Animal c = new Cat();其实这里进行类型的转换,把猫提升为动物,类似byte b = 3;int x = b;类型提升了,就是向上转型。具体程序:

class DuoTaiDemo2
{
 public static void main(String[] args)
 {
  Animal c = new Cat();//类型提升,向上转型
  c.eat();
                          如果想要调用猫的方法时,如何操作
                    类型强制转换,转换成子类类型,乡下转型
  Cat c = (Cat)c;
  
  Animal a  = new Animal();//如果父类可以建立对象
  Cat c = (Cat)c;//       此处是错误的,动物不能强转为猫,从属关系不一样
                              就是说,不能将父类转换为子类类类型
                              我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,可以被强转
                               多态自始至终都是子类对象在做着变化
 }
 public static void function(Animal a)
 {
  a.eat();
  if (a instanceof Cat)//关键字instanceof
  {
   Cat c = (Cat)a;
   c.catchMouse();
  }
 }
}

   

5、多态的应用

实例程序

  abstract class Student......................对对象进行抽取,父类,抽象类
{
 public abstract void study();................两个功能
 public void sleep()
 {
  System.out.println("躺着睡");
 }
}
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");
 }
 public void sleep()
 {
  System.out.println("站着睡");
 }
}

class teacher.......................................定义老师类,进行功能调用,基于多态
{
 public static void doSome(Student a)....注意此处,多态,父类接受子类对象,其实也是父类指向子类对象
 {
  a.study();
  a.sleep(); 
 }

}
class DuoTaiDemo3
{
 public static void main(String[] args)
 {

  teacher.doSome(new AdvStudent());...函数静态化,直接类名调用即可
 }

6、多态中成员特点

成员函数特点(指非静态函数):

编译时期:引用型变量所属的类中是否有调用的方法,如果有,编译通过。

运行时期:对象所属类中是否有调用方法

简单就是,成员函数在调用时,编译看左边,运行看右边。
成员变量特点:

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

静态成员特点:

无论编译和运行,都参考左边     

 

二、object类

object是所有类的根类,其中定义的是所有对象都具备的功能

如果自定义类中也有比较相同的功能,没有必要重新定义

只要沿袭父类中的功能,建立自己特有比较内容即可,就是覆盖。

equals比较的是对象的内存地址值

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                       ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics