java接口:
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
两种含义:一,Java接口,Java语言中存在的结构,有特定的语法和结构;二,一个类所具有的方法的特征集合,是一种逻辑上的抽象。前者叫做“Java接口”,后者叫做“接口”。
java继承:
继承是面向对象编程的一种强大的代码复用方式;
Java只允许单继承,所有类最终的根类是Object;
protected允许子类访问父类的字段和方法;
子类的构造方法可以通过super()调用父类的构造方法;
可以安全地向上转型为更抽象的类型;
可以强制向下转型,最好借助instanceof判断;
子类和父类的关系是is,has关系不能用继承。
java多态:
多态分为编译时多态和运行时多态:
编译时多态主要指方法的重载
运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定(多态的特性就是,运行期才能动态决定调用的子类方法。对某个类型调用某个方法,执行的实际方法可能是某个子类的覆写方法)
运行时多态有三个条件:
继承
覆盖(重写)
向上转型
1)example1:
下面的代码中,乐器类(Instrument)有两个子类:Wind 和 Percussion,它们都覆盖了父类的 play() 方法,并且在 main() 方法中使用父类 Instrument 来引用 Wind 和 Percussion 对象(向上转型)。在 Instrument 引用调用 play() 方法时,会执行实际引用对象所在类的 play() 方法,而不是 Instrument 类的方法。
2)example2:
public class Main {
public static void main(String[] args) {
// 给一个有普通收入、工资收入和享受国务院特殊津贴的小伙伴算税:
Income[] incomes = new Income[] {
new Income(3000),
new Salary(7500),
new StateCouncilSpecialAllowance(15000)
};
System.out.println(totalTax(incomes));
}
public static double totalTax(Income... incomes) { //java使用省略号代替多参数(参数类型... 参数名)
double total = 0;
for (Income income: incomes) {
total = total + income.getTax();
}
return total;
}
}
// Income类:给普通收入的人算税
class Income {
protected double income;
public Income(double income) {
this.income = income;
}
public double getTax() {
return income * 0.1; // 税率10%
}
}
// 2种子类:工资收入和享受国务院特殊津贴的人算税
class Salary extends Income {
public Salary(double income) {
super(income);
}
@Override
public double getTax() {
if (income <= 5000) {
return 0;
}
return (income - 5000) * 0.2;
}
}
class StateCouncilSpecialAllowance extends Income {
public StateCouncilSpecialAllowance(double income) {
super(income);
}
@Override
public double getTax() {
return 0;
}
}
子类可以覆写父类的方法(Override),覆写在子类中改变了父类方法的行为;
Java的方法调用总是作用于运行期对象的实际类型,这种行为称为多态;
final修饰符有多种作用:
final修饰的方法可以阻止被覆写;
final修饰的class可以阻止被继承;
final修饰的field必须在创建对象时初始化,随后不可修改。