1.封装
利用抽象数据类型将数据和技术数据的操作封装在一起,使其构成一个不可分割的独立实体;数据被保护在抽象数据类型的内部,尽可能的隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象提供对外接口来访问对象。
优点:
减少耦合:可以独立的开发测试,优化,使用,理解和修改
减轻维护的负担:可以更容易被程序员理解,并且在调试的时候可以不影响其他模块
有效的调节性能:可以通过剖析确定哪些模块影响了系统的性能
提高软件的可用性
降低了构建大型系统的风险,即使整个系统不可用,但是这些独立的模块确有可能是可用的。
以下person类封装name,gender,age等属性,外界只能通过get()方法获取一个person对象的name和gender属性,而无法过去age属性,但是age属性可以供work()方法使用。
注意gender属性使用int数据类型进行存储,封装使得用户注意不到这种实现细节,并且在需要修改gender属性的数据类型时,也可以在不影响客户端代码的情况下进行。
public class Person{
private String name;
private int gender;
private int age;
public String getName(){
return name;
}
public String getGender(){
return gender == 0 ? "man":"woman";
}
public void work(int age){
if(18<age && age<=50){
System.out.println("aaa");
}else{
System.out.println("bbb");
}
}
}
2.继承
继承实现了IS-A关系,例如Cat和Animal就是一种IS-A关系,因此Cat可以继承Animal,从而获得Animal非private的属性和方法。
继承应该遵循里氏替换原则,子类对象必须能够替换掉所有父类对象。
Cat可以当做Animal来使用,也就是说可以使用Animal引用Cat对象,父类引用指向子类对象称为向上转型。
Animal animal = new Cat();
3.多态
多态分为编译时多态和运行时多态:
编译时多态主要指方法的重载
运行时多态指程序中定义的引用对象引用所指向的具体类型在运行期间才确定。
运行时多态有三个条件:
继承
覆盖(重写)
向上转型
public class Instrument {
public void play() {
System.out.println("Instrument is playing...");
}
}
public class Wind extends Instrument {
public void play() {
System.out.println("Wind is playing...");
}
}
public class Percussion extends Instrument {
public void play() {
System.out.println("Percussion is playing...");
}
}
public class Music {
public static void main(String[] args) {
List<Instrument> instruments = new ArrayList<>();
instruments.add(new Wind());
instruments.add(new Percussion());
for(Instrument instrument : instruments) {
instrument.play();
}
}
}