美文网首页
抽象类 接口 多态

抽象类 接口 多态

作者: MixCG | 来源:发表于2019-03-04 10:14 被阅读0次
    J2SE

    抽象类abstract class

    • abstract 关键字修饰的 称为 抽象类

    1. 为什么需要抽象类?

    如果一部分类都具备共同的功能,就可以将该方法定义在父类中,
    如果各子类对该功能的具体实现(或者不能准确描述定义)不同,
    就可将该方法定义为抽象方法 该父类定义为抽象类
    

    2. 抽象方法

    • abstract 关键字修饰的 非静态final 方法 称为抽象方法
    public class Example{
            //抽象方法
           public abstract void method();
    }
    
    特点:
    1. 抽象方法无具体实现
    2. 如果一个类中有了抽象方法,说明这个类表示的事物也是描述不清的,需要定义为抽象类;
    3. 抽象方法不可用 private 或  static ,final 关键字修饰
    (表示不可被重写(final) 不参与继承(private) 如果是static只属于类 )
    

    3.抽象类的特点

    1. 抽象类无法实例化
    2. 子类继承抽象类,必须实现父类的所有抽象方法,否则子类也必须定义为抽象类
    3. 抽象类一定是父类
    4. 抽象类中可定义:静态成员变量,非静态成员变量,代码块(静态|非静态),方法(静态|非精态),构造器,抽象方法
    5. 抽象类不一定包含抽象方法,有抽象方法的类一定是抽象类
    6. 如果一个类不包含抽象方法,但被允许继承不允许实例化,可讲该类定义为抽象类
    7. 抽象类不可用final 修饰(表示不可被继承)
    

    多态

    • 同一事物的不同表现形式 称为多态
      前提: 必须有继承关系 (因为多态实际就是 父类的多种具体表现形式 )
      体现: 父类型的引用指向子类实例
    1. 多态的优点:
    1. 抽象性表述 
    2. 高内聚 低耦合 (`High cohesion & Low coupling`)
    3. 提高扩展性 代码复用性
    
    1. 多态的缺点
    只能调用父类中声明的成员变量和方法,子类中的不能直接调用(多态的类型转换)
    

    3.多态的类型转换

    • 自动提升类型
      在使用多态时,父类型引用指向子类型对象,相当于将子类型对象的类型提升为父类型,叫做向上提升类型;这个过程可以自动进行;
      public class Super{
        
      }
      public class  Child extends Super{
          public void hello(){
                
          }
    
          public static void main(String[] args){
                Super s = new Child(); //自动转型
                s.hello();
          }
      }
    
    
    • 强制向下转型

    子类型的引用指向父类型的实例,相当于转换为子类型,这个过程需要强制转换
    注意: 在强转向下转型时,务必确保引用对象是强转类型的子类型,否则将抛出RuntimeException:ClassCastException

    public class Test{
        public static void main(String[] args){
              Super s = new Super();
              //强制转型
              Child c = (Child) s;
        }
    }
    
    • instance of 运算符
      强制向下转型时经常会抛出类型转换异常:ClassCastException 如要避免抛出此异常,在转型时需要提前进行类型检查来判断类型的正确性

    使用: Object instance of Class

    注意:

    如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。
    
    但是instanceof在Java的编译状态和运行状态是有区别的:
    
    在编译状态中:
    class可以是object对象的父类,自身类,子类。在这三种情况下Java编译时不会报错。
    
    在运行转态中:
    class可以是object对象的父类,自身类,不能是子类。在前两种情况下result的结果为true,最后一种为false。但是class为子类时编译不会报错。运行结果为false。              
    
    
    1. 多态中类的成员
    • 多态中的成员,在编译期全部看父类,运行期只有非静态 函数看子类
    编译时:
    使用的所有成员(静态和非静态的)都要检查父类中有没有
    运行时:
    只有非静态函数使用的是子类中的,其他成员全  
    部都是父类的
    
    多态发生在父类型引用class和子类对象Object之间,所以静态成员不参与多态,编译和运行都看父类;
    非静态成员,编译期都看父类,运行期,函数看子类;
    

    接口interface

    • 声明: public interface Example(){}
    • 关键字: interface

    注意:

    1. 在接口中只存在 静态成员常量 和 抽象方法
    2. 接口是抽象的,不可被实例化
    3. 类与接口的关系是实现 使用关键字implements 实现接口的类称为实现类
    4. 实现接口,必须实现接口中的所有抽象方法
    5. 在Java中,类只能单继承,但可以多实现
    6. 接口与接口之间可以存在继承关系
    7. 接口没有构造器(constractor)
    

    1.接口的多态性

    • 大多数情况下,以多态的形式应用接口
    1. 接口与抽象类的区别
    • 共同点: 接口和抽象类的共同点:都可以有抽象函数,都不能实例化
    • 不通点:
    不同点 抽象类 接口
    声明 abstract interface
    结构 包含变量方法 只包含常量和抽象方法
    构造器 true false
    作用 抽象类描述的是继承体系中的共同的特征和行为,如果行为不确定,就定义为抽象函数; 接口描述的是不属于继承体系的共同的功能;接口可以用来定义规则;
    继承性 单一继承和多重继承 接口和接口可以多继承和多重继承;接口和实现类可以多实现

    相关文章

      网友评论

          本文标题:抽象类 接口 多态

          本文链接:https://www.haomeiwen.com/subject/oaqbuqtx.html