美文网首页
基础问题:抽象类/接口的细节特点

基础问题:抽象类/接口的细节特点

作者: 凉风拂面秋挽月 | 来源:发表于2019-12-21 19:46 被阅读0次

    抽象类

    特点:
    1、方法只有声明,没有实现时,该方法就是抽象方法,需要被abstract修饰。
    2、抽象类不可以被实例化。因为用抽象方法无意义。
    3、抽象类必须由其子类覆盖了所有的抽象方法,该子类才可以被实例化,否则这个子类还是抽象类。
    细节:
    1、抽象类中可以有构造函数,用于给子类初始化。
    2、抽象类可以不定义抽象方法,目的是不让该类创建对象。
    3、abstract关键字不可以与private、static、final关键字共存。
    4、抽象类与一般类的不同点:
    ①一般类有足够信息描述事物;抽象类描述事物的信息可能不足。
    ②一般类中不能定义抽象方法,只能定义非抽象的;抽象类中既能定义抽象的,也能定义非抽象的。
    ③一般类能被实例化;抽象类不能被实例化。
    5、抽象类一定是父类,因为需要子类覆盖其方法后才能被初始化。

    使用原则:
    (1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public;
    (2)抽象类不能直接实例化,需要依靠子类采用向上转型的方式处理;
    (3)抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类;
    (4)子类(如果不是抽象类)则必须覆写抽象类之中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
    (5)抽象类不可以用final声明,因为抽象类必须有子类,而final定义的类不能有子类
    添加:同4,抽象类在实现接口的时候可以不实现接口的方法(当然也可以实现),如果不实现就是抽象类的子类去实现,相当于异常的try catch和throw的区别
    设计模式:
    抽象类的最常见使用是模板模式。
    例如,现在有三类事物:
    (1)机器人:充电,工作;
    (2)人:吃饭,工作,睡觉;
    (3)猪:进食,睡觉。
    现要求实现一个程序,可以实现三种不同事物的行为。
    先定义一个抽象行为类.

    public abstract class Action{
        
        public static final int EAT = 1 ;
        public static final int SLEEP = 3 ;
        public static final int WORK = 5 ;
        
        public abstract void eat();
        public abstract void sleep();
        public abstract void work();
        
        public void commond(int flags){
          switch(flags){
            case EAT:
                this.eat();
                break;
            case SLEEP:
                this.sleep();
                break;
            case WORK:
                this.work();
                break;
            case EAT + SLEEP:
                this.eat();
                this.sleep();
                break;
            case SLEEP + WORK:
                this.sleep();
                this.work();
                break;
            default:
                break;
            }
        }
    }
    

    定义一个机器人类:

    public class Robot extends Action{
    
        @Override
        public void eat() {
            System.out.println("机器人充电");
            
        }
    
        @Override
        public void sleep() {
            
        }
    
        @Override
        public void work() {
            System.out.println("机器人工作");
            
        }
        
    }
    

    其他同理
    在测试类调用

    public class AbstractDemo {
    
        public static void main(String[] args) {
            
            fun(new Robot());
            
            fun(new Human());
            
            fun(new Pig());
    
        }
        
        public static void fun(Action act){
            act.commond(Action.EAT);
            act.commond(Action.SLEEP);
            act.commond(Action.WORK);
        }
    
    }
    

    运行结果:

    机器人充电
    机器人工作
    人吃饭
    人睡觉
    人工作
    猪进食
    猪睡觉
    

    接口

    一个接口可以有多个方法。
    接口文件保存在 .java 结尾的文件中,文件名使用接口名。
    接口的字节码文件保存在 .class 结尾的文件中。
    接口相应的字节码文件必须在与包名称相匹配的目录结构中。
    接口不能用于实例化对象。
    接口没有构造方法。
    接口中所有的方法必须是抽象方法。
    接口不能包含成员变量,除了 static 和 final 变量。
    接口不是被类继承了,而是要被类实现。
    接口支持多继承。
    接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
    接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
    接口中的方法都是公有的。
    当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。
    类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。
    一个类可以同时实现多个接口。
    一个类只能继承一个类,但是能实现多个接口。
    一个接口能继承另一个接口,这和类之间的继承比较相似。
    一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。
    在Java中,类的多继承是不合法,但接口允许多继承。
    在接口的多继承中extends关键字只需要使用一次,在其后跟着继承接口。
    接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
    接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
    接口中的方法都是公有的。
    接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
    接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
    接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
    抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
    抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
    接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
    一个类只能继承一个抽象类,而一个类却可以实现多个接口。

    相关文章

      网友评论

          本文标题:基础问题:抽象类/接口的细节特点

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