抽象类和接口类的关系
成员区别
.抽象类 变量,常量,有构造方法,有抽象方法,也有非抽象方法
.接口 常量(带final的变量),抽象方法(public static final)
关系与区别
.类与类 继承,单继承
.类与接口 实现,也可以多实现
.接口与接口 继承,单继承,多继承
设计理念与区别
.抽象类 对类抽象,包括属性,行为
.接口 对行为抽象,主要是行为
.总结出一句话,抽象完成必要性行为(共性),接口类完成选择性行为(具体),因为门可以没有报警器,但是不能没有开[图片]关,否则它就算不是个完整的门
下方这个图片是关于设计理念与区别最后一句话的,我也是懵了好久,才悟出来的
以下就是教练和运动员的案例分析,其实在写代码之前,可以先悟一悟,为什么接口类是说英语,而不是吃饭,不是教,和学,而又为什么,吃饭,教,和学,都是抽象类呢???
需求
.我们现在雨哦乒乓球运动员和篮球运动员,乒乓球教练和篮球教练,为了出国交流,跟乒乓球相关人员都需要学习英语,请用所学知识分析,
这个案例中有那些具体的类,那些抽象的类,那些接口,并用代码实现
思路: 代码先写抽象,后写具体
1.定义说英语接口
.成员方法:说英语();
2.定义抽象人类
.成员变量:姓名,年龄;构造方法:无参,带参;成员方法:get/set方法 吃饭();
3.定义抽象教练类 继承人类
.构造方法:无参,带参;成员方法:教();
4.定义抽象运动员类 继承人类
.构造方法:无参,带参;成员方法:学习();
5.定义具体篮球教练类 继承抽象教练类
.构造方法:无参,带参;成员方法:重写教(){...};重写吃饭(){...}
6.定义具乒乓球教练类 继承抽象教练类,实现说英语接口
.构造方法:无参,带参;成员方法:重写教(){...};重写吃饭(){...};重写说英语(){...}
7.定义具体篮球运动员类 继承抽象运动员类
.构造方法:无参,带参;成员方法:重写教(){...};重写吃饭(){...}
8.定义具体乒乓球运动员类 继承抽象运动员类,实现说英语接口
.构造方法:无参,带参;成员方法:重写教(){...};重写吃饭(){...};重写说英语(){...}
demo01测试类(下图为测试结果)
package 接口案例_运动员和教练;
public class demo01 {
/*
需求
.我们现在雨哦乒乓球运动员和篮球运动员,乒乓球教练和篮球教练,为了出国交流,跟乒乓球相关人员都需要学习英语,请用所学知识分析,
这个案例中有那些具体的类,那些抽象的类,那些接口,并用代码实现
思路: 代码先写抽象,后写具体
1.定义说英语接口
.成员方法:说英语();
2.定义抽象人类
.成员变量:姓名,年龄;构造方法:无参,带参;成员方法:get/set方法 吃饭();
3.定义抽象教练类 继承人类
.构造方法:无参,带参;成员方法:教();
4.定义抽象运动员类 继承人类
.构造方法:无参,带参;成员方法:学习();
5.定义具体篮球教练类 继承抽象教练类
.构造方法:无参,带参;成员方法:重写教(){...};重写吃饭(){...}
6.定义具乒乓球教练类 继承抽象教练类,实现说英语接口
.构造方法:无参,带参;成员方法:重写教(){...};重写吃饭(){...};重写说英语(){...}
7.定义具体篮球运动员类 继承抽象运动员类
.构造方法:无参,带参;成员方法:重写教(){...};重写吃饭(){...}
8.定义具体乒乓球运动员类 继承抽象运动员类,实现说英语接口
.构造方法:无参,带参;成员方法:重写教(){...};重写吃饭(){...};重写说英语(){...}
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
//------------篮球教练----------------------------------------------------------
coach c= new basketballCoach();
c.setAge(53);
c.setName("坤坤");
System.out.print(c.getAge()+"的篮球场老饕"+c.getName()+",");c.teach();
System.out.print("并且 他");c.eat();
//------------乒乓球教练----------------------------------------------------------
inter i= new pinCoach();
c= new pinCoach();
c.setAge(53);
c.setName("小梁");
System.out.print(c.getAge()+"的乒乓球场老饕"+c.getName()+",");c.teach();
System.out.print("并且 他");c.eat();System.out.print("和");i.speakEnglish();
//-----------篮球运动员-----------------------------------------------------------------------
player p = new basketballPlayer();
p.setAge(23);
p.setName("小啊坤");
System.out.print(p.getAge()+"的篮球场小小饕"+p.getName()+",");p.study();
System.out.print("并且 他");p.eat();
//-----------乒乓球运动员-----------------------------------------------------------------------
i= new pinPlayer();
p = new pinPlayer();
p.setAge(18);
p.setName("小小梁");
System.out.print(p.getAge()+"的乒乓球场小小饕"+p.getName()+",");p.study();
System.out.print("并且 他");p.eat();System.out.print("和");i.speakEnglish();
}
}
inter接口类
package 接口案例_运动员和教练;
public interface inter {
void speakEnglish();
}
human人类
package 接口案例_运动员和教练;
public abstract class human {
//--------成员变量---------------------
private String name;
private int age;
//--------成员方法---------------------
public abstract void eat();
//--------构造方法---------------------
/**
* @param name
* @param age
*/
public human(String name, int age) {
this.name = name;
this.age = age;
}
/**
*
*/
public human() {
}
//--------get/set方法---------------------
/**
* @return name
*/
public String getName() {
return name;
}
/**
* @param name 要设置的 name
*/
public void setName(String name) {
this.name = name;
}
/**
* @return age
*/
public int getAge() {
return age;
}
/**
* @param age 要设置的 age
*/
public void setAge(int age) {
this.age = age;
}
}
coach抽象教练类
package 接口案例_运动员和教练;
public abstract class coach extends human {
//--------成员方法---------------------
public abstract void teach();
//--------构造方法---------------------
/**
*
*/
public coach() {
super();
// TODO 自动生成的构造函数存根
}
/**
* @param name
* @param age
*/
public coach(String name, int age) {
super(name, age);
// TODO 自动生成的构造函数存根
}
}
player抽象运动员类
package 接口案例_运动员和教练;
public abstract class player extends human {
//--------成员方法---------------------
public abstract void study();
//--------构造方法---------------------
/**
*
*/
public player() {
super();
// TODO 自动生成的构造函数存根
}
/**
* @param name
* @param age
*/
public player(String name, int age) {
super(name, age);
// TODO 自动生成的构造函数存根
}
}
具体篮球教练类
package 接口案例_运动员和教练;
public class basketballCoach extends coach {
@Override
public void teach() {
// TODO 自动生成的方法存根
System.out.println("教你如何运球和扣篮");
}
@Override
public void eat() {
// TODO 自动生成的方法存根
System.out.println("爱吃鸡");
}
//--------构造方法---------------------
/**
*
*/
public basketballCoach() {
super();
// TODO 自动生成的构造函数存根
}
/**
* @param name
* @param age
*/
public basketballCoach(String name, int age) {
super(name, age);
// TODO 自动生成的构造函数存根
}
}
具体乒乓球教练类
package 接口案例_运动员和教练;
public class pinCoach extends coach implements inter {
@Override
public void speakEnglish() {
// TODO 自动生成的方法存根
System.out.println("乒乓球教练 张继科 学习讲英语");
}
@Override
public void teach() {
// TODO 自动生成的方法存根
System.out.println("乒乓球教练 张继科 教你如何边睡,边打球");
}
@Override
public void eat() {
// TODO 自动生成的方法存根
System.out.println("乒乓球教练 张继科 超级喜欢吃牛肉");
}
//--------构造方法---------------------
/**
*
*/
public pinCoach() {
super();
// TODO 自动生成的构造函数存根
}
/**
* @param name
* @param age
*/
public pinCoach(String name, int age) {
super(name, age);
// TODO 自动生成的构造函数存根
}
}
具体篮球运动员类
package 接口案例_运动员和教练;
public class basketballPlayer extends player {
@Override
public void study() {
// TODO 自动生成的方法存根
System.out.println("喜欢学习穿背带裤运球");
}
@Override
public void eat() {
// TODO 自动生成的方法存根
System.out.println("也爱吃鸡");
}
//--------构造方法---------------------
/**
*
*/
public basketballPlayer() {
super();
// TODO 自动生成的构造函数存根
}
/**
* @param name
* @param age
*/
public basketballPlayer(String name, int age) {
super(name, age);
// TODO 自动生成的构造函数存根
}
}
具体乒乓球运动员类
package 接口案例_运动员和教练;
public class pinPlayer extends player implements inter {
@Override
public void speakEnglish() {
// TODO 自动生成的方法存根
System.out.println("学习讲英语");
}
@Override
public void study() {
// TODO 自动生成的方法存根
System.out.println("乒乓球学徒 索罗门 学习如何打好乒乓球");
}
@Override
public void eat() {
// TODO 自动生成的方法存根
System.out.println("也吃牛肉");
}
//--------构造方法---------------------
/**
*
*/
public pinPlayer() {
super();
// TODO 自动生成的构造函数存根
}
/**
* @param name
* @param age
*/
public pinPlayer(String name, int age) {
super(name, age);
// TODO 自动生成的构造函数存根
}
}