多态,抽象和接口
Keep on going never give up !!!
多态
含义:
- 概念:对象在不同时刻表现出的不同状态
- 代码:代码上来看:一个父类引用/父接口引用指向一个子类对象,Fu fu = new Zi();
多态的成员特点(变量和方法,编译运行)
- 成员变量:编译看左边,运行看左边。
- 成员方法:编译看左边,运行看右边。
- 记忆:只有运行时用子类的方法,其他的编译运行都看父类。(当然,子类没有定义方法,还是运行父类的方法)
好处
- 提高了代码的扩展性,复用性和可维护性
使用场景
- 方法的形参用父类的引用来接收子类类型的实参。
弊端
- 不能使用子类特有的方法。(因为编译不能通过)
转型
- 向上转型
Fu f = new Zi();//父类的引用指向子类的对象
- 向下转型(强转)
Zi zi1 = (Zi)f;
抽象类
概念
- 如果一个类中的方法不确定做什么事情,那么我们就把方法体(包括{})干掉。然后这个方法就必须被abstract修饰,然后这个类就也必须被abstract修饰。被修饰的类称为抽象类,被修饰的方法称为抽象方法。
成员内容的特点(变量,方法和构造方法)
- 成员变量:可以有变量,也可以有常量(和正常类一样)
- 成员方法:
– 抽象方法:强制子类从写(规范子类的行为)
– 非抽象方法:让子类继承,提高代码的复用性。 - 构造方法:有构造方法,但是不能通过构造方法实例化对象,构造方法的作用就是初始化数据,让子类通过super()使用.
接口
概念
- 接口就是一个规范(标准)。
成员内容的特点(全部是静态的常量和抽象的方法)
- 成员变量:全部是静态常量(默认有public static final 修饰)
- 成员方法:只能有抽象方法(默认有public abstract修饰)
类,抽象类和接口的关系(类和类继承,类和接口实现,接口和接口继承)
- 事物与生俱来的属性和行为定义在类里边,如果不确定做什么事情就将方法定义成抽象的。举例:比如人会说话,但是会的语言不确定,可以把说话的方式定义为抽象方法。随着人的年龄的增长,会学习跳舞、编程、画画。这些东西都是后天培养的,不是天生的,所以应该定义到接口里面。比如定义个接口,接口中有个飞的功能,让人实现这个接口,这就是超人。
- 类和接口之间是实现的关系
- 类和接口之间是实现关系,一个类可以实现多个接口。一个普通类实现了接口以后必须全部重写接口里的所有抽象方法,抽象类实现接口可以重写也可以不重写抽象方法。
- 接口和接口之间是继承关系,并且可以多继承。
课堂代码
- Person 类
public abstract class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public abstract void eat(); }
- Learn 接口
public interface Learn { void learn(); }
- 运动员类
public abstract class Sportsman extends Person{ public abstract void sport(); public Sportsman() { } public Sportsman(String name, int age) { super(name, age); } }
- 教练类
public abstract class Coach extends Person{ public abstract void teach(); public Coach() { } public Coach(String name, int age) { super(name, age); } }
- 乒乓球运动员类
public class PingpoPlayer extends Sportsman implements Learn{ public PingpoPlayer() { } public PingpoPlayer(String name, int age) { super(name, age); } @Override public void learn() { System.out.println("learn english"); } @Override public void sport() { System.out.println("play pingpo"); } @Override public void eat() { System.out.println(this.getName()+"在吃饭"); } }
- 乒乓球教练类
public class PingpoCoach extends Coach implements Learn { public PingpoCoach() { } public PingpoCoach(String name, int age) { super(name, age); } @Override public void teach() { System.out.println(this.getName()+"教乒乓球"); } @Override public void learn() { System.out.println("教练学英语"); } @Override public void eat() { System.out.println("play pingpo"); } }