多态

多态的概述

什么是多态
同一个对象,在不同时刻表现出来的不同形态
多态的前提
要有继承或实现关系
要有方法的重写
要有父类引用指向子类对象

多态中的成员访问特点

成员访问特点
成员变量
编译看父类,运行看父类
成员方法
编译看父类,运行看子类
示例代码
动物类

  1. package com.itheima_02;
  2. public class Animal {
  3. public int age = 40;
  4. public void eat() {
  5. System.out.println("动物吃东西");
  6. }
  7. }

猫类

  1. package com.itheima_02;
  2. public class Cat extends Animal {
  3. public int age = 20;
  4. public int weight = 10;
  5. @Override
  6. public void eat() {
  7. System.out.println("猫吃鱼");
  8. }
  9. public void playGame() {
  10. System.out.println("猫捉迷藏");
  11. }
  12. }

测试类

  1. package com.itheima_02;
  2. /*
  3. 测试类
  4. */
  5. public class AnimalDemo {
  6. public static void main(String[] args) {
  7. //有父类引用指向子类对象
  8. Animal a = new Cat();
  9. System.out.println(a.age);
  10. // System.out.println(a.weight);
  11. a.eat();
  12. // a.playGame();
  13. }
  14. }

多态的好处和弊端

好处
提高程序的扩展性。定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作
弊端
不能使用子类的特有成员

多态中的转型

向上转型
父类引用指向子类对象就是向上转型
向下转型
格式:子类型 对象名 = (子类型)父类引用;
示例代码
动物类

  1. package com.itheima_04;
  2. public class Animal {
  3. public void eat() {
  4. System.out.println("动物吃东西");
  5. }
  6. }

猫类

  1. package com.itheima_04;
  2. public class Cat extends Animal {
  3. @Override
  4. public void eat() {
  5. System.out.println("猫吃鱼");
  6. }
  7. public void playGame() {
  8. System.out.println("猫捉迷藏");
  9. }
  10. }

测试类

  1. package com.itheima_04;
  2. /*
  3. 向上转型
  4. 从子到父
  5. 父类引用指向子类对象
  6. 向下转型
  7. 从父到子
  8. 父类引用转为子类对象
  9. */
  10. public class AnimalDemo {
  11. public static void main(String[] args) {
  12. //多态
  13. Animal a = new Cat(); //向上转型
  14. a.eat();
  15. // a.playGame();
  16. /*
  17. //创建Cat类的对象
  18. Cat c = new Cat();
  19. c.eat();
  20. c.playGame();
  21. */
  22. //向下转型
  23. Cat c = (Cat)a;
  24. c.eat();
  25. c.playGame();
  26. }
  27. }

多态的案例

案例需求
请采用多态的思想实现猫和狗的案例,并在测试类中进行测试
示例代码
动物类

  1. package com.itheima_06;
  2. public class Animal {
  3. private String name;
  4. private int age;
  5. public Animal() {
  6. }
  7. public Animal(String name, int age) {
  8. this.name = name;
  9. this.age = age;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public int getAge() {
  18. return age;
  19. }
  20. public void setAge(int age) {
  21. this.age = age;
  22. }
  23. public void eat() {
  24. System.out.println("动物吃东西");
  25. }
  26. }

猫类

  1. package com.itheima_06;
  2. public class Cat extends Animal {
  3. public Cat() {
  4. }
  5. public Cat(String name, int age) {
  6. super(name, age);
  7. }
  8. @Override
  9. public void eat() {
  10. System.out.println("猫吃鱼");
  11. }
  12. }

狗类

  1. package com.itheima_06;
  2. public class Dog extends Animal {
  3. public Dog() {
  4. }
  5. public Dog(String name, int age) {
  6. super(name, age);
  7. }
  8. @Override
  9. public void eat() {
  10. System.out.println("狗吃骨头");
  11. }
  12. }

测试类

  1. package com.itheima_06;
  2. /*
  3. 测试类
  4. */
  5. public class AnimalDemo {
  6. public static void main(String[] args) {
  7. //创建猫类对象进行测试
  8. Animal a = new Cat();
  9. a.setName("加菲");
  10. a.setAge(5);
  11. System.out.println(a.getName() + "," + a.getAge());
  12. a.eat();
  13. a = new Cat("加菲", 5);
  14. System.out.println(a.getName() + "," + a.getAge());
  15. a.eat();
  16. }
  17. }

抽象类

抽象类的概述

当我们在做子类共性功能抽取时,有些方法在父类中并没有具体的体现,这个时候就需要抽象类了!
在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类!

抽象类的特点

抽象类和抽象方法必须使用 abstract 关键字修饰

  1. //抽象类的定义
  2. public abstract class 类名 {}
  3. //抽象方法的定义
  4. public abstract void eat();

抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
抽象类不能实例化
抽象类如何实例化呢?参照多态的方式,通过子类对象实例化,这叫抽象类多态
抽象类的子类
要么重写抽象类中的所有抽象方法
要么是抽象类

抽象类的成员特点

成员变量
既可以是变量
也可以是常量
构造方法
空参构造
有参构造
成员方法
抽象方法
普通方法
示例代码
动物类

  1. package com.itheima_03;
  2. /*
  3. 抽象类
  4. */
  5. public abstract class Animal {
  6. private int age = 20;
  7. private final String city = "北京";
  8. public Animal() {}
  9. public Animal(int age) {
  10. this.age = age;
  11. }
  12. public void show() {
  13. age = 40;
  14. System.out.println(age);
  15. // city = "上海";
  16. System.out.println(city);
  17. }
  18. public abstract void eat();
  19. }

猫类

  1. package com.itheima_03;
  2. public class Cat extends Animal {
  3. @Override
  4. public void eat() {
  5. System.out.println("猫吃鱼");
  6. }
  7. }

测试类

  1. package com.itheima_03;
  2. /*
  3. 测试类
  4. */
  5. public class AnimalDemo {
  6. public static void main(String[] args) {
  7. Animal a = new Cat();
  8. a.eat();
  9. a.show();
  10. }
  11. }

抽象类的案例

案例需求
请采用抽象类的思想实现猫和狗的案例,并在测试类中进行测试
示例代码
动物类

  1. package com.itheima_04;
  2. public abstract class Animal {
  3. private String name;
  4. private int age;
  5. public Animal() {
  6. }
  7. public Animal(String name, int age) {
  8. this.name = name;
  9. this.age = age;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public int getAge() {
  18. return age;
  19. }
  20. public void setAge(int age) {
  21. this.age = age;
  22. }
  23. public abstract void eat();
  24. }

猫类

  1. package com.itheima_04;
  2. public class Cat extends Animal {
  3. public Cat() {
  4. }
  5. public Cat(String name, int age) {
  6. super(name, age);
  7. }
  8. @Override
  9. public void eat() {
  10. System.out.println("猫吃鱼");
  11. }
  12. }

狗类

  1. package com.itheima_04;
  2. public class Dog extends Animal {
  3. public Dog() {
  4. }
  5. public Dog(String name, int age) {
  6. super(name, age);
  7. }
  8. @Override
  9. public void eat() {
  10. System.out.println("狗吃骨头");
  11. }
  12. }

测试类

  1. package com.itheima_04;
  2. /*
  3. 测试类
  4. */
  5. public class AnimalDemo {
  6. public static void main(String[] args) {
  7. //创建对象,按照多态的方式
  8. Animal a = new Cat();
  9. a.setName("加菲");
  10. a.setAge(5);
  11. System.out.println(a.getName()+","+a.getAge());
  12. a.eat();
  13. System.out.println("--------");
  14. a = new Cat("加菲",5);
  15. System.out.println(a.getName()+","+a.getAge());
  16. a.eat();
  17. }
  18. }

接口

接口的概述

接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。
Java中的接口更多的体现在对行为的抽象!

接口的特点

接口用关键字interface修饰

  1. public interface 接口名 {}

类实现接口用implements表示

  1. public class 类名 implements 接口名 {}

接口不能实例化
接口如何实例化呢?参照多态的方式,通过实现类对象实例化,这叫接口多态。
多态的形式:具体类多态,抽象类多态,接口多态。
接口的子类
要么重写接口中的所有抽象方法
要么子类也是抽象类

接口的成员特点

成员变量
只能是常量 默认修饰符:public static final
构造方法
没有,因为接口主要是扩展功能的,而没有具体存在
成员方法
只能是抽象方法
默认修饰符:public abstract
示例代码
接口

  1. package com.itheima_02;
  2. public interface Inter {
  3. public int num = 10;
  4. public final int num2 = 20;
  5. // public static final int num3 = 30;
  6. int num3 = 30;
  7. // public Inter() {}
  8. // public void show() {}
  9. public abstract void method();
  10. void show();
  11. }

实现类

  1. package com.itheima_02;
  2. //public class InterImpl implements Inter {
  3. public class InterImpl extends Object implements Inter {
  4. public InterImpl() {
  5. super();
  6. }
  7. @Override
  8. public void method() {
  9. System.out.println("method");
  10. }
  11. @Override
  12. public void show() {
  13. System.out.println("show");
  14. }
  15. }

测试类

  1. package com.itheima_02;
  2. /*
  3. 测试类
  4. */
  5. public class InterfaceDemo {
  6. public static void main(String[] args) {
  7. Inter i = new InterImpl();
  8. // i.num = 20;
  9. System.out.println(i.num);
  10. // i.num2 = 40;
  11. System.out.println(i.num2);
  12. System.out.println(Inter.num);
  13. }
  14. }

接口的案例

案例需求
对猫和狗进行训练,他们就可以跳高了,这里加入跳高功能。
请采用抽象类和接口来实现猫狗案例,并在测试类中进行测试。
示例代码
动物类

  1. package com.itheima_03;
  2. public abstract class Animal {
  3. private String name;
  4. private int age;
  5. public Animal() {
  6. }
  7. public Animal(String name, int age) {
  8. this.name = name;
  9. this.age = age;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public int getAge() {
  18. return age;
  19. }
  20. public void setAge(int age) {
  21. this.age = age;
  22. }
  23. public abstract void eat();
  24. }

跳高接口

  1. package com.itheima_03;
  2. public interface Jumpping {
  3. public abstract void jump();
  4. }

猫类

  1. package com.itheima_03;
  2. public class Cat extends Animal implements Jumpping {
  3. public Cat() {
  4. }
  5. public Cat(String name, int age) {
  6. super(name, age);
  7. }
  8. @Override
  9. public void eat() {
  10. System.out.println("猫吃鱼");
  11. }
  12. @Override
  13. public void jump() {
  14. System.out.println("猫可以跳高了");
  15. }
  16. }

测试类

  1. package com.itheima_03;
  2. /*
  3. 测试类
  4. */
  5. public class AnimalDemo {
  6. public static void main(String[] args) {
  7. //创建对象,调用方法
  8. Jumpping j = new Cat();
  9. j.jump();
  10. System.out.println("--------");
  11. Animal a = new Cat();
  12. a.setName("加菲");
  13. a.setAge(5);
  14. System.out.println(a.getName()+","+a.getAge());
  15. a.eat();
  16. // a.jump();
  17. a = new Cat("加菲",5);
  18. System.out.println(a.getName()+","+a.getAge());
  19. a.eat();
  20. System.out.println("--------");
  21. Cat c = new Cat();
  22. c.setName("加菲");
  23. c.setAge(5);
  24. System.out.println(c.getName()+","+c.getAge());
  25. c.eat();
  26. c.jump();
  27. }
  28. }

类和接口的关系

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

抽象类和接口的区别

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

综合案例

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

  1. package com.itheima_05;
  2. //抽象人类
  3. public abstract class Person {
  4. private String name;
  5. private int age;
  6. public Person() {
  7. }
  8. public Person(String name, int age) {
  9. this.name = name;
  10. this.age = age;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public int getAge() {
  19. return age;
  20. }
  21. public void setAge(int age) {
  22. this.age = age;
  23. }
  24. public abstract void eat();
  25. }

抽象运动员类

  1. package com.itheima_05;
  2. //抽象运动员类
  3. public abstract class Player extends Person {
  4. public Player() {
  5. }
  6. public Player(String name, int age) {
  7. super(name, age);
  8. }
  9. public abstract void study();
  10. }

抽象教练类

  1. package com.itheima_05;
  2. //抽象教练类
  3. public abstract class Coach extends Person {
  4. public Coach() {
  5. }
  6. public Coach(String name, int age) {
  7. super(name, age);
  8. }
  9. public abstract void teach();
  10. }

学英语接口

  1. package com.itheima_05;
  2. //说英语的接口
  3. public interface SpeakEnglish {
  4. public abstract void speak();
  5. }

蓝球教练

  1. package com.itheima_05;
  2. public class BasketballCoach extends Coach {
  3. public BasketballCoach() {
  4. }
  5. public BasketballCoach(String name, int age) {
  6. super(name, age);
  7. }
  8. @Override
  9. public void teach() {
  10. System.out.println("篮球教练教如何运球和投篮");
  11. }
  12. @Override
  13. public void eat() {
  14. System.out.println("篮球教练吃羊肉,喝羊奶");
  15. }
  16. }

乒乓球教练

  1. package com.itheima_05;
  2. public class PingPangCoach extends Coach implements SpeakEnglish {
  3. public PingPangCoach() {
  4. }
  5. public PingPangCoach(String name, int age) {
  6. super(name, age);
  7. }
  8. @Override
  9. public void teach() {
  10. System.out.println("乒乓球教练教如何发球和接球");
  11. }
  12. @Override
  13. public void eat() {
  14. System.out.println("乒乓球教练吃小白菜,喝大米粥");
  15. }
  16. @Override
  17. public void speak() {
  18. System.out.println("乒乓球教练说英语");
  19. }
  20. }

乒乓球运动员

  1. package com.itheima_05;
  2. public class PingPangPlayer extends Player implements SpeakEnglish {
  3. public PingPangPlayer() {
  4. }
  5. public PingPangPlayer(String name, int age) {
  6. super(name, age);
  7. }
  8. @Override
  9. public void study() {
  10. System.out.println("乒乓球运动员学习如何发球和接球");
  11. }
  12. @Override
  13. public void eat() {
  14. System.out.println("乒乓球运动员吃大白菜,喝小米粥");
  15. }
  16. @Override
  17. public void speak() {
  18. System.out.println("乒乓球运动员说英语");
  19. }
  20. }

篮球运动员

  1. package com.itheima_05;
  2. public class BasketballPlayer extends Player {
  3. public BasketballPlayer() {
  4. }
  5. public BasketballPlayer(String name, int age) {
  6. super(name, age);
  7. }
  8. @Override
  9. public void study() {
  10. System.out.println("篮球运动员学习如何运球和投篮");
  11. }
  12. @Override
  13. public void eat() {
  14. System.out.println("篮球运动员吃牛肉,喝牛奶");
  15. }
  16. }

测试类

  1. package com.itheima_05;
  2. /*
  3. 测试类
  4. */
  5. public class PersonDemo {
  6. public static void main(String[] args) {
  7. //创建对象
  8. PingPangPlayer ppp = new PingPangPlayer();
  9. ppp.setName("王浩");
  10. ppp.setAge(30);
  11. System.out.println(ppp.getName()+","+ppp.getAge());
  12. ppp.eat();
  13. ppp.study();
  14. ppp.speak();
  15. System.out.println("--------");
  16. BasketballPlayer bp = new BasketballPlayer();
  17. bp.setName("姚明");
  18. bp.setAge(35);
  19. System.out.println(bp.getName()+","+bp.getAge());
  20. bp.eat();
  21. bp.study();
  22. }
  23. }