Java:抽象类和接口小记
Java:抽象类和接口小记
对 Java 中的 抽象类和接口,做一个微不足道的小小小小记
抽象类:使用 abstract 修饰,子类用 extends 继承;
接口:使用 interface 修饰,采用 implements 实现;
构造函数:
- 抽象类中可以定义构造函数(但是抽象类不能被实例化);
- 接口不能定义构造函数;
演示一下:
// 抽象类
public abstract class AbstractTest {
// 正常
public AbstractTest() {
System.out.println("abstract class");
}
} /******************分割线*********************/ // 接口
public interface InterfaceTest {
// error:Interface abstract method cannot have body
public InterfaceTest(){}
}
成员变量:
抽象类中的成员权限可以是 public、默认、protected、private
注:抽象类中抽象方法就是为了重写,所以不能被 private 修饰;
而接口中的成员只可以是 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;
}
成员方法:
- 抽象类中可以有抽象方法和具体方法,
- 而接口中只能有抽象方法(public abstract),但在 JDK1.8中,允许在接口中包含带有具体实现的方法,使用 default 修饰,这类方法就是默认方法。
- 抽象类中可以包含静态方法;
- 接口中不可以包含静态方法,同样在JDK1.8 以后可以包含,之前不能包含是因为,接口不可以实现方法,只可以定义方法,所以不能使用静态方法(因为静态方法必须实现)。现在可以包含了,只能直接用接口调用静态方法。
- 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:抽象类和接口小记的更多相关文章
- java抽象类与接口的区别及用法
java抽象类与接口的区别及用法 一.抽象类里面的方法可以有实现,但是接口里面的方法确是只能声明. 二.接口是设计的结果 :抽象类是重构的结果 . 三.java不支持多重继承,所以继承抽象类只能继承一 ...
- Java 抽象类与接口总结
一.为什么要使用抽象类?有什么好处? 抽象类是通用接口.不同的子类可以用不同的方法表示此接口.通用接口建立起一种基本形式,以此表示所有子类的共同部分. 必须覆写父类abstract抽象的方法 含有抽 ...
- JAVA抽象类和接口的深入探讨
Java 语言中,抽象类(abstract class) 和接口(interface) 是抽象思想的两种体现形式.初学者很容易把这两者搞混,所以Java面试中考抽象类和接口的区别的面试题也常有出现的. ...
- 第十八节:详解Java抽象类和接口的区别
前言 对于面向对象编程来说,抽象是它的特征之一. 在Java中,实现抽象的机制分两种,一为抽象类,二为接口. 抽象类为abstract class,接口为Interface. 今天来学习一下Java中 ...
- Java抽象类和接口的比较
一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法和一些具体 ...
- java抽象类与接口区别
java抽象类与接口区别: abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstr ...
- Java抽象类和接口的区别(好长时间没看这种文章了)
Java抽象类和接口的区别(好长时间没看这种文章了) abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的 ...
- Java 抽象类和接口的理解
Java 抽象类和接口的理解 一.抽象类 为什么使用抽象类(个人理解): 面向对象的概念是,我们知道的所有的对象都是通过类来描绘的,如果类包含的信息不能描绘一个具体的对象,就需要抽象来解决了,意思是一 ...
- 记录:JAVA抽象类、接口、多态
JAVA抽象类.接口.多态 1. 多态 定义 多态是同一个行为具有多个不同表现形式或形态的能力.(多态就是同一个接口,使用不同的实例而执行不同操作) 如何实现多态 继承和接口 父类和接口类型的变量赋值 ...
随机推荐
- Eclipse开发Java的简单配置
目录 Eclipse配置Java开发环境 1.配置JDK 2.切换项目的JDK版本 3.配置maven 4.配置lombok Eclipse配置Java开发环境 时隔N年重新使用Eclipse,对一些 ...
- NOIP模拟「random·string·queen」
T1:random 我又来白剽博客了: 详细证明请看土哥 土哥写的不是很详细,我在这里详细写一下: 首先,对于f[n]的式子: 加一是那一个对的贡献,大C是选其余的几个数,\(2^ ...
- Mysql常用sql语句(4)- distinct 去重数据
测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 我们使用select进行数据查询时是会返回所有匹 ...
- MongoDB(3)- Database 数据库相关
Database MongoDB 将数据记录存储为文档(特别是 BSON 文档) 这些文档在集合中聚集在一起 数据库存储一个或多个文档集合. 在 MongoDB 里面存在数据库的概念,但没有模式 Sh ...
- .Net 如何修改 HttpHeaders 中的 Content-Disposition
最近在看一些.Net5的内容,于是就想将之前Spring写的一个项目迁移到.Net上来看看. 不得不说.Net这几年发展的确实挺好的,超快的启动速度,极佳的性能让它一点不比Java差,但确实在国内生态 ...
- Spring基于XML方式加载Bean定义信息(又名:Spring IOC源码时序图)-图解
- MySQL实战45讲(06--10)-笔记
目录 06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍? 全局锁 表级锁 小结 07 | 行锁功过:怎么减少行锁对性能的影响? 死锁和死锁检测 08 | 事务到底是隔离的还是不隔离的? &quo ...
- 【数据库上】第五讲 E-R模型扩展知识
第五讲 E-R模型扩展知识 一.E-R模型设计主意问题 1.1 用实体还是实体集 案例:学院对象的表示 应将各个学院看做实体集,还是实体? 方法一:将各个学院看作一个实体集 如果各学院具有不同属性特征 ...
- sqlmap --eval 用法
今天查资料发现 sqlmap 有一个 --eval 的参数 --eval=EVALCODE Evaluate provided Python code before the request (e.g. ...
- springboot多数据源配合docker部署mysql主从实现读写分离
本篇主要有两部分: 1.使用docker部署mysql主从 实现主从复制 2.springboot项目多数据源配置,实现读写分离 一.使用docker部署mysql主从 实现主从复制 此次使用的是wi ...