快速回忆
- 抽象类的概念?
- abstract的注意事项?
- 接口的概念?
- 接口的定义
- 接口如何实现
知识讲解
6.1 抽象abstract
6.1.1 面向抽象编程
面向对象编程以对象作为程序的基本单元,面向抽象编程是面向对象编程的一种深化和扩展。
面向抽象编程强调的是抽象(abstract),即定义一个或多个抽象类并规定一些抽象方法,然后创建这些抽象类的子类,其子类不再继承具体的类,并在子类中提供这些抽象方法的具体实现,即所设计类中的重要数据是抽象类声明的对象,而不是具体类声明的对象。→抽象类只关心设计,而不需要考虑方法的具体实现。
抽象类 具体类声明的对象 = new 抽象类的实现类()
这种程序设计的核心便是使用上转型对象→多态,即将abstract类声明的对象作为其子类对象的上转型对象,那么这个上转型对象就可以调用子类重写的方法。
6.2.2 abstract类和abstract方法
abstract关键字可以修饰类和方法,表示抽象类和抽象方法。
6.2.3 抽象方法
抽象方法是被abstract修饰的方法,特点是只有声明而没有方法体。其子类对象必须重新定义所有的抽象方法,否则将仍作为抽象方法写入子类。
abstract void makeSound()
6.2.4 抽象类
抽象类是被abstract修饰的类,抽象类不一定含有抽象方法,但含有抽象方法的类一定声明为抽象类,即如果其子类没有实现所有的抽象方法,其子类也是抽象类。特点是抽象类不能进行实例化,我们不能创建抽象类的任何对象。
abstract class Animal{
……
abstract void makeSound()
……
}
6.2.5 抽象abstract的作用
- 可以将子类的公共属性和不能确认的方法提取到抽象类中,这样子类在继承抽象类的时候就可以直接使用这些公共属性和方法,从而简化了代码的操作。
- 当我们需要增加新功能时,只需要增加新的子类并实现相应的方法,不会影响到已有的代码。
- 提高代码的复用性,因为定义的是抽象类或者接口,其实现可以被多个子类继承和复用。
6.2.6 抽象类的使用
Dog和Cat作为Animal抽象类的子类必须重新实现抽象方法makeSound(),并且创建的Animal对象拥有各自makeSound()逻辑。
abstract class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public abstract void makeSound();
public String getName() {
return name;
}
}
class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println("汪汪汪");
}
}
class Cat extends Animal {
public Cat(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println("喵喵喵");
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog("旺财");
Animal cat = new Cat("汤姆");
dog.makeSound(); // 输出 "汪汪汪"
cat.makeSound(); // 输出 "喵喵喵"
}
}
6.2 接口interface
6.2.1 面向接口编程
面向抽象编程的思想则是在设计类时,不依赖于具体的类,而是面向抽象类。
面向接口编程指根据提前定义好的接口,通过实现该接口来完成功能的实现。面向接口编程与面向抽象的思想之间的关系是密切的。它们都强调了从高层次的抽象视角来看待问题,而不是深入到具体的实现细节。面向接口编程的思想是面向抽象编程思想更加成熟的发展
6.2.2 接口
interface,接口,是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法(JDK 7及以前),默认方法和静态方法(JDK 8),私有方法(JDK 9)。
6.2.3 接口声明
接口的定义,它与定义类方式相似,但是使用 interface 关键字。它也会被编译成.class文件,但一定要明确它并不是类,而是另外一种引用数据类型。
public interface 接口名称 {
接口体
// 抽象方法
// 默认方法
// 静态方法
// 私有方法
}
接口体中由抽象方法和静态常量组成。红色字体允许省略。
public abstract 返回值类型 抽象方法();
public static final 数据类型 常量名 = 常量值;
6.2.4 接口实现implements
java中继承只能实现单继承,接口可以多实现,一个类可以实现多个接口。
// 定义一个接口
interface Animal {
// 声明一个抽象方法
void eat();
}
// 实现Animal接口的类
class Dog implements Animal {
// 提供eat方法的具体实现
public void eat() {
System.out.println("Dog is eating...");
}
}
// 实现Animal接口的类
class Cat implements Animal {
// 提供eat方法的具体实现
public void eat() {
System.out.println("Cat is eating...");
}
}
public class Main {
public static void main(String[] args) {
// 创建Dog对象并调用其eat方法
Dog dog = new Dog();
dog.eat();
// 创建Cat对象并调用其eat方法
Cat cat = new Cat();
cat.eat();
}
}