抽象类和接口

抽象类和接口(总)

抽象类的引入

  • 代码小细节

    • 将一个基类 定义为抽象类后就不再允许定义它的对象了。

    • sysout+alt+/

    • 方法名+alt+/ 重写

    • public interface Comparable{//接口
          public final int NUM = 20;//定义常量属性
          int NUM = 20;//定义常量的第二种方法
          public abstract void train();//定义抽象方法
          public abstract void compareTo(Object another);//定义抽象方法
          void fun();//默认是抽象方法,因为接口中不允许定义其他方法
          public  void fun();//默认是抽象方法,因为接口中不允许定义其他方法
          public static void funStatic(){
              System.out.println("接口中的静态方法");
          }
          public default void funDefault(){
              System.out.println("接口中的default方法");
          }
      }
      
  • 基类本身生成的对象的不合理性 :例如:动物类作为基类可以派生出猫类和狗类,但是动物类本身生成对象明显不合理。因此可以将其定义为抽象类

  • 抽象类的特点

    • abstract修饰;
    • 类中可以定义抽象方法;(不强制要求)
  • 抽象方法

    • 由abstract修饰;

    • 方法只有声明没有方法体

      • public abstract clss Animal{
            private String color;
            public abstract void shout();//只有声明没有方法体
        }
        
    • 如果一个类里面有一个或多个抽象方法,那么就必须将这个类定义为abstract类。

  • 派生类继承抽象类

    • 派生类继承抽象类要么继承抽象类中所有的抽象方法,要么派生类也定义为抽象类

    • public class Cat extends Animal{
          public void shout(){
              System.out.println("喵喵喵");
          }
      }
      
    • public abstract class Cat extends Animal{
          
      }
      
    • public class PersianCat extends Cat{
          public void shout(){
              System.out.println("喵喵喵");
          }
      }
      
    • 如果从一个抽象类继承,而且想生成新类型的一个对象,就必须为基础类中的所有抽象方法提供方法定义。

      如果不这样做(完全可以选择不做),则衍生类也会是抽象的,而且编译器会强迫我们用abstract 关键字标志那个类的“抽象”本质。

      即使不包括任何abstract 方法,亦可将一个类声明成“抽象类”。如果一个类没必要拥有任何抽象方法,而且我们想禁止那个类的所有实例,这种能力就会显得非常有用。

接口(只允许公开的、抽象的、默认的、静态的和严格的)

  • 引入:有些动物有一些特殊的技能,例如钻火圈等,这些额外的动作不是所有动物一开始就具备的,所以Java提供接口来定义这些额外的功能,接口中并不给出具体的实现(抽象方法),将来那些动物需要被训练,只需要把额外的功能实现即可。

  • 接口:是一系列方法的声明方法特征的集合

  • 接口可以看作是一种特殊的抽象类,其中包含常量抽象方法的声明,而没有变量和方法的实现。JDK8之后可以定义staticdefault方法。

  • 常量和抽象方法只能用public修饰。

  • staticdefault方法必须有方法体 。访问权限修饰符:公开的、默认的

  • 定义语法(非常重要

    • public interface Comparable{
          public final int NUM = 20;//定义常量属性
          int NUM = 20;//定义常量的第二种方法
          public abstract void train();//定义抽象方法
          public abstract void compareTo(Object another);//定义抽象方法
          void fun();//默认是抽象方法,因为接口中不允许定义其他方法
          public  void fun();//默认是抽象方法,因为接口中不允许定义其他方法
          public static void funStatic(){
              System.out.println("接口中的静态方法");
          }
          public default void funDefault(){
              System.out.println("接口中的default方法");
          }
      }
      
  • 可以通过实现接口的方式具体接口中定义的功能

    • 一个类实现接口要么实现接口中所有的抽象方法,要么该类必须定义为抽象类

      • public abstract class Cat extends Animal implements Comparable{
            public void shout(){
                System.out.println("喵喵喵");
            }
        }
        
      • public class Cat extends Animal implements Comparable{
            public void shout(){
                System.out.println("喵喵喵");
            }
            public abstract void train(){
                System.out.println("我会钻火圈啦!");
            }
            public abstract void compareTo(Object another){
                System.out.println("一个类要么实现接口中所有的抽象方法要么就将自己定义为abstract类");
            }
            //重写接口中的default方法
             public void funDefault(){//不再写default修饰符
                System.out.println("重写接口中的default方法");
            }
        }
        
      • 接口的实现类不允许重写static方法

      • 接口中的实现类可以选择重写default方法 ,重写的话不加default修饰符

    • 一个类可以实现多个接口;

    • 一个接口可以被多个无关的类实现

  • 接口的继承

    • Java中的接口可以继承接口,与类的继承概念一致,一个接口继承一个父接口就会继承父接口中定义的所有方法和属性

    • 接口不能继承类

    • 一个接口可以继承多个接口

      • public interface Comparable extends INTERFACE1,INTERFACE2...{
            
        }
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值