[JAVA] 7.Java的多态
简言之,Java的多态可以通过三种方式实现:
- 重写
- 接口
- 抽象类和抽象方法
1. 重写
之前提到过,包括对equals和hashcode的重写,还有对于函数的重载。
3. 抽象类抽象方法:
UIControl.java
public abstract class UIContent {
...
public abstract void render();
}
TextBox.java
public class TextBox extends UIContent {
@Override
public void render() {
System.out.println("渲染TextBox");
}
}
上面的TextBox继承了抽象类,而抽象类中声明了一个抽象方法,所以TextBox必须去实现它,否则编译错误,或者可以将TextBox声明为抽象类,然后继承TextBox的类实现它。
提到了abstract,就要提一下fianl这个修饰词,final修饰类的时候,该类不可被继承,修饰方法的时候,该方法不可被重写,修饰变量的时候,该变量不可被改动。
接口
如果理解接口和类呢?下面这张图中mosh讲的通俗易懂
通过接口可以实现什么效果呢?
下面是一个紧耦合的例子:
TaxCalculator.java
public class TaxCalculator {
private double taxableIncome;
public TaxCalculator(double taxableIncome) {
this.taxableIncome = taxableIncome;
}
public double calculateTax(){
return taxableIncome*0.3;
}
}
TaxReport.java
public class TaxReport {
private TaxCalculator calculator;
public TaxReport(){
calculator = new TaxCalculator(10_000);
}
public void show(){
var tax = calculator.calculateTax();
System.out.println(tax);
}
}
接下来,创建接口:
在java中,大家命名接口时,一般命名为:Can...
或者...able
这里定义TaxCalculator接口(已经重命名之前的类为TaxCalculator2020)
public interface TaxCalculator {
double calculateTax();
}
这里不需要指定内部函数为public,因为这个是默认的。
当一个类实现接口的时候,需要在实现的函数上加上@Override,与继承时使用extends类似,实现时使用implements,这个置于extends后面。
每一次精致的阅读,都是为了成为更好的自己。
<( ̄︶ ̄)↗[GO!]