多态-接口-抽象类

多态

多态-一个行为多种状态。比如打篮球 打羽毛球 同样是打 但是动作规则完全不一样。

java里面的多态也是类似。

  • 子类继承父类
  • 父类引用指向子类对象
  • 子类重写了父类方法

当使用父类引用调用被重写的方法时,实际执行的是子类的方法,这就是多态。

class Father {
    void say() {
        System.out.println("Father say");
    }
}

class Son extends Father {
    @Override
    void say() {
        System.out.println("Son say");
    }
}

class Daughter extends Father {
    @Override
    void say() {
        System.out.println("Daughter say");
    }
}

public class Test {
    public static void main(String[] args) {
        Father f1 = new Son();
        Father f2 = new Daughter();
        f1.say(); // 输出 Son say
        f2.say(); // 输出 Daughter say
    }
}Code language: JavaScript (javascript)

抽象类

把方法的实现部分去掉,直接以分号结束,增加abstract修饰符,就构成了抽象方法。

public abstract void talk();Code language: PHP (php)

抽象方法就是为了重写的。就是我自己不实现,交给子类去实现。

当一个类含有抽象方法的时候,则该类必须声明为抽象类。抽象类不能被实例化,需增加abstract修饰符。

抽象方法只需要声明,而不需要实现。

abstract class Animal {
    public abstract void talk();

    public void sleep() {
        System.out.println("sleeping");
    }
}

class Dog extends Animal {
    @Override
    public void talk() {
        System.out.println("汪汪");
    }
}Code language: PHP (php)

Final关键字

final的变量的值不能够被改变

class A{
    final int i = 9;
}

A a = new A();
// a.i = 3; // 编译出错Code language: PHP (php)

final的方法不能够被重写

class Father {
    final void method() {}
}

class Son extends Father {
    // void method() {} // 编译出错,不能重写final方法
}Code language: JavaScript (javascript)

final的类不能够被继承

final class Father {}

// class Son extends Father {} // 编译出错,不能继承final类Code language: PHP (php)

接口

接口是抽象方法和常量值的集合。

从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。

public interface IAnimal {
    public static final int id = 1;

    public void run();
    public void eat();
}Code language: PHP (php)

接口可以多重实现,也就是变相的多重继承。

接口成员变量只能是public static final,就算不写也是这个。

接口只能定义抽象方法,默认是public abstract,也只能是public abstract。

接口可以继承其他接口,并添加新的属性和抽象方法。

实现接口需要用implements。

interface IAnimal {
    int id = 1; // 默认 public static final
    void run(); // 默认 public abstract
    void eat();
}

class Dog implements IAnimal {
    @Override
    public void run() {
        System.out.println("dog run");
    }

    @Override
    public void eat() {
        System.out.println("dog eat");
    }
}

interface IHuman extends IAnimal {
    void speak();
}Code language: PHP (php)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注