Java:抽象类和接口小记

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

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

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

构造函数:

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

演示一下:

// 抽象类
public abstract class AbstractTest {
// 正常
public AbstractTest() {
System.out.println("abstract class");
}
} /******************分割线*********************/ // 接口
public interface InterfaceTest {
// error:Interface abstract method cannot have body
public InterfaceTest(){}
}

成员变量:

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

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

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

演示一下

// 抽象类:
public abstract class AbstractTest {
public AbstractTest() {
System.out.println("abstract class");
} public int a = 0;
int b = 0;
protected int c = 0;
private int d = 0;
// 成员变量是可以用private修饰的
private String e = "hello"; public void out(){
System.out.println(d);
System.out.println(e);
}
} public class Demo extends AbstractTest { public static void main(String[] args) {
Demo demo = new Demo();
demo.out();
}
} // 输出:
// abstract class
// 0
// hello /******************分割线*********************/ // 接口:
public interface InterfaceTest { int a = 10;
// error:Modifier 'protected' not allowed here
protected int b = 10;
// error:Modifier 'default' not allowed here
default int c = 20;
// info:Modifier 'public' is redundant for interface field
public int d = 30;
// public static final可以不加,是默认的
public static final int e = 40;
}

成员方法:

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

演示一下:

// 抽象类
public abstract class AbstractTest {
public AbstractTest() {
System.out.println("abstract class");
} public int a = 0;
int b = 0;
protected int c = 0;
private int d = 0;
// 成员变量是可以用private修饰的
private String e = "hello"; // 具体方法,在继承AbstractTest的类中可以直接调用
public void method1(){
System.out.println(d);
System.out.println(e);
} // 静态方法,可以通过 AbstractTest.method2()进行调用
public static String f = "world";
public static void method2(){
System.out.println(f);
} // 抽象方法,后续抽象方法必须是继承类中实现,否则继承类也是个抽象类
public abstract void method3();
abstract void method4();
protected abstract void method5();
// error: illegal combination of midifiers: 'abstract' and 'private'
// private abstract void method6();
} /******************分割线*********************/ // 接口
public interface InterfaceTest { int a = 10;
// public static final可以不加,可以不加
public static final int b = 20; // 抽象方法:public abstract可以不加,是默认,且只能用这个修饰
public abstract void method1(); // 默认方法:必须只能用default修饰
default void method2(){
System.out.println("默认方法");
} // 静态方法: 通过InterfaceTest.method3()调用
// 只能用public去修饰,可加可不加,其他的 protected/private/default都是不允许的
public static void method3(){
System.out.println("静态方法");
}
} public class Demo implements InterfaceTest { public static void main(String[] args) {
Demo demo = new Demo();
// 实现了抽象方法调用
demo.method1();
// 调用默认方法
demo.method2();
// 调用静态方法
// demo.method3(); // 和抽象类不同,不能这样调用
InterfaceTest.method3(); // 只能这样调用
} @Override
public void method1() {
System.out.println();
}
}

总结:

抽象类 接口
类修饰符 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. adb 常用命令大全(4)- 应用管理

    查看应用列表 语法格式 adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER] ...

  2. 快速模式第二包: quick_inI1_ouR1()

    文章目录 1. 序言 2. quick_inI1_outR1()流程图 3. 快速模式消息②数据包格式 4. 源码分析 4.1 quick_inI1_outR1() 4.2 quick_inI1_ou ...

  3. word域实现动态填充信息附件下载

    1.问题描述:在页面上一些下载附件功能,点击触发执行下载操作时候,有些电脑的浏览器可以,有些电脑的浏览器下载不了,电脑打开弹出的下载框下载的不是一个文件,而是一个如jspx后缀名的页面,jspx后缀是 ...

  4. Haproxy搭建web集群

    目录: 一.常见的web集群调度器 二.Haproxy应用分析 三.Haproxy调度算法原理 四.Haproxy特性 五.Haproxy搭建 Web 群集 一.常见的web集群调度器 目前常见的we ...

  5. 【分布式微服务企业快速架构】SpringCloud分布式、微服务、云架构快速开发平台源码

    鸿鹄云架构[系统管理平台]是一个大型 企业.分布式.微服务.云架构的JavaEE体系快速研发平台,基于 模块化.微服务化.原子化.热部署的设计思想,使用成熟领先的无商业限制的主流开源技术 (Sprin ...

  6. 在开发中使用GMap.Net 控件的心得一

    首先必须先加载GMap.Net这个控件,先通过"添加引用"来加载相应的.dll文件,如果在工具箱中找不到GMapControl这个控件,也别心急. 点击"工具" ...

  7. 彻底解决Hive小文件问题

    最近发现离线任务对一个增量Hive表的查询越来越慢,这引起了我的注意,我在cmd窗口手动执行count操作查询发现,速度确实很慢,才不到五千万的数据,居然需要300s,这显然是有问题的,我推测可能是有 ...

  8. trait能力在PHP中的使用

    相信大家对trait已经不陌生了,早在5.4时,trait就已经出现在了PHP的新特性中.当然,本身trait也是特性的意思,但这个特性的主要能力就是为了代码的复用. 我们都知道,PHP是现代化的面向 ...

  9. Nginx TP5环境配置

    Apache默认支持Pathinfo模式  Nginx不支持  需要手动配置  Apache默认支持Pathinfo模式  Nginx不支持  需要手动配置 server { #配置监听端口 list ...

  10. 手把手教你调试SpringBoot启动 IoC容器初始化源码,spring如何解决循环依赖

    授人以鱼不如授人以渔,首先声明这篇文章并没有过多的总结和结论,主要内容是教大家如何一步一步自己手动debug调试源码,然后总结spring如何解决的循环依赖,最后,操作很简单,有手就行. 本次调试 是 ...