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. 20210819 Emotional Flutter,Medium Counting,Huge Counting,字符消除2

    考场 T1 一下想到了这题,将白块缩短 \(s\) 后维护类似的区间即可. T2 T3 俩计数,直接跳了. T4 的可行 \(t\) 集合相同相当与从 \(n\) 往前跳 kmp 数组,途径点相同,从 ...

  2. NOIP模拟「random·string·queen」

    T1:random   我又来白剽博客了:   详细证明请看土哥   土哥写的不是很详细,我在这里详细写一下:   首先,对于f[n]的式子:   加一是那一个对的贡献,大C是选其余的几个数,\(2^ ...

  3. windows下配置VSCode免密SSH连接Linux机器

    先决条件 Windows下安装openssh软件(win10自带,可以不用搞) 从官网下载最新版本默认安装即可 VSCode安装插件 VSCode官方市场获取两个插件:"Remote - S ...

  4. 274 day04_Map,斗地主案例

      day04 [Map] 主要内容 Map集合 教学目标 [ ] 能够说出Map集合特点 [ ] 使用Map集合添加方法保存数据 [ ] 使用"键找值"的方式遍历Map集合 [ ...

  5. CodeForce-762B USB vs. PS/2(贪心)

    USB vs. PS/2 CodeForces - 762B 题意:有三种电脑,分别有a.b.c个,第一种只有USB接口,第二种只有PS/2接口,第三种有两种接口,有m个鼠标,告诉你价钱和接口类型,问 ...

  6. 获取发布版SHA1和调试版SHA1

    总结 调试版: 常见问题 | 高德地图API (amap.com) 发布版: 首先需要生成签名 Android Studio生成签名文件,自动签名,以及获取SHA1和MD5值_donkor_的博客-C ...

  7. centos7 未启用swap导致内存使用率过高。

    情况描述: 朋友在阿里云上有一台系统为CentOS7的VPS,内存为2GB,用于平时开发自己的项目时测试使用: 他在上面运行了5个docker实例,运行java程序:还有一个mysql服务: 上述5个 ...

  8. dede编辑文章不更新时间的方法

    在修改文章的时候,发现织梦DEDECMS5.7这个版本存在一个问题,修改文章的同时也修改了文章的发布时间,这个 功能可能有些人比较需要,但同时也有些站长朋友又不需要,因为我们编辑某个文章的时候,发现编 ...

  9. aws中centos登陆连接设置

    第一步:使用aws密钥文件(.pem)登陆(*在shell中需使用新建的会话,不能直接,使用原来的会话进行修改,否则无法进入) 点击浏览器,点添加,再点击导入,选择.pem 文件 第二步: 登陆后,使 ...

  10. 制作python程序windows安装包(飞机大战源码)

    本文以飞机大战源码为例: 1.首先使用pyinstaller -w xxx.py打包   -w的意思是不显示命令行:飞机大战源码由多个.py文件以及一些图片,音乐文件组成,我们将main.py打包, ...