前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JAVA知识基础(六):抽象

JAVA知识基础(六):抽象

作者头像
栗筝i
发布2022-12-01 08:39:41
2600
发布2022-12-01 08:39:41
举报
文章被收录于专栏:迁移内容

1.概述

抽象类、抽象方法以及接口,这三个知识点是每个程序员必备的基础,无论是在实际编程的时候,还是在面试的时候,都会出现这类问题,面试官很可能就会问你,interface和abstract的区别

当父类知道子类应该包含什么样的方法,但无法确定子类如何实现这些方法;在分析事物时,会发现事物的共性,将共性抽取出,实现的时候,就会有这样的情况:方法功能声明相同,但方法功能主体不同,这时,将方法声明抽取出,那么,此方法就是一个抽象方法。

2.抽象类小结

  1. 抽象类和抽象方法都必须用abstract修饰符来修饰,抽象方法不能有方法体
  2. 抽象类有构造器,但不能直接被实例化,要创建对象涉及向上转型,主要是用于被其子类调用
  3. 抽象类中可以没有抽象方法,但是有抽象方法的类必定是抽象类
  4. 抽象类中可以包含静态方法
  5. 抽象类不能用final修饰
  6. 抽象类不能用private修饰
  7. 抽象类也是类,一样是用来继承的,接口与类才是实现关系
  8. 外部抽象类不能用Static修饰,但内部的抽象类可以使用static声明
  9. 抽象类可以继承抽象类,抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,则其具体非抽象派生类必须覆盖它们
  10. 抽象类可以实现接口,可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法

3.抽象类组成分析

普通类可以包含构造方法、普通方法、static方法、常量和变量等内容。而抽象类也是类,而且是一个特别的类,抽象类是指在普通类的结构里面选择性的增加抽象方法并以abstract关键字将该类修饰,是的,每个抽象类不管有没有抽象方法在其类结构中,abstract关键字非加不可。

1、抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。 2、抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。 3、抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。 4、抽象类的构造器不能用于创建实例,主要是用于被其子类调用。 5、抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类 6、abstract static不能同时修饰一个方法 (abstract方法没有方法体不能直接调用,static方法可以直接调用,冲突)

4.不能共存的关键字

不能与抽象类(abstract)共存的关键字主要有三个,分别是final、private、static

1、final final:抽象类不能用final修饰。因为抽象类一定要被abstract修饰,而且抽象类一定要被继承否则该抽象类无意义。而被final修饰的类不能被继承,也就是说不能有子类,所以二者冲突不能同时使用!

2、private private: 抽象类不能用private修饰,只能用public或protected。首先要明确一点:被abstract修饰的类是为了让非抽象子类看到并强制重写。如果抽象类中有私有的抽象方法,那么该抽象方法不被子类所知,就无法被复写。 而抽象方法出现的就是需要被复写。

3、static static:如果static可以修饰抽象方法,那么连对象都省了,直接类名调用就可以了。众所周知,抽象方法是没有方法体的,可见运行也就没意义了。虽然外部抽象类不能用Static修饰,但内部的抽象类却可以使用static声明

代码语言:javascript
复制
//定义一个抽象类A
abstract class A{
   //定义一个内部抽象类B
    static abstract class B{  //static定义的内部类属于外部类
        public abstract void saoMethod();
    }
}
class C extends A.B{
    public void saoMethod(){
        System.out.println("======saoMethod方法执行了======");
    }
}
public class StaticDemo {
    public static void main(String[] args) {
        A.B ab = new C();//向上转型
        ab.saoMethod();
    }
}

运行结果: saoMethod方法执行了

说白了抽象类的功能就是一个类定义模板的功能。

5.关于接口(interface)

接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。

接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。

6.抽象类与接口的区别

下面比较一下两者的语法区别:

1.抽象类可以有构造方法,接口中不能有构造方法。 2.抽象类中可以有普通成员变量,接口中没有普通成员变量 3.抽象类中可以包含非抽象的普通方法,接口中的可以有非抽象方法,比如deaflut方法 4.抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然 eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。 5.抽象类中可以包含静态方法,接口中不能包含静态方法 6.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。 7.一个类可以实现多个接口,但只能继承一个抽象类。

注意 有抽象方法不一定是抽象类,也可能是接口。抽象类不一定有抽象方法,可以有非抽象的普通方法。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.概述
  • 2.抽象类小结
  • 3.抽象类组成分析
  • 4.不能共存的关键字
  • 5.关于接口(interface)
  • 6.抽象类与接口的区别
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档