接口

接口的概述:

接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用

Java中的接口更多的体现在对行为的抽象

接口的特点:

  •  接口用关键字interface修饰
    •   public interface 接口名{}
  • 类实现接口用implements表示
    •   public class 类名 implentments 接口名{}
  • 接口不能实例化
    •   接口如何实例化呢?参照多态的方式,通过实现类对象进行实例化,这叫接口多态
    •        多态的形式:具体类多态,抽象类多态,接口多态
    •        多态的前提:有继承或者实现关系,有方法重写;有父(类/接口)引用指向(子/实现)类对象
  • 接口的实现类
    •   要么重写接口中的所有抽象方法
    •        要么是抽象类

接口的成员特点:

  • 成员变量
    •   只能是常量
    •        默认修饰符:public static final
  • 构造方法
    •  接口中没有构造方法,因为接口主要是对行为进行抽象,是没有具体存在
    •        一个类如果没有父类,默认继承自Object类
  • 成员方法
    •   只能是抽象方法
    •        默认修饰符:public abstract 

课堂案例:猫和狗

需求:对猫和狗进行训练,他们就可以跳高了,这里加入了跳高功能,请采用抽象类和接口来实现猫狗案例

并在测试类中进行测试

思路:

  • 定义接口(Jumping)
    •   成员方法:跳高()
  • 定义抽象动物类(Animal)
    •   成员变量:姓名、年龄;构造方法:无参、带参;成员方法:get/set方法,吃饭
  • 定义具体猫类(Cat),继承动物类,实现跳高接口
    •   构造方法:无参、带参;成员方法:重写吃饭(){...},重写跳高方法(){......}
  • 定义狗类(Dog),继承动物类,实现跳高接口
    •   构造方法:无参、带参;成员方法:重写吃饭(){...},重写跳高方法(){......}
  • 定义测试类(AnimalDemo),写代码测试

代码如下

接口
  1 public class AnimalDemo {
  2     public static void main(String[] args) {
  3         //创建对象,调用方法
  4         Jumpping jumpping = new Cat();
  5         jumpping.jump();
  6         System.out.println("--------");
  7         
  8         Animal animal  = new Cat();
  9         animal.setName("波斯");
 10         animal.setAge(5);
 11         System.out.println(animal.getName()+","+animal.getAge());
 12         animal.eat();
 13         System.out.println("--------");
 14         
 15         //常用的方式还是直接创建子类对象,既包含eat方法,又包含jump方法
 16         Cat aCat =  new Cat();
 17         aCat.setName("加菲");
 18         aCat.setAge(5);
 19         System.out.println(aCat.getName()+","+aCat.getAge());
 20         aCat.eat();
 21         aCat.jump();
 22     }
 23 }
 24 
 25 //接口
 26 public interface Jumpping {
 27     public abstract void jump();
 28 }
 29 
 30 
 31 
 32 //抽象类
 33 public abstract class Animal {
 34     private String name;
 35     private int age;
 36     public Animal() {
 37         // TODO Auto-generated constructor stub
 38     }
 39     
 40     public Animal(String name, int age) {
 41         super();
 42         this.name = name;
 43         this.age = age;
 44     }
 45 
 46     public String getName() {
 47         return name;
 48     }
 49     public void setName(String name) {
 50         this.name = name;
 51     }
 52     public int getAge() {
 53         return age;
 54     }
 55     public void setAge(int age) {
 56         this.age = age;
 57     }
 58     public abstract void eat();
 59 }
 60 
 61 //Cat类
 62 public class Cat extends Animal implements Jumpping {
 63     public Cat() {
 64         // TODO Auto-generated constructor stub
 65     }
 66     
 67     
 68     public Cat(String name, int age) {
 69         super(name, age);
 70         // TODO Auto-generated constructor stub
 71     }
 72 
 73 
 74     @Override
 75     public void jump() {
 76         // TODO Auto-generated method stub
 77         System.out.println("猫可以跳高了");
 78     }
 79 
 80     @Override
 81     public void eat() {
 82         // TODO Auto-generated method stub
 83         System.out.println("猫吃鱼");
 84     }
 85 
 86 }
 87 
 88 //Dog类
 89 public class Dog extends Animal implements Jumpping {
 90     public Dog() {
 91         // TODO Auto-generated constructor stub
 92     }
 93 
 94     
 95     public Dog(String name, int age) {
 96         super(name, age);
 97         // TODO Auto-generated constructor stub
 98     }
 99 
100 
101     @Override
102     public void eat() {
103         // TODO Auto-generated method stub
104         System.out.println("狗啃骨头");
105     }
106 
107     @Override
108     public void jump() {
109         // TODO Auto-generated method stub
110         System.out.println("狗可以跳高了");
111     }
112 
113 }
catAndDog

 类和接口的关系

  • 类和类的关系
    •   继承,只参单继承,但是可以多层继承
  • 类和接口的关系
    •   实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
  • 接口和接口的关系
    •   继承关系,可以单继承,也可以多继承

抽象类和接口的区别

  •  成员区别
    •   抽象类               变量,常量;有构造方法;有抽象方法,也有非抽象方法
    •         接口             常量;抽象方法
  •     关系区别
    •   类与类               继承,单继承
    •        类与接口            实现,可以单实现,也可以多实现
    •        接口与接口         继承,单继承,多继承
  •      设计理念的区别
    •   抽象类               对类抽象,包括属性 行为
    •         接口                对行为抽象,主要是行为

课堂案例:运动员和教练

需求:我们现在有乒乓球运动员和篮球运动员,乒乓球教练和篮球教练。为了出国交流,乒乓球相关的人员都需要学习英语。请用所有知识分析,这个案例中有哪些具体类,哪些抽象类,哪些接口,并用代码实现

思路:

  1. 定义说英语接口    成员方法:说英语();
  2. 定义抽象人类       成员变量:姓名,年龄;构造方法:无参,带参;成员方法:get/set方法,吃饭();
  3. 定义抽象教练类,继承人类     构造方法:无参,带参;成员方法:教();
  4. 定义抽象运动员类,继承人类    构造方法:无参,带参;成员方法:学习();
  5. 定义具体篮球教练类,继承教练类      构造方法: 构造方法:无参,带参;成员方法:重写吃饭(){......},重写教(){......}
  6. 定义具体乒乓球教练类,继承教练类,实现说英语接口
    1.   构造方法:无参,带参;成员方法:重写吃饭(){......},重写教(){......},重写说英语(){......}
  7. 定义具体篮球运动员类,继承运动员类      构造方法:无参,带参;成员方法:重写吃饭(){......},重写学习(){......}
  8. 定义具体乒乓球运动员类,继承运动员类 实现说英语接口     构造方法:无参,带参;成员方法:重写吃饭(){......},重写学习(){......},重写说英语
  9. 定义测试类,写测试代码

代码如下

接口
  1 //测试类
  2 public class PersonDemo {
  3     public static void main(String[] args) {
  4         //创建对象
  5         PingPangPlayer ppp = new PingPangPlayer();
  6         ppp.setName("邓亚萍");
  7         ppp.setAge(60);
  8         System.out.println(ppp.getName()+","+ppp.getAge());
  9         ppp.eat();
 10         ppp.study();
 11         ppp.speak();
 12         System.out.println("--------");
 13         
 14         BasketBallPlayer bbp = new BasketBallPlayer();
 15         bbp.setName("姚明");
 16         bbp.setAge(35);
 17         System.out.println(bbp.getName()+","+bbp.getAge());
 18         bbp.eat();
 19         bbp.study();
 20     }
 21 }
 22 
 23 //抽象人类
 24 public abstract class Person {
 25     private String name;
 26     private int age;
 27     
 28     public Person() {
 29         // TODO Auto-generated constructor stub
 30     }
 31 
 32     public Person(String name, int age) {
 33         super();
 34         this.name = name;
 35         this.age = age;
 36     }
 37 
 38     public String getName() {
 39         return name;
 40     }
 41 
 42     public void setName(String name) {
 43         this.name = name;
 44     }
 45 
 46     public int getAge() {
 47         return age;
 48     }
 49 
 50     public void setAge(int age) {
 51         this.age = age;
 52     }
 53     public abstract void eat();
 54     
 55 }
 56 
 57 //抽象教练类
 58 public abstract class Coach extends Person {
 59 
 60     public Coach() {
 61         // TODO Auto-generated constructor stub
 62     }
 63 
 64     public Coach(String name, int age) {
 65         super(name, age);
 66         // TODO Auto-generated constructor stub
 67     }
 68     
 69     public abstract void teach();
 70 }
 71 
 72 //抽象运动员类
 73 public abstract class Player extends Person {
 74 
 75     public Player() {
 76         // TODO Auto-generated constructor stub
 77     }
 78 
 79     public Player(String name, int age) {
 80         super(name, age);
 81         // TODO Auto-generated constructor stub
 82     }
 83     
 84     public abstract void study();
 85 }
 86 
 87 
 88 public class BasketballCoach extends Coach {
 89     public BasketballCoach() {
 90         // TODO Auto-generated constructor stub
 91     }
 92 
 93     
 94     public BasketballCoach(String name, int age) {
 95         super(name, age);
 96         // TODO Auto-generated constructor stub
 97     }
 98 
 99 
100     @Override
101     public void teach() {
102         // TODO Auto-generated method stub
103         System.out.println("篮球教练教如何运球和投篮");
104     }
105 
106     @Override
107     public void eat() {
108         // TODO Auto-generated method stub
109         System.out.println("篮球教练吃羊肉,喝羊奶");
110     }
111 
112 }
113 
114 //乒乓球教练类
115 public class PingPangCoach extends Coach implements SpeakEnglish {
116 
117     public PingPangCoach() {
118         // TODO Auto-generated constructor stub
119     }
120     
121     public PingPangCoach(String name, int age) {
122         super(name, age);
123         // TODO Auto-generated constructor stub
124     }
125 
126     @Override
127     public void teach() {
128         // TODO Auto-generated method stub
129         System.out.println("乒乓球教练教如何发球和接球");
130     }
131 
132     @Override
133     public void eat() {
134         // TODO Auto-generated method stub
135         System.out.println("乒乓球教练吃小白菜,喝大米粥");
136     }
137     
138     @Override
139     public void speak() {
140         // TODO Auto-generated method stub
141         System.out.println("乒乓球教练说英语");
142     }
143 
144 }
145 
146 //篮球运动员类
147 public class BasketBallPlayer extends Player {
148     public BasketBallPlayer() {
149         // TODO Auto-generated constructor stub
150     }
151     
152 
153     public BasketBallPlayer(String name, int age) {
154         super(name, age);
155         // TODO Auto-generated constructor stub
156     }
157 
158 
159     @Override
160     public void study() {
161         // TODO Auto-generated method stub
162         System.out.println("篮球运动员学习运球和投篮");
163     }
164 
165     @Override
166     public void eat() {
167         // TODO Auto-generated method stub
168         System.out.println("篮球运动员吃牛肉,喝牛奶");
169     }
170 
171 }
172 
173 
174 //乒乓球运动员类
175 public class PingPangPlayer extends Player implements SpeakEnglish {
176 
177     public PingPangPlayer() {
178         // TODO Auto-generated constructor stub
179     }
180     
181     public PingPangPlayer(String name, int age) {
182         super(name, age);
183         // TODO Auto-generated constructor stub
184     }
185 
186     @Override
187     public void speak() {
188         // TODO Auto-generated method stub
189         System.out.println("乒乓球运动员会说英语");
190     }
191 
192     @Override
193     public void study() {
194         // TODO Auto-generated method stub
195         System.out.println("乒乓球运动员学习如何发球和接球");
196     }
197 
198     @Override
199     public void eat() {
200         // TODO Auto-generated method stub
201         System.out.println("乒乓球运动员吃大白菜,喝小米粥");
202     }
203 
204 }
运动员和教练

 

上一篇:使用nodemailer,以QQ邮箱发送邮件踩到的坑


下一篇:jvm有哪些垃圾收集器,和实际应用场景