第三章 接口(超级有助于理解)
第二章我们看完了类和对象的概念,知道类其实是对于对象的一种抽象。回想我们过去的生活,我们会发现很多不同类的事物,会有着相同的行为,比如猫、狗和人类都会吃东西。那么是不是说我们可以定义一个吃东西的动作,再针对具体不同的动物,在这个动作里面加入特定的其他属性呢?这样是不是就把这个动作抽象出来了?感觉很规范,利于后期的修改呢?在Java里面,这种抽象的方法,由接口来实现。为了更好的理解,我们先写一个例子,在例子后面给出基础的语法。
文章目录
一个例子
我们会在人生的某个阶段作为学生,但是学生并不是我们作为人的本质,只是一套行为和属性的集合而已。现在假设Student具有三个特点,这三个特点是TakeExam()、TakeClass()和ArrangeSpareTime()。我们有很多种不同的学生的特点,假设现在我们有一类学生叫做Wangxiaobo,他们是一类自由的学生,有WangStudent的特点,那么对于具体的这一类学生,我们怎么用接口的思想实现呢?
首先,我们先写一个学生的接口
package com.cjx1005;
public interface Student {
String feature = "大有可为";
public void TakeExam();
public void TakeClass();
public void ArrangeSpareTime();
}
//是不是很抽象嘻嘻
接着,我们写下WangStudent这类学生有什么特点
package com.cjx1005;
public class WangStudent implements Student{
@Override
public void TakeExam() {
// TODO Auto-generated method stub
System.out.println("我很喜欢考试,但是我不在意分数。因为考试有助于我们检测自己学习的情况,帮助我们更好的学习。");
}
@Override
public void TakeClass() {
// TODO Auto-generated method stub
System.out.println("我喜欢数学、计算机、经济学和文学类的课程");
}
@Override
public void ArrangeSpareTime() {
// TODO Auto-generated method stub
System.out.println("空闲时间我喜欢学习和完成自己的兴趣爱好");
}
}
最后,我们写这一类学生的类
package com.cjx1005;
public class Wangxiaobo {
public int age;
public int rank;
public int gender; //0代表女生,1代表男生
Student studentIdentity;
public void Excercise(String habit) {
System.out.println("我最喜欢的锻炼是"+habit);
}
public void Writing(String author) {
System.out.println("我喜欢写作,我最喜欢的作家是"+author);
}
public void StudentIdet(Student student){
this.studentIdentity = student;
}
public void TakeExam() {
studentIdentity.TakeExam();
}
public void TakeClass() {
studentIdentity.TakeClass();
}
public void ArrangeSpareTime() {
studentIdentity.ArrangeSpareTime();
}
public static void main(String[] args){
Wangxiaobo lilei = new Wangxiaobo();
WangStudent freedom = new WangStudent();
lilei.StudentIdet(freedom);
lilei.Excercise("篮球");
lilei.Writing("村上春树");
lilei.TakeExam();
lilei.TakeClass();
lilei.ArrangeSpareTime();
}
}
我们看看最后的输出结果
我最喜欢的锻炼是篮球
我喜欢写作,我最喜欢的作家是村上春树
我很喜欢考试,但是我不在意分数。因为考试有助于我们检测自己学习的情况,帮助我们更好的学习。
我喜欢数学、计算机、经济学和文学类的课程
空闲时间我喜欢学习和完成自己的兴趣爱好
几个很关键的步骤说明
在具体的类里面,需要传入具体的方式
就是这几行代码实现的
public void StudentIdet(Student student){
this.studentIdentity = student;
}
public void TakeExam() {
studentIdentity.TakeExam();
}
public void TakeClass() {
studentIdentity.TakeClass();
}
public void ArrangeSpareTime() {
studentIdentity.ArrangeSpareTime();
}
这样,Wangxiaobo这个类的TakeExam()、TakeExam()和ArrangeSpareTime()的三个方法就是用的this.studentIdentity的了,而this.studentIdentity是根据外面的student传入的,而student的具体方法的书写其实是由WangStudent()来具体完成的。(如下)
WangStudent freedom = new WangStudent();
lilei.StudentIdet(freedom);
一张图来直观的了解一下这个过程
基础语法
接口的基础语法
public interface 接口名{
// 属性 默认由 final,static 修饰 - 静态常量
// 方法 没有方法体-抽象方法 默认 abstract 修饰
// 属性 必须初始化,默认由 final,static 修饰
String name="namea";
static final int num = 3;
// 方法 - 没有方法体-抽象方法 默认 abstract 修饰
public abstract void test();
}
对于具体的接口,用一种改写的思维进行具体的书写
关键词是implements,里面的重写检查注解就用@Override
心得总结
- 接口的本质是:你可以调用接口,但是输入的参数是一个具体的类,但是这个类implements的是这个接口
- 因此,只要有接口的话,必定存在自己写的一个类,并且在接口处,使用这个类,否则这个接口没有什么意义。