我们使用interface关键字定义接口,一般使用接口声明方法或常量,接口中的方法只能是声明,不能是具体的实现,这一点和抽象类是不一样的。接口是更高级别的抽象。接口的定义格式是
public interface 接口名称{
//可以定义常量
//方法只有方法声明,而且是公共的。
public void 方法名称();
...
}
//类要实现接口,只需要使用implements关键字,实现类必须要实现接口中的所有的方法
public class 实现类名 implements 接口{
//实现接口的方法
}
我再写一个详细的示例代码.
package Z.JavaGJBC.jiekou;
/**
*定义一个接口 interface
*接口可以被继承,只能被接口继承,也可以被实现
*/
public interface Animal {
public int a=11;//接口中定义属性变量必须初始化
//一般情况都定义常量的比较多
public static final int GG=19;//常量
//总之接口中定义的属性都默认为常量.
//接口中只能写抽象方法,这种普通方法是不行的
public void test() {//写这种方法是报错的
}
//但是从jdk1.8以后,接中就可以定义普通方法
//前提必须给方法前面添加default修饰符
//jdk1.8新特性
default void tese123() {//接口里的普通方法
}
/**
* 抽象方法
*/
public void cry(Animal a);
}
ok!如果没明白怎么回事,就看看下面几道例题
→_→ 都是我手动敲的呢 →_→ .
package Z.JavaGJBC.jiekou;
public interface Student {//写个接口
public void xs(Stu stu);//定义一个抽象方法
//这里的参数是Stu类
}
package Z.JavaGJBC.jiekou;
public class Stu{
private String name;
private String age;
private int sex;
public Stu() {//构造方法,注意之前没有讲到,一个类里如果写了带参数的构造方法,也就必须得这个.
// TODO Auto-generated constructor stub
}
//带参的构造方法
public Stu(String name, String age, int sex) {//获取值
super();
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public String toString() {//返回值
return "Stu [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
package Z.JavaGJBC.jiekou;
// 接口测试类
public class StudentTest implements Student{//implements继承接口类
@Override
public void xs(Stu stu) {//重写接口的抽象方法
System.out.println(stu);//输入参数,这里的参数是Stu类
}
public void print(Stu stu) {
xs(stu);//方法嵌套
}
public static void main(String[] args) {
StudentTest a=new StudentTest();//创建对象
a.xs(new Stu("张三","男",18));//调用方法
a.xs(new Stu("李四","男",18));//调用方法
a.xs(new Stu("小花","女",18));//调用方法
a.print(new Stu("小花","女",18));//调用方法
}
}
Stu [name=张三, age=男, sex=18]
Stu [name=李四, age=男, sex=18]
Stu [name=小花, age=女, sex=18]
Stu [name=小花, age=女, sex=18]
//这是打印结果,因为有这些[]
//所以我只能把输出结果写到这个代码块里
再做几道题,接口保准就拿捏了.
比如说学校老师想用打印机打印信息,想打印彩色的就打印彩色的,想打黑白的就打黑白的,用接口该怎么做?
package Z.JavaGJBC.jiekou;
public interface Teacher {//interface 接口类
//定义两个抽象方法
public void caise(Colour s);//彩色打印机
public void bla(Black s);//黑白打印机
}
package Z.JavaGJBC.jiekou;
public class Colour{//彩色打印机
String name;//姓名
String age;//性别
int sex;//年龄
public Colour(String name, String age, int sex) {//赋值
super();
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public String toString() {//返回值
return "彩色打印机:" +"\n姓名:"+ name+"\n性别:"+age+"\n年龄:"+sex;
}
}
package Z.JavaGJBC.jiekou;
public class Black {//黑白打印机
String name;//姓名
String age;//性别
int sex;//年龄
public Black(String name, String age, int sex) {//赋值
super();
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public String toString() {//返回值
return "黑白打印机:" +"\n姓名:"+ name+"\n性别:"+age+"\n年龄:"+sex;
}
}
package Z.JavaGJBC.jiekou;
public class TeacherTest implements Teacher{//打印机测试
//implements Teacher继承接口类
@Override//接口抽象方法重写
public void caise(Colour s) {
System.out.println(s);
}
@Override//接口抽象方法重写
public void bla(Black s) {
System.out.println(s);
}
public static void main(String[] args) {
TeacherTest a=new TeacherTest();//创建对象
a.caise(new Colour("小王", "男", 18));//调用彩色打印机
a.bla(new Black("小红", "女", 18));//调用黑白打印机
//想调用哪个就调用哪个.
}
}
黑白打印机:
姓名:小红
性别:女
年龄:18
打印机接口做好了。
当然这可不是真的打印哈,只是举个例子,做个题而已
再来最一道题.
设计一个网站用户类,有上线方法、有下线方法,要求是能够显示当前在线人数。
先建一个接口.
package Z.JavaGJBC.jiekou;
public interface Online {
//定义两个抽象方法:
public int onlin(int c);//上线
public int desrory(int c);//下线
}
然后编写一个测试类
package Z.JavaGJBC.jiekou;
// 上下线
public class NetTest implements Online{//implements继承接口类
public int count=0;//定义个属性.就是在线人数
@Override//重写接口类的抽象方法
public int onlin(int c) {//上线
return count++;
}
@Override//重写接口类的抽象方法
public int desrory(int c) {//下线
if(count>0) {
return count--;
}
return count--;
}
public static void main(String[] args) throws InterruptedException{
NetTest t=new NetTest();//创建对象
for (int i = 0; i <10; i++) {//循环遍历
t.onlin(i);//调用方法
Thread.sleep(1000);//当前线程睡眠1秒
System.out.println((i+1)+"用户已上线........");
}
System.out.println("当前在线人数为:"+t.count);
for (int i = 0; i <5; i++) {//循环遍历
t.desrory(i);//调用方法
Thread.sleep(1000);//当前线程沉睡一秒
System.out.println((i+1)+"用户已下线........");
}
System.out.println("当前在线人数为:"+t.count);
}
}
接口与类的区别:
1.接口不能用于实例化对象。
2.接口没有构造方法。
3.接口中所有的方法必须是抽象方法,Java 8 之后 接口中可以使用 default 关键字修饰的非抽象方法。
4.接口不能包含成员变量,除了 static 和 final 变量。
5.接口不是被类继承了,而是要被类实现。
6.接口支持多继承。
接口特性:
1.接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
2.接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
3.接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
抽象类和接口的区别:
- 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
- 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
面向对象这一块就结束了,下来最后环节,java的高级编程. ( ๑´•ω•)
本文共 1586 个字数,平均阅读时长 ≈ 4分钟
评论 (0)