Java中abstract和interface的概念理解

abstract

abstract:抽象的

1、可以用来修饰:类、方法

2、具体的:
 2.1、abstract修饰的类是一个抽象类,此类不能被实例化,抽象类一定有构造器,构造器便于子类实例化时调用

 2.2、开发中,都会提供抽象类的子类,让子类对象实例化,完全相关操作    :抽象使用的前提是继承
        
 2.3、abstract修饰的方法都是抽象方法,抽象方法都没有方法体
        
 2.4、包含抽象方法的类一定是一个抽象类,抽象类不一定有抽象方法

 2.5、子类必须重写父类中的抽象方法,该子类才可以实例化,否则该子类也是一个抽象类
        
3、注意点:

    3.1、abstract不能用来修饰:构造器、属性等结构

    3.2、abstract不能用来修饰私有(private)方法,静态方法(static),final方法,final类

4、abstract的应用案例:

abstract class AA{		// 这是一个抽象类
    public void print(){    // 该方法可以不被重写
        System.out.println("这是第一个方法");
    };

    public abstract void print2();  // 这是一个抽象方法需要被子类重写
}

interface

interface:接口

1.接口使用interface定义
2.Java中接口和类是并列关系
3.如何定义接口:定义接口中的成员

3.1    JDK7及以前:只能定义全局常量和抽象方法
        全局常量:public static final,书写时可以省略不写
        抽象方法:public abstract的

3.2    JDK8:在原基础上增加了静态方法和默认方法
        静态方法:public static void print(){}
        默认方法:default void print(){}

4.接口不能定义构造器,不能定义构造器意味着不能实例化!!!

5.Java开发中,接口通过让类去实现(implements)的方式来使用
如果实现类覆盖了接口中的抽象方法,则该实现类可以实例化
    如果实现类没有覆盖接口中的抽象方法,那么该实现类扔是一个抽象类(abstract)

6.Java类可以实现多接口    --- 弥补了Java单继承的局限性(extends只能单继承)
格式:class AA extends BB implements CC,DD,EE......

7.接口和接口之间可以多继承

8.接口的具体使用,体现多态性

9.接口也可以看作是一种规范

2.举例

interface AA{
    public static final int n = 10;   // 全局常量
    public abstract void print1();  // 抽象方法,没有方法体
    public static void print2(){};  // 静态方法
    default void print(){
        System.out.println("这是一个默认方法");
    }
}

3.体会面向接口的思想

接口是一种多继承的类似类,它没有构造器,也就是说不能创建对象,但可以被其他类所实现,从而达到一个获取方法的作用,也可以作为一种接口,让实现类来实现方法,把接口隐藏起来,不对外开放,只能通过实现类来调用它的方法

4.Java8中关于接口的新规范

1、接口中定义的静态方法,只能通过接口来调用

class Test{
    public static void main(String[] args) {
        AA.print2();    // 静态方法只能被接口调用
    }
    interface AA{
        public static final int n = 10;   // 全局常量
        public abstract void print1();  // 抽象方法,没有方法体
        public static void print2(){};  // 静态方法
        default void print(){
            System.out.println("这是一个默认方法");
        }
    }
}

2、通过实现类的对象,可以调用接口中的默认方法(default)

class Test{
    public static void main(String[] args) {
        Test.BB b1 = new Test.BB();
        b1.print1();    // 抽象方法,已被重写
        b1.print();     // 默认方法,可重写也可不重写
    }
    interface AA{
        public static final int n = 10;   // 全局常量
        public abstract void print1();  // 抽象方法,没有方法体
        public static void print2(){};  // 静态方法
        default void print(){
            System.out.println("这是一个默认方法");
        }
    }
    
    static class BB implements AA{

        @Override
        public void print1() {
            
        }
    }
}

2.1如果实现类重写了接口中的默认方法,那么调用时是实现类中的重写方法
3、如果子类(或实现类)继承的父类和实现的接口声明了同名的默认方法,若子类未重写该默认方法,则优先使用父类的默认方法,类优先原则

4、如果实现类实现了多个接口,而多个接口中定义了同名同参数的默认方法,
// 若实现类未重写方法,报错 --> 接口冲突
// 需要我们在实现类中必须重写该方法

5、如何在子类(或实现类)的方法中调用父类,接口中被重写的方法

interface CC{
    default void print(){
        System.out.println("这是接口中的方法");
    }
}
class AA{   // 父类
    public void print(){
        System.out.println("这是父类中的方法");
    }
}

class BB extends AA implements CC{
    public void print2(){
        print();    // 子类调用自己的方法
        CC.super.print();   // 调用接口中的默认被重写的方法
    }

    @Override
    public void print() {
        super.print();  // 子类调用父类中的方法
    }
}

6、抽象类与接口的异同

相同点:不能实例化;都可以包含抽象方法

不同点:抽象类有构造器,接口没有构造器,抽象类是类,只能单继承,接口可以多继承多实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值