📜  Java的接口和多态性(1)

📅  最后修改于: 2023-12-03 15:02:05.708000             🧑  作者: Mango

Java的接口和多态性

Java的接口和多态性是Java中两个非常重要的概念。接口是一种规范,用于定义类应该包含哪些方法,而多态性则是指同一个对象可以在不同情况下表现出不同的行为。

接口
定义接口

在Java中,接口是通过interface关键字来定义的。接口中可以包含方法和常量定义,但是不能有方法实现和变量声明。下面是一个接口的例子:

public interface MyInterface {
    void showMessage();
    String getText();
    int MAX_SIZE = 100;
}

接口中定义的方法默认是public abstract,而常量默认是public static final。因此,可以在其他类中使用接口的方法和常量,只需要使用implements关键字实现接口即可。

实现接口

实现接口的类需要实现接口中定义的所有方法,并且可以实现其他方法,但是必须定义为public类型。下面是一个实现了上述接口的例子:

public class MyClass implements MyInterface {
    public void showMessage() {
        System.out.println("Hello World!");
    }
    public String getText() {
        return "This is a text.";
    }
    public void print() {
        System.out.println("This is a print statement.");
    }
}
接口和抽象类的区别

接口和抽象类都是用于实现类的继承和多态性。但是,接口和抽象类之间也有很大的区别。下面是它们之间的一些区别:

  • 接口中的方法都是抽象的,而抽象类可以包含具体实现的方法。
  • 类只能继承一个类,但是可以实现多个接口。
  • 接口中的变量必须是public static final类型的常量,而抽象类中的变量可以是普通属性。
  • 接口没有构造函数,而抽象类可以有构造函数。
多态性
多态性的概念

在Java中,多态性是指同一个对象在不同情况下表现出不同的行为。这种现象可以实现类的多态性,也就是父类指向子类的实例。下面是一个类的继承和多态性的例子:

public class Animal {
    public void move() {
        System.out.println("Animals can move");
    }
}

public class Dog extends Animal {
    public void move() {
        System.out.println("Dogs can walk and run");
    }
}

public class Penguin extends Animal {
    public void move() {
        System.out.println("Penguins can swim");
    }
}

public class Test {
    public static void main(String[] args) {
        Animal animal1 = new Animal();
        Animal animal2 = new Dog();
        Animal animal3 = new Penguin();
        
        animal1.move();
        animal2.move();
        animal3.move();
    }
}

输出结果如下:

Animals can move
Dogs can walk and run
Penguins can swim

可以看出,同一个对象在不同情况下表现出了不同的行为,实现了多态性。

多态性的实现

在Java中,多态性是通过方法重写和对象引用来实现的。当子类继承父类并重写父类的方法时,可以根据实际情况决定采用类的哪个方法。而对象引用则可以使同一个对象在不同情况下表现出不同的行为。下面是一个使用多态性的例子:

public class Animal {
    public void move() {
        System.out.println("Animals can move");
    }
}

public class Dog extends Animal {
    public void move() {
        System.out.println("Dogs can walk and run");
    }
}

public class Penguin extends Animal {
    public void move() {
        System.out.println("Penguins can swim");
    }
}

public class Test {
    public static void main(String[] args) {
        Animal animal1 = new Animal();
        Animal animal2 = new Dog();
        Animal animal3 = new Penguin();
        
        callMove(animal1);
        callMove(animal2);
        callMove(animal3);
    }
    
    public static void callMove(Animal animal) {
        animal.move();
    }
}

输出结果如下:

Animals can move
Dogs can walk and run
Penguins can swim

由于callMove方法只调用了move方法,所以可以通过方法重写和对象引用实现多态性。