获取Map集合中所有的key可以通过map集合的keySet()方法获取例如: Map map = new HashMap(); map.put(xx,xx); //存放数据 //.... 省略 Set set = map.keySet(); //可以通过迭代器进行测试 Iterator iter = set.iter...
public class Point { private int x; private int y; public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } ...
接口的概念在现实生活中使用的很多。例如,计算机上提供的USB接口,专门供USB设备使用,如U盘、USB风扇、USB鼠标、USB键盘等。计算机通过统一的USB接口来提高通用性,使计算机不再需要同时具备U盘专用接口、鼠标专用接口、键盘专用接口等。再如,计算机的主板上提供的PCI插槽,也提供统一的设计规范,使得遵守这个规范的声卡、显卡、网卡都可以插在PCI插槽上
有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果。
接口(interface)是抽象方法和常量值的定义的集合。
从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
01抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
02.抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
03.接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
04.一个类只能继承一个抽象类,而一个类却可以实现多个接口。
接口即标准,就是限制实现类能实现什么样的方法.第2个在java中弥补类只能单继承的缺点.接口可以实现多个
一、定义
Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
接口定义的一般形式为:
[访问控制符]interface <接口名> {
类型标识符final 符号常量名n = 常数;
返回值类型 方法名([参数列表]);
…
}
二、接口的特点
1、Java接口中的成员变量默认都是public,static,final类型的(都可省略),必须被显示初始化,即接口中的成员变量为常量(大写,单词之间用"_"分隔)
2、Java接口中的方法默认都是public,abstract类型的(都可省略),没有方法体,不能被实例化
3、Java接口中只能包含public,static,final类型的成员变量和public,abstract类型的成员方法
4、接口中没有构造方法,不能被实例化
5、一个接口不能实现(implements)另一个接口,但它可以继承多个其它的接口
6、Java接口必须通过类来实现它的抽象方法
7、当类实现了某个Java接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象类
8、不允许创建接口的实例(实例化),但允许定义接口类型的引用变量,该引用变量引用实现了这个接口的类的实例
9、一个类只能继承一个直接的父类,但可以实现多个接口,间接的实现了多继承.
三、接口的用法
1、精简程序结构,免除重复定义
比如,有两个及上的的类拥有相同的方法,但是实现功能不一样,就可以定义一个接口,将这个方法提炼出来,在需要使用该方法的类中去实现,就免除了多个类定义系统方法的麻烦。
举例:鸟类和昆虫类都具有飞行的功能,这个功能是相同的,但是其它功能是不同的,在程序实现的过程中,就可以定义一个接口,专门描述飞行。
下图是分别定义鸟类和昆虫类,其都有飞行的方法。
下图定义了接口,其类图如下:
实现代码如下:
[java] view plain copy
interface Flyanimal{
void fly();
}
class Insect {
int legnum=6;
}
class Bird {
int legnum=2;
void egg(){};
}
class Ant extendsInsect implements Flyanimal {
public void fly(){
System.out.println("Ant can fly");
}
}
classPigeon extends Bird implements Flyanimal {
public void fly(){
System.out.println("pigeon can fly");
}
public void egg(){
System.out.println("pigeon can lay eggs ");
}
}
public classInterfaceDemo{
public static void main(String args[]){
Ant a=new Ant();
a.fly();
System.out.println("Ant's legs are"+ a.legnum);
Pigeon p= new Pigeon();
p.fly();
p.egg();
}
}
程序运行结果:
Ant can fly
Ant'slegs are 6
pigeon can fly
pigeon can lay eggs
接口:
interface关键字修饰
方法只能有声明,不能有方法体,默认为public abstract。JDK1.8之后,可以有default类型的方法,可以有方法体
只能实现不能实例化
所有方法只能是public abstract。JDK1.8之后,可以有default类型的方法,可以有方法体
一个类可以实现多个接口
可以包含变量,但隐式默认为public static final
JDK1.8中的新特性,新增了默认方法(default):允许接口含有非抽象的方法,但必须用default修饰;default方法可以子类调用,子类也可不比对其实现;如子类实现了多个接口,且这些接口均包含有默认方法,则子类必须重写该默认方法。新增了静态方法:允许接口使用static关键字修饰方法并提供实现,即为静态方法;接口的静态方法只能通过接口进行调用,调用方式为:接口名:方法名。
一、定义
Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
接口定义的一般形式为:
[访问控制符]interface <接口名> {
类型标识符final 符号常量名n = 常数;
返回值类型 方法名([参数列表]);
…
}
二、接口的特点
1、Java接口中的成员变量默认都是public,static,final类型的(都可省略),必须被显示初始化,即接口中的成员变量为常量(大写,单词之间用"_"分隔)
2、Java接口中的方法默认都是public,abstract类型的(都可省略),没有方法体,不能被实例化
3、Java接口中只能包含public,static,final类型的成员变量和public,abstract类型的成员方法
4、接口中没有构造方法,不能被实例化
5、一个接口不能实现(implements)另一个接口,但它可以继承多个其它的接口
6、Java接口必须通过类来实现它的抽象方法
7、当类实现了某个Java接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象类
8、不允许创建接口的实例(实例化),但允许定义接口类型的引用变量,该引用变量引用实现了这个接口的类的实例
9、一个类只能继承一个直接的父类,但可以实现多个接口,间接的实现了多继承.
三、接口的用法
1、精简程序结构,免除重复定义
比如,有两个及上的的类拥有相同的方法,但是实现功能不一样,就可以定义一个接口,将这个方法提炼出来,在需要使用该方法的类中去实现,就免除了多个类定义系统方法的麻烦。
举例:鸟类和昆虫类都具有飞行的功能,这个功能是相同的,但是其它功能是不同的,在程序实现的过程中,就可以定义一个接口,专门描述飞行。
下图是分别定义鸟类和昆虫类,其都有飞行的方法。
下图定义了接口,其类图如下:
实现代码如下:
[java] view plain copy
interface Flyanimal{
void fly();
}
class Insect {
int legnum=6;
}
class Bird {
int legnum=2;
void egg(){};
}
class Ant extendsInsect implements Flyanimal {
public void fly(){
System.out.println("Ant can fly");
}
}
classPigeon extends Bird implements Flyanimal {
public void fly(){
System.out.println("pigeon can fly");
}
public void egg(){
System.out.println("pigeon can lay eggs ");
}
}
public classInterfaceDemo{
public static void main(String args[]){
Ant a=new Ant();
a.fly();
System.out.println("Ant's legs are"+ a.legnum);
Pigeon p= new Pigeon();
p.fly();
p.egg();
}
}
程序运行结果:
Ant can fly
Ant'slegs are 6
pigeon can fly
pigeon can lay eggs
二、拓展程序功能,应对需求变化。
假设一个学校接待方面的程序,招待不同身份的人的食宿问题,其对应规则如下:
身份
食
宿
学生
食堂
宿舍
教师
教师食堂
学校公寓
学生家长
招待所
招待所
理论上,当然可以对每个不同身份的人各定义一个对应的类,并实现各自的方法,但是观察这写类,可以归纳出其有一个共同的模板,即“人”的“食、宿”问题。这时候,就可以发挥接口的功能了。实现代码如下:
[java] view plain copy
interfacePerson{
void eat();
void sleep();
}
class Studentimplements Person{
public void eat(){
System.out.println("学生去食堂吃饭!");
}
public void sleep(){
System.out.println("学生回寝室睡觉!");
}
}
class Teacherimplements Person{
public void eat(){
System.out.println("教师去教工餐厅吃饭!");
}
public void sleep(){
System.out.println("教师回学校公寓睡觉!");
}
}
class Parents implements Person{
publicvoid eat(){
System.out.println("家长去招待所饭馆吃饭!");
}
public void sleep(){
System.out.println("家长回招待所睡觉!");
}
}
public class PersonInterface{
public static void main(String[] args)
{
Person p=new Student();
p.eat();
p.sleep();
p=new Teacher();
p.eat();
p.sleep();
p=new Parents();
p.eat();
p.sleep();
}
}
程序执行结果:
学生去食堂吃饭!
学生回寝室睡觉!
教师去教工餐厅吃饭!
教师回学校公寓睡觉!
家长去招待所饭馆吃饭!
家长回招待所睡觉!
现在需要添加一些功能,即现在需要添加“外宾、上级领导”两类角色,并且以后工具需要还要添加相应的身份角色的人进来,此时,只需要根据需要添加“外宾”类、“领导”类,而主类仍然可以拿来就用,无需进行更多的修改。此时就可以显示出接口的作用了。
在上面的程序中添加如下两个类即可。
[java] view plain copy
class Foreign implements Person{
publicvoid eat(){
System.out.println("外宾去酒店吃饭!");
}
public void sleep(){
System.out.println("外宾回酒店睡觉!");
}
}
class Leader implements Person{
publicvoid eat(){
System.out.println("领导去宾馆吃饭!");
}
public void sleep(){
System.out.println("外宾回宾馆睡觉!");
}
}
而主函数中用法仍然一样。
下面给出完整的代码:
[java] view plain copy
interfacePerson{
void eat();
void sleep();
}
class Studentimplements Person{
public void eat(){
System.out.println("学生去食堂吃饭!");
}
public void sleep(){
System.out.println("学生回寝室睡觉!");
}
}
class Teacherimplements Person{
public void eat(){
System.out.println("教师去教工餐厅吃饭!");
}
public void sleep(){
System.out.println("教师回学校公寓睡觉!");
}
}
class Parents implements Person{
publicvoid eat(){
System.out.println("家长去招待所饭馆吃饭!");
}
public void sleep(){
System.out.println("家长回招待所睡觉!");
}
}
class Foreign implements Person{
publicvoid eat(){
System.out.println("外宾去酒店吃饭!");
}
public void sleep(){
System.out.println("外宾回酒店睡觉!");
}
}
class Leader implements Person{
publicvoid eat(){
System.out.println("领导去宾馆吃饭!");
}
public void sleep(){
System.out.println("领导回宾馆睡觉!");
}
}
public class PersonInterface{
public static void main(String[] args)
{
Person p=new Student();
p.eat();
p.sleep();
p=new Teacher();
p.eat();
p.sleep();
p=new Parents();
p.eat();
p.sleep();
p=new Foreign();
p.eat();
p.sleep();
p=new Leader();
p.eat();
p.sleep();
}
}
程序执行结果:
学生去食堂吃饭!
学生回寝室睡觉!
教师去教工餐厅吃饭!
教师回学校公寓睡觉!
家长去招待所饭馆吃饭!
家长回招待所睡觉!
外宾去酒店吃饭!
外宾回酒店睡觉!
领导去宾馆吃饭!
领导回宾馆睡觉!
举例二:
用来计算每一种交通工具运行1000公里所需的时间,已知每种交通工具的参数都是3个整数A、B、C的表达式。现有两种工具:
Car 和Plane,其中Car 的速度运算公式为:A*B/C
Plane 的速度运算公式为:A+B+C。
如果增加第3种交通工具的时候,比如火车(Train)不必修改以前的任何程序,只需要编写新的交通工具的程序。
[java] view plain copy
import java.lang.*;
interface Common {
double runTimer(doublea, double b, double c);
String getName(); //获取交通工具的名称
}
class Plane implementsCommon {
public doublerunTimer(double a, double b, double c) {
return (a+ b + c);
}
public String getName(){
return"Plane";
}
}
class Car implements Common {
public doublerunTimer(double a, double b, double c) {
return ( a*b/c );
}
public String getName(){
return"Car";
}
}
public class ComputeTime {
public static void main(Stringargs[]) {
double A=3;
double B=5;
double C=6;
double v,t;
Commond=new Car();
v=d.runTimer(A,B,C);
t=1000/v;
System.out.println(d.getName()+"的平均速度: "+v+" km/h");
System.out.println(d.getName()+"的运行时间:"+t+" 小时");
d=newPlane();
v=d.runTimer(10,30,40);
t=1000/v;
System.out.println(d.getName()+"的平均速度: "+v+" km/h");
System.out.println(d.getName()+"的运行时间:"+t+" 小时");
}
}
程序运行结果;
Car的平均速度: 2.5 km/h
Car的运行时间:400.0 小时
Plane的平均速度: 80.0 km/h
Plane的运行时间:12.5 小时
相关问题推荐
对于每一位才开始接触JAVA的新手来说,先不要管算法和数据结构,大多数简单的程序不需要用到算法和数据结构,所以当你真正需要时再去学习。编程一段时间以后,你就会知道在哪些地方用到他们。这时知道算法的名字并了解它们的功能,然后动手去实践。当我们在去...
2个都很好就业,更关键的是要学得到东西
获取Map集合中所有的key可以通过map集合的keySet()方法获取例如: Map map = new HashMap(); map.put(xx,xx); //存放数据 //.... 省略 Set set = map.keySet(); //可以通过迭代器进行测试 Iterator iter = set.iter...
不同年龄,不同掌握程度,学历,找工作城市,面试能力这是一个多方面影响的结果,如果是平均值的话,全国平均薪资14k左右
具体学多久,根据自己的学习力,自律性、解决问题能力来决定若系统性学习,跟着讲师的节奏走,大概半年左右,有专业的讲师把课程进行规划,尽心系统学习,有问题,讲师会帮忙解决,学习的效率很高,避免了自学中出现各种问题解决不了,而耽误很多时间,可能会...
(1)idea启动时会有两个快捷方式,安装完后默认生成在桌面的是32位的idea的快捷方式,如果我们使用这个快捷方式运行大项目,一般都会很卡。解决方法是找到idea的安装目录,然后进入bin文件夹,找到名称为idea64的应用程序,右键他生成桌面快捷方式。以后每次...
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。一、BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要...
ava是一种区分字母的大小写的语言,所以我们在定义变量名的时候应该注意区分大小写的使用和一些规范,接下来我们简单的来讲讲Java语言中包、类、变量等的命名规范。(一)Package(包)的命名Package的名字应该都是由一个小写单词组成,例如com、xuetang9、compan...
public class Point { private int x; private int y; public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } ...
经典版单例模式public class Singleton { private static Singleton uniqueInstance;//利用一个静态常量来记录singleton类的唯一实例。 private Singleton() { } public static Singleton getInstance()...
哈希表的长度一般是定长的,在存储数据之前我们应该知道我们存储的数据规模是多大,应该尽可能地避免频繁地让哈希表扩容。但是如果设计的太大,那么就会浪费空间,因为我们跟不用不到那么大的空间来存储我们当前的数据规模;如果设计的太小,那么就会很容易发...
1. DOM(Document Object Model) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才...
1)作用不同: throw用于程序员自行产生并抛出异常; throws用于声明在该方法内抛出了异常2) 使用的位置不同: throw位于方法体内部,可以作为单独语句使用; throws必须跟在方法参数列表的后面,不能单独使用。3)内容不同: throw抛出一个异常对象,且只能是...
基本执行过程如下:1)程序首先执行可能发生异常的try语句块。2)如果try语句没有出现异常则执行完后跳至finally语句块执行;3)如果try语句出现异常,则中断执行并根据发生的异常类型跳至相应的catch语句块执行处理。4)catch语句块可以有多个,分别捕获不同类型...
100-199 用于指定客户端应相应的某些动作。 200-299 用于表示请求成功。 300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。 400-499 用于指出客户端的错误。 400 语义有误,当前请求无法被服务器理解。 401 当前请求需要用户验证...
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。Java编译...