有两种不同的东西,信息隐藏和抽象。
信息隐藏使抽象成为可能,但它有所不同。例如,使用您的代码
public class employee {
private String name;
private int id;
public void setName(String name) {
this.name = name;
}
public String getName(){
return name;
}
}
id 字段实际上是隐藏的。这允许人们以一种与程序的其余部分分离的方式处理 id。您的姓名字段实际上也被隐藏了,因为您不能直接访问姓名字段,但 getName 和 setName 中的代码可以。
一旦您对其余代码隐藏了数据结构,强制通过方法进行访问,就可以创建一个项目的许多可替换实现。例如,employee 是 person 的概念类型,因此您可以像这样重写上面的代码:
public interface Person {
public abstract String getName();
}
public class Employee implements Person {
private String name;
private int id;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
}
现在您的代码可以将Employee 处理为Person。在重写未明确处理Employees 的其余代码以处理Persons 后,您可以实现其他类型的Persons 并利用现在为Person 的非员工特定任务任务。
public Customer implements Person {
private String name;
private integer moneySpent;
public String getName() {
return name;
}
}
因此,一个人搜索例程,只要它只索引Person 对象,现在就可以包括对Employees 和Customers 的搜索。这是因为处理Person 对象的代码实际上是在处理Employee 和Customer 对象共享的更高级别的抽象。
在抽象级别处理对象时,方法的名称在抽象之间共享;但是,实际执行的代码取决于对象的未提及的底层类型。换句话说,如果你问一个人(恰好是雇员)getName(),那么它会用Employee.getName() 函数响应,而Customer 会用Customer.getName() 函数响应。由于调用getName() 的代码在Persons 上运行,它不知道它将处理哪种类型的人,但行为的明显变化(基于每个对象选择正确的代码块)仍然发生。这种现象被称为 Polymorphisim,如果您第一次接触这些概念,您会听到 Polymorphisim 作为一个经常使用的词。
多态行为的一个例子:
public interface Animal {
public abstract String makeSound();
}
public class Cow implements Animal {
public String makeSound() {
return "Moo Moo!";
}
}
public class Dog implements Animal {
public String makeSound() {
return "Ruff Ruff!";
}
}
public class Sheep implements Animal {
public String makeSound() {
return "Baa Baa!";
}
}
// this class demonstrates the polymorphic behavior
public class Farm {
public static void main(String[] args) {
ArrayList<Animal> animals = new ArrayList<Animal>();
animals.add(new Cow());
animals.add(new Sheep());
animals.add(new Dog());
for (Animal animal : animals) {
// this is where the polymorphisim occurs
// each animal will make a different sound
// because the makeSound method is getting
// bound to different blocks of code based
// on the exact type of animal class hiding
// under the Animal abstraction.
System.out.println(animal.makeSound());
}
}
}
预期输出:
Moo Moo!
Baa Baa!
Ruff Ruff!
即使我们从未显式更改类,也从未显式更改方法。改变的是抽象方法与显式子类的绑定,这种情况只发生在支持多态的系统中。