Java基础之抽象类和接口
今天来说说抽象类和接口的实现以及它们的区别。我们知道抽象类和接口都是对具体事物的抽象,接口在实现上比抽象类更加抽象,抽象类中可以有普通方法和变量,而接口中只有抽象方法和不可变常量。但是从另一个角度看,抽象类似乎又比接口更具抽象,我们在开发过程中选择定义抽象类或是接口往往是通过判断是对这一事物本质的抽象还是动作行为上的抽象,对事物本质的抽象我们选择用抽象类来定义,对动作行为的抽象我们往往采用接口进行抽象定义。下面我们从抽象类以及接口的定义上再对它们的进行区别:
一、抽象类
package com.ring2.Abstract;
public abstract class AbstractTest {
String a = "a";
private String b = "b";
public static final String C = "C"; //以上可以看出抽象类可以修饰和普通类一样的常量、变量
public void funA() {
//抽象类可以有普通方法
}
public static void funB() {
//可以有静态方法
}
//以上可以看出抽象类可以和普通类一样声明普通方法
public abstract void funC();
public abstract /*static,final*/ void funD();
//抽象类的方法不能被static或final修饰
public static void main(String[] args) {
//抽象类不能被实例化,但是可以通过匿名内部类的方式实例化或是通过其子类实例化。
AbstractTest a = new AbstractTest() {
@Override
public void funD() {
}
@Override
public void funC() {
}
};
}
}
从上面的代码我们知道了抽象类具有以下特点:
- 可以同时有抽象方法和普通方法以及变量
- 抽象类不能被实例化,但可以通过匿名内部类以及子类实现
- 子类必须重写抽象类中的抽象方法,除非子类也为抽象类
- 子类中的抽象方法访问权限应大于或等于父类的方法权限
二、接口
package com.ring2.Interface;
public interface InterfaceTest {
//private String a = "A"; 编译错误,接口中的常量只能被 public static final修饰,故只有常量
String B = "B"; //默认会被加上修饰符: public static final String B = "B";
/*public void funA() {
//编译出错,接口中不能有普通方法
}*/
void funB();//接口中的抽象方法默认会被加上修饰符:public abstract,且只能被public abstract修饰
public static void funC() {
//接口中可以有静态方法,同样只能被public修饰
//only public, abstract, default, static and strictfp are permitted
}
public default void funD() {
//接口中可以有默认方法
}
}
从上面的代码我们可以总结接口的特点:
- 接口中只有不可变常量,没有变量
- 接口中的方法只能有抽象方法、静态方法、default方法
- 接口同样不能实例化
- 子类必须重写接口中的
除了以上这些还有许多要注意的点,抽象类是被继承(extends),Java中抽象类以及普通子类只能单继承一个父类。接口是被实现(implements),普通子类及抽象类可以多实现接口,但是接口可以多继承接口。 接口中的default方法以及静态方法是在JDK1.8后新增的特性;需要注意的是,实现了有default方法的接口不需要重写default关键字,在实现的多个接口中,如果有同名的default方法则需要进行重写来区分。
public class TestDefault implements InterfaceTest,InterfaceTest2 {
@Override
public void funB() {
// TODO Auto-generated method stub
}
@Override
public void funD() {
//InterfaceTest、InterfaceTest2都有相同名称的default方法
System.out.println("需要重写两个接口中相同的default方法");
}
}
使用方向:当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。注意:抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶
段会降低难度的。
Java基础之抽象类和接口的更多相关文章
- Java基础之抽象类与接口
Java基础之抽象类与接口 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候 ...
- java基础(四)-----抽象类与接口
抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 一.抽象类 我们 ...
- 程序猿的日常——Java基础之抽象类与接口、枚举、泛型
再次回顾这些基础内容,发现自己理解的又多了一点.对于一些之前很模糊的概念,渐渐的清晰起来. 抽象类与接口 抽象类通常是描述一些对象的通用方法和属性,并且默认实现一些功能,它不能被实例化.接口仅仅是描述 ...
- java基础之抽象类与接口的区别
在学习java的过程中,或者是在找工作笔试或面试的时候,如果你是java岗位,那么抽象类与接口的区别无疑是一个大热点,是各大公司都想要考的一个小知识点,下面是我为了9月份秋招自己总结的,若有不对的地方 ...
- java基础之抽象类与接口的形式参数和返回值
抽象类与接口形式参数和返回值问题 1.形参问题 /* 1.形式参数: 基本类型(太简单,不是我今天要讲解的) 引用类型 (1)类名:(匿名对象的时候其实我们已经讲过了) 需要的是该类的对象 (2)抽象 ...
- 3、java基础:抽象类与接口的区别
抽象类 我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的.如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样 ...
- JAVA基础知识|抽象类与接口类
一.抽象类 抽象类:拥有抽象方法的类就是抽象类,抽象类要使用abstract声明 抽象方法:没有方法体的方法,必须要使用abstract修饰 为什么要使用抽象类,抽象方法? 举例来说,如果你定义了一个 ...
- java基础之抽象类和接口的区别
抽象类和接口的区别 A:成员区别 抽象类: 成员变量:可以是变量,也可以是常量 构造方法:有 成员方法:可以是抽象方法,也可以是非抽象方法 接口: 成员变量:只能是静态常量(不写修饰符,默认是 sta ...
- Java基础(basis)-----抽象类和接口详解
1.抽象类 1.1 abstract修饰类:抽象类 不可被实例化 抽象类有构造器 (凡是类都有构造器) 抽象方法所在的类,一定是抽象类 抽象类中可以没有抽象方法 1.2 abstract修饰方法:抽象 ...
随机推荐
- Linux网络管理员:网络概论
1.TCP/IP网络 包是适合通过网络传输的一小段数据,交换发生于网络的每一个链接点.当不同来源的包必须经过同一条线路传输数据时,这些包将被交替传输. 2.TCP/IP协议组 TCP/IP协议簇是In ...
- docker中安装nginx,部署前端代码
最近在学习docker,初次接触,难免遇到磕磕碰碰,遂将其整理成博客,以便日后查看. 1.拉取nginx镜像 直接从官方镜像库拉取简单粗暴: docker pull nginx 2.运行 docker ...
- 实战-MySQL定时增量备份(2)
概要 引言 增量备份 恢复增量备份 定时备份 引言 在产品上线之后,我们的数据是相当重要的,容不得半点闪失,应该做好万全的准备,搞不好哪一天被黑客入侵或者恶意删除,那就 gg 了.所以要对我们的线上数 ...
- C语言编程入门题目--No.14
题目:将一个正整数分解质因数.例如:输入90,打印出90=233*5. 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程 ...
- bzoj4318 OSU!和bzoj 3450 Tyvj1952 Easy
这俩题太像了 bzoj 3450 Tyvj1952 Easy Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有n次点 ...
- 转载acm几何基础(2)
判断两条线段是否相交: 矢量 如果一条线段的端点是有次序之分的话,那么这种线段就称为 有向线段,如果有向线段p1p2的起点p1在坐标的原点,则可以把它称为矢量p2 矢量的加减 设二维矢量 P = (x ...
- 【学习笔记:Python-网络编程】Socket 之初见
Socket 是任何一种计算机网络通讯中最基础的内容.当你在浏览器地址栏中输入一个地址时,你会打开一个套接字,可以说任何网络通讯都是通过 Socket 来完成的. Socket 的 python 官方 ...
- 如何对Code Review的评论进行分级
我曾写过一篇关于Code Review的文章<Code Review 最佳实践>,在文章中建议对Code Review的评论进行分级: 建议可以对Review的评论进行分级,不同级别的结果 ...
- Java中的动态定义数组
1.一维矩阵的动态定义(代码注释) 1.1方法一 package dongtai; import java.util.Scanner; import java.util.ArrayList; publ ...
- schedule定时任务出现问题 (大坑已填)!!
因为python每次运行完,并不清除内存,nowtime一直不变,这导致了一个致命问题,使我的脚本一直运行失败,具体如下: 我设置的是每隔30分钟登陆一次,代码如下 if __name__ == &q ...