Java:抽象类和接口小记

对 Java 中的 抽象类和接口,做一个微不足道的小小小小记

抽象类:使用 abstract 修饰,子类用 extends 继承;

接口:使用 interface 修饰,采用 implements 实现;

构造函数:

  1. 抽象类中可以定义构造函数(但是抽象类不能被实例化);
  2. 接口不能定义构造函数;

演示一下:

  1. // 抽象类
  2. public abstract class AbstractTest {
  3. // 正常
  4. public AbstractTest() {
  5. System.out.println("abstract class");
  6. }
  7. }
  8. /******************分割线*********************/
  9. // 接口
  10. public interface InterfaceTest {
  11. // error:Interface abstract method cannot have body
  12. public InterfaceTest(){}
  13. }

成员变量:

  1. 抽象类中的成员权限可以是 public、默认、protected、private

    注:抽象类中抽象方法就是为了重写,所以不能被 private 修饰

  2. 而接口中的成员只可以是 public(方法默认:public abstract 、成员变量默认:public static final);

演示一下

  1. // 抽象类:
  2. public abstract class AbstractTest {
  3. public AbstractTest() {
  4. System.out.println("abstract class");
  5. }
  6. public int a = 0;
  7. int b = 0;
  8. protected int c = 0;
  9. private int d = 0;
  10. // 成员变量是可以用private修饰的
  11. private String e = "hello";
  12. public void out(){
  13. System.out.println(d);
  14. System.out.println(e);
  15. }
  16. }
  17. public class Demo extends AbstractTest {
  18. public static void main(String[] args) {
  19. Demo demo = new Demo();
  20. demo.out();
  21. }
  22. }
  23. // 输出:
  24. // abstract class
  25. // 0
  26. // hello
  27. /******************分割线*********************/
  28. // 接口:
  29. public interface InterfaceTest {
  30. int a = 10;
  31. // error:Modifier 'protected' not allowed here
  32. protected int b = 10;
  33. // error:Modifier 'default' not allowed here
  34. default int c = 20;
  35. // info:Modifier 'public' is redundant for interface field
  36. public int d = 30;
  37. // public static final可以不加,是默认的
  38. public static final int e = 40;
  39. }

成员方法:

  1. 抽象类中可以有抽象方法和具体方法,
  2. 而接口中只能有抽象方法(public abstract),但在 JDK1.8中,允许在接口中包含带有具体实现的方法,使用 default 修饰,这类方法就是默认方法。
  3. 抽象类中可以包含静态方法;
  4. 接口中不可以包含静态方法,同样在JDK1.8 以后可以包含,之前不能包含是因为,接口不可以实现方法,只可以定义方法,所以不能使用静态方法(因为静态方法必须实现)。现在可以包含了,只能直接用接口调用静态方法
  5. JDK1.8中,接口仍然不可以包含静态代码块。

演示一下:

  1. // 抽象类
  2. public abstract class AbstractTest {
  3. public AbstractTest() {
  4. System.out.println("abstract class");
  5. }
  6. public int a = 0;
  7. int b = 0;
  8. protected int c = 0;
  9. private int d = 0;
  10. // 成员变量是可以用private修饰的
  11. private String e = "hello";
  12. // 具体方法,在继承AbstractTest的类中可以直接调用
  13. public void method1(){
  14. System.out.println(d);
  15. System.out.println(e);
  16. }
  17. // 静态方法,可以通过 AbstractTest.method2()进行调用
  18. public static String f = "world";
  19. public static void method2(){
  20. System.out.println(f);
  21. }
  22. // 抽象方法,后续抽象方法必须是继承类中实现,否则继承类也是个抽象类
  23. public abstract void method3();
  24. abstract void method4();
  25. protected abstract void method5();
  26. // error: illegal combination of midifiers: 'abstract' and 'private'
  27. // private abstract void method6();
  28. }
  29. /******************分割线*********************/
  30. // 接口
  31. public interface InterfaceTest {
  32. int a = 10;
  33. // public static final可以不加,可以不加
  34. public static final int b = 20;
  35. // 抽象方法:public abstract可以不加,是默认,且只能用这个修饰
  36. public abstract void method1();
  37. // 默认方法:必须只能用default修饰
  38. default void method2(){
  39. System.out.println("默认方法");
  40. }
  41. // 静态方法: 通过InterfaceTest.method3()调用
  42. // 只能用public去修饰,可加可不加,其他的 protected/private/default都是不允许的
  43. public static void method3(){
  44. System.out.println("静态方法");
  45. }
  46. }
  47. public class Demo implements InterfaceTest {
  48. public static void main(String[] args) {
  49. Demo demo = new Demo();
  50. // 实现了抽象方法调用
  51. demo.method1();
  52. // 调用默认方法
  53. demo.method2();
  54. // 调用静态方法
  55. // demo.method3(); // 和抽象类不同,不能这样调用
  56. InterfaceTest.method3(); // 只能这样调用
  57. }
  58. @Override
  59. public void method1() {
  60. System.out.println();
  61. }
  62. }

总结:

抽象类 接口
类修饰符 public/不加 public/不加
构造方法 可以有
普通成员变量 可以有,类的普通成员变量相同 不能有,即使定义了也是被默认修饰了
public static final
普通成员方法 可以有,和类的普通成员方法相同
即可以用 public/protected/static/final进行修饰
JDK9 之后可以有
JKD8 中可以有用单用default修饰的有方法体的方法
抽象方法 可以用 public/protected/不加 只能是 public 的
且默认是 public abstract
静态方法 可以有 JDK9 之后可以有
JDK8 中可以有单用static修饰的有方法体的方法
静态成员 有,定义的变量会被默认加上
public static fianl
继承/实现 只能继承一个抽象类
可以实现多个接口
接口之间还可以多继承

其中表中的不加,即表示默认的访问修饰符,只在本包中可见,在外包中不可见;如果外包中继承/实现就会无法找到相应的类/接口/抽象方法;而在本包中使用无恙。

JDK 1.8 前,抽象类的方法默认访问权限为 protected

JDK 1.8 时,抽象类的方法默认访问权限变为 default

Java:抽象类和接口小记的更多相关文章

  1. java抽象类与接口的区别及用法

    java抽象类与接口的区别及用法 一.抽象类里面的方法可以有实现,但是接口里面的方法确是只能声明. 二.接口是设计的结果 :抽象类是重构的结果 . 三.java不支持多重继承,所以继承抽象类只能继承一 ...

  2. Java 抽象类与接口总结

    一.为什么要使用抽象类?有什么好处? 抽象类是通用接口.不同的子类可以用不同的方法表示此接口.通用接口建立起一种基本形式,以此表示所有子类的共同部分. 必须覆写父类abstract抽象的方法  含有抽 ...

  3. JAVA抽象类和接口的深入探讨

    Java 语言中,抽象类(abstract class) 和接口(interface) 是抽象思想的两种体现形式.初学者很容易把这两者搞混,所以Java面试中考抽象类和接口的区别的面试题也常有出现的. ...

  4. 第十八节:详解Java抽象类和接口的区别

    前言 对于面向对象编程来说,抽象是它的特征之一. 在Java中,实现抽象的机制分两种,一为抽象类,二为接口. 抽象类为abstract class,接口为Interface. 今天来学习一下Java中 ...

  5. Java抽象类和接口的比较

    一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法和一些具体 ...

  6. java抽象类与接口区别

    java抽象类与接口区别: abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstr ...

  7. Java抽象类和接口的区别(好长时间没看这种文章了)

    Java抽象类和接口的区别(好长时间没看这种文章了) abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的 ...

  8. Java 抽象类和接口的理解

    Java 抽象类和接口的理解 一.抽象类 为什么使用抽象类(个人理解): 面向对象的概念是,我们知道的所有的对象都是通过类来描绘的,如果类包含的信息不能描绘一个具体的对象,就需要抽象来解决了,意思是一 ...

  9. 记录:JAVA抽象类、接口、多态

    JAVA抽象类.接口.多态 1. 多态 定义 多态是同一个行为具有多个不同表现形式或形态的能力.(多态就是同一个接口,使用不同的实例而执行不同操作) 如何实现多态 继承和接口 父类和接口类型的变量赋值 ...

随机推荐

  1. Jenkins(7)- 解决Linux下忘记Jenkins密码

    如果想从头学起Jenkins的话,可以看看这一系列的文章哦 https://www.cnblogs.com/poloyy/category/1645399.html admin密码未更改情况下 进入\ ...

  2. app自动化定位:UIautomation的用法

    UIautomation定位的优点: 速度比xpath定位快,UIautomation是Android的工作引擎 缺点: 没有idea提示 UIautomation使用方法: AndroidDrive ...

  3. Emit优化反射(属性的设置与获取)

    在频繁的通过反射来设置和获取属性的值时是比较耗时的,本章通过Emit技术优化反射来提高获取和设置属性值的效率 一.实现代码: /// <summary> /// 设置器委托 /// < ...

  4. 恶意软件开发——突破SESSION 0 隔离的远线程注入

    一.前言 在Windows XP,Windows Server 2003以及更早的版本中,第一个登录的用户以及Windows的所有服务都运行在Session 0上,这样的做法导致用户使用的应用程序可能 ...

  5. PHP中的那些魔术常量

    之前我们已经了解了一些常用的魔术方法,除了魔术方法外,PHP还提供一些魔术常量,相信大家在日常的工作中也都使用过,这里给大家做一个总结. 其实PHP还提供了很多常量但都依赖于各类扩展库,而有几个常量是 ...

  6. Java基础系列(9)- 数据类型扩展及常见面试题

    整数拓展 // 整数拓展: 进制 二进制0b 十进制 八进制0 十六进制0x // 同一个数字在不同进制中,结果是不同的,进制换算 int i = 10; int i2 = 010; // 八进制 i ...

  7. 替代jquery中的几个函数

    // https://open.alipay.com/developmentAccess/developmentAccess.htm var $ = window.jQuery; (function( ...

  8. Windows下nginx报错解决:CreateFile() "xxx/logs/nginx.pid" failed

    写在前面 本文给出Windows下nginx报错:CreateFile() "xxx/logs/nginx.pid" failed 的解决方法并分析了出错原因,其中 xxx 表示n ...

  9. 电商管理后台 API 接口文档

    1. 电商管理后台 API 接口文档 1.1. API V1 接口说明 接口基准地址:http://127.0.0.1:8888/api/private/v1/ 服务端已开启 CORS 跨域支持 AP ...

  10. 腾讯首个CNCF沙箱开源项目

    作者 SuperEdge开发者.腾讯云容器产品中心边缘计算团队.腾讯开源生态管理协会 SuperEdge 进入 CNCF 沙箱 2021 年 9 月 14 日,云原生分布式边缘容器系统 SuperEd ...