面向对象_多态

面向对象_多态

1、多态的概念和前提

1、概念-什么是多态
     对象在不同时刻表现出来的不同状态。
2、针对引用类型的理解

     编译期间状态和运行期间状态不一样

     比如 
          Person p = new Person();//第一行
          p = new Man();//第二行
          p = new Woman();//第三行
          p在第一行和第二行的状态是不一样的,在第一行表示人对象,在第二行表示学生对象

3、举例

         (,,水蒸气)

         狗:狗是狗,狗是动物,狗是宠物,狗是食物//该处强调谁是谁的一种


4、前提条件

       A:要有继承关系或实现关系

       B:要有方法重写或实现关系

       C:要有父类引用指向子类对象,或父接口引用指向子类对象

2、多态的成员特点

     1、成员变量

          编译看左边,运行看左边。//就是因为变量不存在重写
          Fu fu  = new Zi();
          System.out.println(fu.name);//调用的是父类的name属性

     2、非静态成员方法 

          编译看左边,运行看右边。//因为方法存在重写
          Fu fu = new Zi();
          fu.show();//调用的是子类的show()
     3、产生以上现象的原因
          因为方法有重写,变量没有

3、多态的弊端和好处

弊端: 
     父类引用不能直接使用子类对象的特有功能 
     如何解决这个问题?
     答:向下转型 (就是强转)
     格式  (子类)父类
好处:
     增强了程序的扩展性和可维护性

4、基本类型和引用类型中类型转换问题

1、基本类型:隐式转换(小到大),强制转换(大到小)
隐式转换:
byte b = 1;
int i = b;
强制转换:
int i = 1;
byte b = (byte)i;       
2、引用类型:向上转型(小到大),向下转型(大到小)
向上转型 (由小到大):
Zi zi = new Zi();
Fu fu  = zi;
向下转型 (由大到小):
          Fu fu = new Zi();
          Zi zi = (Zi)fu;
3、引用类型转换过程中的问题

     该异常产生的原因:类型不匹配
          一个父类的引用指向的是狗,要把这个父类的引用强制转换成猫,所以不行
          Animal animal = new Dog();
          Cat cat = (Cat)animal;//因为animal存储的是狗,强转成猫就会报错   

5、抽象类和抽象方法

1、抽象方法
     只有方法声明,没有方法体的方法称为抽象方法,该方法被abstract修饰
2、抽象类
     如果一个类中含有抽象方法,这个类就可以被称为抽象类。该类也需要被abstract修饰
3、什么时候定义抽象类
     如果一个方法我们不确定他要做什么,就把这个方法定义成抽象的,那么这个类就必须被定义成抽象的
4、格式
          定义抽象类的格式
               abstract class Animal{
                    abstract void eat();
                    public void run(){
                         System.out.println("我在跑步");
                    }
               }     
          使用格式1 
               定义个普通类,继承抽象类,必须实现抽象类中的抽象方法
               class Dog extends Animal{
                    void eat(){
                          System.out.println("狗吃骨头");
                    }
               }
          使用格式2
               定义一个抽象类继承抽象类,不是必须要实现父类的抽象方法
               abstract class ChongWu extends Animal{
               }

6、抽象类的基本特点及作用

     1、抽象方法和抽象类用关键字abstract表示。
     2、有抽象方法的类一定是抽象类(或者接口)抽象类中不一定有抽象方法。
     3、抽象类不能被实例化。//因为被实例化后根本不知到他具体代表的谁
     4、如果一个类继承抽象类,那么这个类要么本身也是抽象类。这个类 必须 重写父类的所有抽象方法。

作用: 强制要求子类必须完成某些功能

7、抽象类的成员特点

     1、成员变量
          可以有成员变量,也可以有常量。
     2、构造方法 
          有构造方法,但是不能通过构造方法创建对象

     问:既然不能被实例化,那么有构造方法有什么用?

     答:可以用于子类访问父类数据前,对父类数据进行初始化。

     3、成员方法

          1、可以有抽象方法,也可以有非抽象方法。

          2、非抽象方法和抽象方法的作用

     抽象方法是为了要求子类做某些事情。

     非抽象方法是为了提高代码复用性,被子类继承。

8、接口

1、概念     
2、定义格式

         interface 接口名

         {

             //静态常量和抽象方法

         }
3、使用格式
     一个类实现一个接口

               class 类名 implements 接口名1,接口名2...

               {

               }
     一个抽象类实现一个接口,不必重写接口中的抽象方法
               abstract class 类名 implements 接口1, 接口2,接口.....
               {

               }
     一个接口继承一个接口
                interface 接口名 extends 接口1,接口2..
                {
}


9、接口的基本特点

1、接口不能被实例化。

2、接口中的方法:

          要么被子类重写。

          要么子类也是抽象类。

10、接口的成员特点

1、成员变量:接口中只有常量

因为接口的成员变量有默认修饰符:public static final

推荐:永远自己给出修饰符。

2、构造方法

没有构造方法//因为接口中的成员变量都被final修饰,定义的时候必须做初始化

任何类如果没有继承父类,那么这个类就继承自Object类。//所有类都直接或者间接的继承自Object类。Object类是所有类的超类

3、成员方法:接口中的方法都是抽象的

          因为接口中的成员方法有默认修饰符:public abstract

          推荐:永远自己给出修饰符。

4、接口的注意事项
      接口中不能有静态代码块,代码块,构造方法

11、接口的思想特点

接口是对外暴露的规则

接口是程序的功能扩展

接口的出现降低耦合性

接口可以用来多实现

12、抽象类和接口,类和接口的关系

1、抽象类和接口的关系

         抽象类:

                   成员变量:可以是变量,也可以是常量。

                   构造方法:有构造方法。

                   成员方法:可以是抽象方法,也可以是非抽象方法。

         接口:

                   成员变量:只能是常量。

                              默认修饰符:public static final

                   成员方法:只能是抽象方法。

                              默认修饰符:public abstract

2、类与接口的关系

         类与类:

                   继承关系,只能单继承,可以多层继承。

         类与接口:

                   实现关系,可以单实现,也可以多实现。

                   还可以在继承一个类的同时,实现多个接口。

         接口与接口:

                   继承关系,可以单继承,也可以多继承。

3、设计理念的区别

         抽象类被继承,这个类中定义的是整个继承体现的共性内容。

                   体现:is a

         接口被实现,这个接口中定义的是整个体现的扩展内容。

                   体现:like a

13、什么时候定义抽象类,什么时候定义接口

      人刚生下来就具备哭的行为特征,但是每个人哭的行为不一样,并且人生下来都有鼻子有眼,所以人应该定义为抽象类,这些与生俱来的属性和行为应该定义在抽象类里面。
      随着人的年纪的增加,会学习舞蹈,吉他,这些都是后天培养的拓展的功能,所以应该把学习跳舞和学习吉他定义为接口,这些后天学习的拓展功能应该定义在接口里。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值