【知了堂学习笔记】java 接口与抽象类
本次主角:抽象类 、接口。
对于皮皮潇这样一类的Java初学者来说,接口和抽象类如果不去花大量的精力与时间是很难弄清楚的,而我也是在最近这周的项目学习中感觉到了我对这两个概念不熟悉,所以导致对一些问题不能理解清楚,然后就去查阅资料对抽象类与接口做了一些总结。
1.抽象类:
抽象类的建立,实在抽象方法之后的,所以想要了解抽象类得先了解抽象方法,抽象方法由名字可以知道它是一种特殊的方法,是抽象的,只有方法的声明,没有具体的实现。所以不能看到它的功能,表现得就很抽象。
抽象方法必须要用abstract关键字来修饰,其声明格式为 abstract void f();所以如果一个类含有一个抽象方法就称这个类为抽象类,抽象类也必须用abstract关键字来修饰。
这里有一个值得注意的地方就是一个类不包含抽象方法,但是被abstract关键字修饰,那么这个类也是抽象类。抽象类里面也不是只能有抽象方法,也能有普通方法。同样也能有成员变量,
由于抽象类里面的抽象方法不能具体实现,所以为了解决这个问题用到了继承。而且子类必须覆盖父类所有的抽象方法,这个子类才能被实例化,否则这个子类也必须用abstract来修饰。
具体代码:
//这里就是定义了一个抽象类Demo,然后让其子类Demo1去继承它,下面子类的方法完全覆盖父类的方法所以编写时不会报错。
package suanfa; abstract class Demo {
abstract void show(); abstract void pi();
} class Demo1 extends Demo {
void show() {
} void pi() {
} }
//然而我将子类的pi方法注释了后,eclipse中就会出现以下错误,会告诉你必须实现pi这个方法。
package suanfa; abstract class Demo {
abstract void show(); abstract void pi();
} class Demo1 extends Demo {
void show() {
} // void pi() {
// } }
//当然这里我将Demo1写为abstract的,也不会出现错误
package suanfa; abstract class Demo {
abstract void show(); abstract void pi();
} abstract class Demo1 extends Demo {
void show() {
} // void pi() {
// } }
抽象类和普通类的主要区别:
①:抽象方法不能被private修饰,因为private修饰的方法子类无法覆盖。
②:抽象类不能创造对象。
③:如果一个类继承抽象类必须实现抽象类里面的所有方法,如果子类没实现抽象类的所有方法,则子类也必须用abstract关键字修饰为抽象类。
2.接口:
接口是一系列方法的声明,可以理解为一个存放方法的集合。接口只有方法的特征,不能具体的实现方法,所以接口里面的方法都是抽象方法。这些方法可以在不同的地方被不同的类实现。
允许一个类遵循多个特定的接口。
接口是一个极度抽象的类型。
3.接口与抽象类的区别
①:抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract方法;
②:抽象类的成员可以是各种类型的,接口中只能是public static final类型的;
③:接口中不能有静态代码块和静态方法,抽象类中可以有。
④:一个类只能继承一个抽象类(一对一),一个类可以实现多个接口(一对多);
举例:
抽象类是对事物的抽象,即对类抽象,而接口是抽象行为,对动作抽象。
如:狗和猫都有共同的行为跑,那么可以将够设计为一个Dog类,猫设计为一个Cat类,但是不能将Run设计为一个类。此时可以将Run放入一个接口中,然后Dog与Cat都可以去实现Run这个接口,里面有run()这个方法,然后dog里面的小狗,大狗不同的类型,直接继承Dog这个类就好了。这里就可以看出,接口里面我只需要有跑这个动作的类都可以实现Run这个接口。
抽象类是模板设计,而接口是行为规范。
这里有一个网上找门和警报的例子:
门都有open()与close()这两个动作,则可以定义一个抽象类Door或者一个Door接口来放置这两个方法:
abstract class Door{
public abstract void open();
public abstract void close();
}
或者:
interface Door{
public abstract void open();
public abstract void close();
}
但是后面我们需要加入报警这个动作进来,
如果我们将报警alarm()也放入Door这个类中则会发现,我们所有的门都赋予了报警的功能,实际上我们有些门是不能报警的。
如果我们将alarm(),open(),close()这三个动作都放入Door这个接口中,会发现我们需要用到报警这个功能的时候,接口中的open()与close()这两个方法也被实现了
所以这里就可以看出alarm()与open()、close()完全是两个不同范畴的行为,open()、close()是门固有的行为,alarm()是后来加入的行为。所以最好的解决方法是将open()、close()这两个行为放入Alarm类中,将alarm()单独放入一个接口中。再设计一个报警们继承Door类和实现Alarm这个接口。
abstract class Door{
public abstract void open();
public abstract void close();
}
interface Alarm{
public abstract void alram();
}
class AlarmDoor extends Door implements Alarm{
public void alram() {
}
public void open() {
}
public void close() {
}
}
www.zhiliaotang.com 请关注知了堂,这里有太多好学的程序员,加入我们,一起嗨皮,共同学习。
【知了堂学习笔记】java 接口与抽象类的更多相关文章
- 【知了堂学习笔记】java 自定义异常
java 常见异常种类(Java Exception): 算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCas ...
- 1)Java学习笔记:接口和抽象类的异同
Java接口和抽象类很像,他们有哪些相同点和异同点呢,下面我们做一个小结 相同 ① 都不能被实例化,都位于继承树的顶端,用于被实现或者继承 ② 都可以包含抽象方法,实现接口或者继承抽象类的普通子类都必 ...
- 【知了堂学习笔记】java 底层容易忽略的知识点
1. java中的关键字 提到关键字,最主要的就是不能用关键字作为标识符,值得注意的有以下几点. ①其中goto与const在java中没有定义,但是也是关键字.这个基本用不到,但是应该有个认知. ② ...
- 【知了堂学习笔记】java 编写几种常见排序算法
排序的分类: 一.交换排序 所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动. 1.冒泡 ...
- 【知了堂学习笔记】java web 简单的登录
最近皮皮潇在学习java web,刚接触了简单的东西,所以今天给大家带来一个简单的登录实现. 页面: 页面代码: <%@ page language="java" conte ...
- 【知了堂学习笔记】java IO流归纳总结
皮皮潇最近学到了IO流但是感觉这一块要记的东西太多了,所以重API上查阅并总结了以下几点关于IO的知识. 1.File(文件类): File类是文件以及文件夹进行封装的对象,用对象的思想来操作文件和文 ...
- 【知了堂学习笔记】java 方法重载与重写的归纳
方法重载:Java的方法重载,就是在类中可以创建多个方法,它们可以有相同的名字,但必须具有不同的参数,即或者是参数的个数不同,或者是参数的类型不同.调用方法时通过传递给它们的不同个数和类型的参数来决定 ...
- [知了堂学习笔记]_牵线Eclipse和Tomcat第一篇 —— 配置Java环境变量&&安装eclipse
一.先给他们提供一个"浪漫的"环境,比如传说中的"鹊桥"--java环境变量.哈哈! 配置java环境变量. 下载jdk,根据自己电脑的版本和操作位数选择不同的 ...
- 【知了堂学习笔记】java 编写几种常见排序算法2
排序的分类: 1.直接选择排序 它的基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,....,第i次从R[i-1]~ ...
随机推荐
- 把一个IEEE754浮点数转换为IBM370浮点数的C#代码
把一个IEEE754浮点数转换为IBM370浮点数的C#代码. 在这个网页上有古老的IBM370浮点格式的说明. // http://en.wikipedia.org/wiki/IBM_Floatin ...
- [译]Quartz.NET 框架 教程(中文版)2.2.x 之第八课 调度监听器
第八课 调度监听器 调度监听器和触发监听器和触发监听器.作业任务监听器非常相似,只是调度监听器在调度器内接收通知事件,而不需要关联具体的触发器或作业任务事件. 跟调度监听器相关的事件,添加作业任务/触 ...
- 2016-2017-2 《Java程序设计》第五周学习总结
20155223 2006-2007-2 <Java程序设计>第五周学习总结 教材学习内容总结 第八章 try.catch语法:若程序发生错误,执行流程就调离错误点,然后比较catch括号 ...
- Anaconda+django写出第一个web app(四)
前面对Models有了一些了解,今天开始进一步了解Views,了解Views如何和Models交互以及了解模板(templates). 打开main文件夹下的views.py,重新编写homepage ...
- Rest-Framework组件源码之认证、频率、权限
一:使用RestFramwork,定义一个视图 from rest_framework.viewsets import ModelViewSet class BookView(ModelViewSet ...
- Centos6.5下搭建nagios详解
一.LAMP环境部署 1.安装php 1.安装yum源 rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-releas ...
- mysql备份的 三种方式【转】
备份的本质就是将数据集另存一个副本,但是原数据会不停的发生变化,所以利用备份只能回复到数据变化之前的数据.那变化之后的呢?所以制定一个好的备份策略很重要. 一.备份的目的 做灾难恢复:对损坏的数据进行 ...
- Python解决八皇后问题的代码【解读】
八皇后问题 来自于西方象棋(现在叫 国际象棋,英文chess),详情可见百度百科. 在西方象棋中,有一种叫做皇后的棋子,在棋盘上,如果双方的皇后在同一行.同一列或同一斜线上,就会互相攻击. 八皇后问题 ...
- 【CF767C】Garland
传送门啦 分析: 这个题我是看着翻译做的,感觉不是很难,很普通的一个树形dp 题目大意: 在一棵树上分离出三个子树,使这三个子树的点权和相等. 明确题目意思这个题就简单多了吧. 我们会发现每一棵子树的 ...
- Flask form
用户登录 #!/usr/bin/env python # -*- coding:utf- -*- from flask import Flask, render_template, request, ...
