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. 多态 定义 多态是同一个行为具有多个不同表现形式或形态的能力.(多态就是同一个接口,使用不同的实例而执行不同操作) 如何实现多态 继承和接口 父类和接口类型的变量赋值 ...
随机推荐
- 【算法】使用Golang实现加权负载均衡算法
背景描述 如下图所示,负载均衡做为反向代理,将请求方的请求转发至后端的服务节点,实现服务的请求. 在nginx中可以通过upstream配置server时,设置weight表示对应server的权重. ...
- noip模拟18
\(\color{white}{\mathbb{曲径通幽,星汉隐约,缥缈灯影,朦胧缺月,名之以:薄雾}}\) 放眼望去前十被我弃掉的 \(t2\) 基本都上85了-- 开考就以为 \(t2\) 是个大 ...
- git各种操作:基本操作 and 多人协作 and 冲突解决
git基本操作 git 上次文件到远程仓库(参考:https://blog.csdn.net/beiqiaofeng123/article/details/104859326) 如果第一次上传,配置一 ...
- 抽奖之Flash大转盘
1.搭建JS与Flash互通的环境 function thisMovie(movieName){ if (window.document[movieName]) { return window.doc ...
- 自己实现Controller——标准型
标准Controller 上一篇通过一个简单的例子,编写了一个controller-manager,以及一个极简单的controller.从而对controller的开发有个最基本的认识,但是细心观察 ...
- 什么是云效 Projex,云效Projex企业级高效研发项目管理平台
云效项目协作Projects是一款企业级高效研发项目管理平台, 提供了快速实践的敏捷研发项目管理机制,提供对需求.迭代.缺陷各个维度的协同管理以及相关的统计报告,让研发团队高效协作.践行敏捷并持续交付 ...
- xmind使用技巧
xmind看似每个人都会使用,但是掌握一些小技巧,能够有效提升工作效率. 多行复制粘贴 在xmind中选中多行,复制然后可以直接粘贴到excel.word当中. 在excel.word选中多行,复制然 ...
- [源码解析] PyTorch 流水线并行实现 (3)--切分数据和运行时系统
[源码解析] PyTorch 流水线并行实现 (3)--切分数据和运行时系统 目录 [源码解析] PyTorch 流水线并行实现 (3)--切分数据和运行时系统 0x00 摘要 0x01 分割小批次 ...
- fastjson将json转为Map<String,String>踩坑
字符串 对于一个json字符串 String str = "{"specItem":"[红, 大]","specName":&qu ...
- spring-data-redis 上百万的 QPS 压力太大连接失败,我 TM 人傻了
大家好,我们最近业务量暴涨,导致我最近一直 TM 人傻了.前几天晚上,发现由于业务压力激增,某个核心微服务新扩容起来的几个实例,在不同程度上,出现了 Redis 连接失败的异常: org.spring ...