接口和抽象类是对多态的一个补充,由于有的类不能初始化,只适合作为一个抽象的概念蓝图,要限制这些类的子类才能被初始化,因此接口和抽象类的概念被提出
抽象类
在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类,抽象类的关键字是==abstract==
不能直接new一个抽象类
抽象类和抽象方法的定义
抽象方法没有方法体,是为了标记多态而存在的。
抽象方法放宽了抽象父类的限制,让父类能够更方便的从所有子类中抽象出共性代码
//抽象类的定义
public abstract class 类名 {}
//抽象方法的定义
public abstract void eat();
抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
在创建一个抽象类时,需要对类中的所有抽象方法进行重写
Object类
Object类是Java中所有类的父类,但是Object类不是抽象类,没有必须被覆盖的方法,Object中的部分方法可以进行重写。
这里主要注意以下几个问题:
-
为什么允许创建Object对象?
因为有时候会需要创建一个通用的对象,一般在线程同步化上可能用到
-
设置Object类的目的是什么?
- 作为多态让方法可以应付多种类型的机制
- 提供Java执行期间对象通用的一些方法
-
为什么不把所有参数都定义为Object?
在面向对象三大特征详解一文中介绍过多态的向上转型和向下转型,如果将所有参数都定义为Object那么相当于是一种向上转型,所以在调用成员方法时只能调用Object中的声明过的成员方法
下面两张图可以帮助理解Object中的多态问题:
向上转型
向下转型
接口
接口是一种公共的规范标准,可以用于解决多重继承问题,接口定义的关键字是interface,接口实现的关键字是implements
接口中的所有方法都是抽象方法,所以接口是一种抽象类。
// 接口定义
public interface 接口名 {}
// 接口实现
public class 类名 implements 接口名 {}
需要注意的是:在Java中,一个子类只能继承一个父类,但是可以同时实现多个接口
代码实例
-
案例需求
对猫和狗进行训练,他们就可以跳高了,这里加入跳高功能。 请采用抽象类和接口来实现猫狗案例,并在测试类中进行测试。
-
代码实现
- 动物类
public abstract class Animal { private String name; private int age; public Animal() { } public Animal(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(); }
- 跳高接口
public interface Jumpping { public abstract void jump(); }
- 猫类
public class Cat extends Animal implements Jumpping { public Cat() { } public Cat(String name, int age) { super(name, age); } @Override public void eat() { System.out.println("猫吃鱼"); } @Override public void jump() { System.out.println("猫可以跳高了"); } }
- 测试类
public class AnimalDemo { public static void main(String[] args) { //创建对象,调用方法 Jumpping j = new Cat(); j.jump(); System.out.println("--------"); Animal a = new Cat(); a.setName("加菲"); a.setAge(5); System.out.println(a.getName()+","+a.getAge()); a.eat(); // a.jump(); a = new Cat("加菲",5); System.out.println(a.getName()+","+a.getAge()); a.eat(); System.out.println("--------"); Cat c = new Cat(); c.setName("加菲"); c.setAge(5); System.out.println(c.getName()+","+c.getAge()); c.eat(); c.jump(); } }