多态
:
1 概念:一种行为的多种实现方式,就是多态;
(一个对象的多种形态)
2 代码形式:父类类型变量保存了子类类型对象;就是多态的形态;
3 特点::不能使用子类特有的内容;
4 好处:可以让我们面向父类,操作所有的子类共性的内容;
提升了程序的扩展性;
抽象:
1 抽象方法:没有方法体的方法就是抽象方法;
2 抽象类:包含抽象方法的类一定是抽象类;
3 代码格式:抽象类格式:
public abstract class 类名{}
抽象方法格式:
public abstract 返回值类型 方法名(参数列表);
4 特点:
1 抽象类不能直接创建对象;(语法规定)
2 抽象类中,可以有构造方法;(构造方法的作用,仅仅是给子类调用,或给本类的成员变量赋值)
3 如果一个子类,继承抽象类的时候,不能重写所有的抽象方法,那么这个子类也必须是抽象类;
(此时,子类必须还要继续有子类,才可以创建对象)
4 抽象类中可以不写抽象方法;(即使没有写抽象方法,也是无法直接创建抽象类的对象的!);
接口:
1 概念 就是一套规范;
2 格式 interface 接口名{
成员;
}
3 成员
1 JDK7及以前的版本时,接口中仅有两部分成员:分别是:抽象方法,常量;
常量的格式: public static final 数据类型 常量名 = 数据值;
2 JDK8,9之后的版本成员以后再说;
4 特点
接口无法直接创建对象;
2:接口中没有构造方法;
3:接口与接口之间允许多继承;
4:接口与类之间,只能是类实现接口;
5 :类与接口的关系:
只能是类实现接口,使用implements关键字表示;
6:抽象类与接口的对比
相同点:
1:都不能直接创建对象;
2:都可以包含抽象方法;
3:都是父亲的角色;(都是位于继承体系的顶端)
不同点:
1抽象类属于类的范畴,只能是单继承;而接口可以多实现;
2:抽象类包含构造方法,而接口的成员都是固定的形式(修饰符省略了,java会自动添加上去);
结论:
如果使用抽象类和接口都可以满足需求,优先考虑使用接口;
案例
分析以下需求,并用代码实现
(1)动物类:
a.属性:年龄
b.行为:喝水,吃东西(吃什么不确定)
(2)游泳接口:
a.行为:游泳方法
(3)狗类:
a.行为:吃饭(啃骨头)和 游泳(狗刨)
(4)羊类:
a.行为:吃饭(羊啃草)
(5)青蛙类:
a.行为:吃饭(吃虫子)和 游泳(蛙泳)
(6)饲养员类:
a.行为:饲养动物:包括吃饭和喝水
(7)测试类:
a.创建饲养员对象,饲养员调用三次饲养方法:饲养狗,饲养羊,饲养青蛙
(8)要求:
a.子类重写父类中的吃东西方法
b.要求给狗和青蛙添加游泳的方法(实现游泳接口)
c.饲养员类中定义一个方法,传入动物类对象(父类),使用instanceof转换成子类,
调用吃饭方法,如果有游泳方法也需进行测试
(9)打印如下格式的结果:
a.狗喝水
b.狗啃骨头
c.狗会狗刨游泳
d.青蛙喝水
e.青蛙吃小虫
f.青蛙会蛙泳
g.羊喝水
h.羊啃草
一共要建八个界面,有点多哈哈哈哈
游泳接口
public interface youyong {
void yyong();
}
动物类(父类)
public abstract class Animal {
public int age;
public abstract void drink();
public abstract void eat();
}
狗类(子类)
public class dog extends Animal implements youyong {
@Override
public void eat() {
System.out.println("狗啃骨头");
}
@Override
public void yyong() {
System.out.println("狗会狗刨");
}
public void drink(){
System.out.println("狗会喝水");
}
}
羊类(子类)
public class goat extends Animal {
@Override
public void eat() {
System.out.println("羊吃草");
}
@Override
public void drink() {
System.out.println("羊喝水");
}
}
青蛙类(子类)
public class qingwa extends Animal implements youyong {
@Override
public void eat() {
System.out.println("吃虫子");
}
@Override
public void yyong() {
System.out.println("蛙泳");
}
@Override
public void drink() {
System.out.println("青蛙会喝水");
}
}
工人类(子类)
public class worker {
public void siyang(Animal aml){
aml.eat();
aml.drink();
if (aml instanceof dog){
((dog) aml).yyong();
}
if (aml instanceof qingwa){
((qingwa) aml).yyong();
}
}
}
测试类
public class demo {
public static void main(String[] args) {
worker wk = new worker();
wk.siyang(new dog());
wk.siyang(new goat());
wk.siyang(new qingwa());
}
}
打印结果