抽象类,接口,多态,向上(下)转型,内部类

抽象类:
   因为继承的关系,子类的功能可以越来越具体,相对来说,父类
  更加一般化,通用化。因为父类封装了子类的共同行为,所以,
 在定义时,我们可以定义方法的逻辑。有的时候,在父类中无法完成
 子类的功能需求,此时,不如不写,即不写方法体,代码简单化。
 但是此方法必须使用abstract修饰,那么此类型也必须使用abstract
 修饰,即抽象类
 
1、抽象方法与抽象类
  1)用abstract修饰的方法,不需要写方法体,但是得用分号来结尾 
  2)有抽象方法的类,必须使用abstract声明(修饰)
2、抽象类不能实例化
  1)  抽象类不能创建对象,没有意义
  2)  抽象类可以提供构造器
  3)  抽象类中可以没有抽象方法
  4)  abstract和final不能同时修饰一个类型
3、继承抽象类
  1)若一个类继承了抽象类,那么这个类必须重写(实现)抽象类的所有抽象方法 
  2)若一个类没有实现抽象类的所有抽象方法, 那么这个类必须使用abstract修饰
4、抽象类的意义:
   1)给不同的子类定义一个父类
   2)抽象类可以封装子类的共同特征与共同行为
   3)虽然子类方法可能有不能的实现逻辑,但是
         方法的定义一致。


接口:
        有时我们需要从多个不相关的类中设计出一个子类型,而java继承
        是单继承的特点,无法满足我们的需求,所以,我们可以使用接口来达到
        多继承的目的。 
        
        接口实际上就是一种规范制度。   (规范与规则的理解)
接口的特点:
   (1)接口使用interface关键字,而不是class,
            但是我们可以理解成接口是特殊的抽象类
   (2)接口里只能有抽象方法和常量     
   (3)接口不能实例化,没有任何意义
   (4)接口不能提供构造方法
 
接口中的常量:
       默认使用修饰词为public static final                      
接口中的方法
        默认使用public abstract
   
接口的实现
   (1)子类需要实现接口中的所有抽象方法,
   (2)使用implements关键字进行实现
   (3)如果子类没有实现所有抽象方法,那么子类需要使用abstract修饰
   (4)子类可以实现多个接口,接口间使用逗号分开
  
  
接口间的继承
   (1)接口与接口之间可以使用继承。
             子接口继承了父接口的抽象方法
   (2)支持多继承                
   
======================================
多态:面向对象的特征之一  (重写属于多态)

     向上造型:
             父类型的变量引用子类型的对象
    (1) 父类型的变量指向不同的子类型对象,
                调用的功能有不同的实现       
       Animal  a =  new  Dog();
                   a.noise();//叫   
               a =   new  Cat();
                a.noise();//叫   
         
    (2)不同的父类型变量指向同一个对象有不同的功能
       ZhengYangDoor  a  = new  ZhengYangDoor();
            a.theftproof();//防盗
            a.openDoor();//开门
       InterA   ia = a;
               ia.theftproof();   
               
    向下造型:
        将父类型(接口)的变量赋值给子类型或者是其他父类型(接口)的变量
        Animal a = new Dog(); 
        Dog dog   =(Dog)a;
        dog.吃骨头();
        
        Cat cat = (Cat)a;//编译通过,语法正确,运行期间,造型错误
        cat.扑捉老鼠();
        
       运行期间有可能会发生类造型异常:java.lang.ClassCastException 
        
    
             为了避免出现错误:我们需要使用关键字instanceof来判断
             对象是不是要转换成的类型
         if(a instanceOf Cat){
             Cat cat = (Cat)a;
         }
                 
                         
-------------------------------    
 (1)      员工都有完成工作的行为
                    当员工是老板时,完成...工作
                    是人事       完成...工作
                    是讲师
 (2)张三这个人处在不同的环境下 有不同的功能    


内部类:
    是定义在一个类的内部的新类型。即内部类,另外一个类称之为
    外部类。
   
  根据位置不同:
   可以有  成员内部类
                方法内部类(局部内部类)
  带static修饰词的类   静态内部类
 没有名称的类:   匿名内部类  
 
 最不常用的:方法内部类,静态内部类
     方法内部类:定义在方法中,相当于局部变量,仅限于在方法中使用
                  定义时不能使用修饰词,可以直接访问外部类的非静态成员变量
     静态内部类:也是以类的成员来定义的,只不过多了一个修饰词static
                        可以直接访问外部类的静态成员
 
相对而言,成员内部类和匿名内部类比较常用。
      成员内部类:以类的成员来定义,可以使用任何修饰词来修饰。

成员内部类访问外部类的成员
 方法内隐藏一个指向外部类对象的引用。
 外部类名.this.

             
成员内部类的使用:
    创建对象:
       要先创建一个外部类的对象outer
    然后使用外部类对象去使用new调用内部类的构造器实例化
     Inner  inner = outer.new Inner(有参传参);    
外部类访问成员内部类的成员
       在外部类添加一个内部类的成员变量进行访问  
       
       
匿名内部类:
    没有名字的类型,写在外部类的方法中,只用一次,不需要定义类的结构,
    通常都是为了实现接口,抽象类或某一现有的类的子类     
    子类没有名称,所以称之匿名  
    
当我们想使用某个类,抽象类或接口的子类对象时,因为我们只想用一次,我们就可以不定义子类
的结构,因此可以使用匿名内部类的写法,没有子类名称,写法可以向上造型,=后面是new 
 我们想使用的类的名称(可以有参){};大括号里重写接口或抽象类里的所有抽象方法,或
重写某一个实现方法。

猜你喜欢

转载自blog.csdn.net/qq_42397691/article/details/81584120