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. shell循环语句until

    until 条件 do 执行命令 done until 循环与 while 循环在处理方式上刚好相反. 当条件成立的时候,停止循环.

  2. CSP 2021 游记

    \(\text{Day -INF}\) 看见了 \(\text{SCP2021}\) 的报名通知,想着应该教练会让我们统一报名,就没放在心上 然后-- 然后过了二十多天教练根本没有提报名的事情,搞得我 ...

  3. linux网络编程(一)

    ============================================================== 第一天:基本概念.TCP.FTP: =================== ...

  4. vue-cli3 创建多页面应用项目

    1.创建vue项目 cmd命令执行  vue create ruc-continuing  创建vue项目,项目名称:ruc-continuing 选择一个 preset(预置项),或自定义: 选择自 ...

  5. java线程day-02

    1.什么是线程 * 线程是程序执行的一条路径, 一个进程中可以包含多条线程 * 多线程并发执行可以提高程序的效率, 可以同时完成多项工作 2.多线程的应用场景 * 红蜘蛛同时共享屏幕给多个电脑 * 迅 ...

  6. php升级版本后的影响5.5->7.1

    微信开发中之前常用到$GLOBALS['HTTP_RAW_POST_DATA'] ,但升级后这个参数不见了,导致了一系列错误, 可以用 file_get_contents('php://input') ...

  7. ThinkPHP5通过composer安装Workerman安装失败问题

    报错: topthink/think-worker v3.0.2 requires topthink/framework ^6 https://blog.csdn.net/Douz_lungfish/ ...

  8. iOS之内存管理-字节对齐

    字节对齐 1 struct Mystruct1{ 2 char a; //1字节 3 double b; //8字节 4 int c; //4字节 5 short d; //2字节 6 }Mystru ...

  9. 谷歌浏览器chrome安装插件报"程序包无效: CRX_HEADER_INVALID"错误

    今天参加需求评审,看到原来可以谷歌浏览器查看Axure原型文件,真是只有想不到,没有做不到(自己孤陋寡闻了,第一次接触Axure). 需求评审后,我百度"如何使用谷歌浏览器查看Axure原型 ...

  10. Charles注册

    方法一:注册码注册 ** 注册码注册:** Registered Name: https://zhile.io License Key: 48891cf209c6d32bf4 亲测4.6.1可用 方法 ...