前言
面向对象的特性
1.封装
封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
1.1 封装的个人理解
- 尽可能把数据的具体的内部实现给隐藏起来,外界无法直接访问数据内,进行赋值等操作。
- 外界如果想要进行赋值等操作,必须通过提供的公共接口来进行修改赋值操作。
1.2 封装的优点
- 减少耦合: 可以独立地开发、测试、优化、使用、理解和修改 减轻维护的负担。 可以更容易被程序员理解,并且在调试的时候可以不影响其他模块
- 有效地调节性能 可以通过剖析确定哪些模块影响了系统的性能 提高软件的可重用性 降低了构建大型系统的风险
- 即使整个系统不可用,但是这些独立的模块却有可能是可用的
1.3 封装的具体实例
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() {
if (18 <= age && age <= 50) {
System.out.println(name + " is working very hard!");
} else {
System.out.println(name + " can't work any more!");
}
}
}
2.继承
- 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
- 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
2.1继承的个人理解
继承实现了IS-A关系,即子类是父类中的一个实现
当父类的方法,或者属性不能够满足具体使用,需要在父类的基础上进行扩展的时候,就可以使用继承
继承需要遵守里氏替换原则
所谓里氏替换原则
个人觉得是一种规范,
首先子类尽量不要改动父类的东西,
但可以在父类的基础上加东西
当重载父类方法时,参数要比父类更加宽松
返回值要比父类更加严格
向上转型
(Cat 可以当做 Animal 来使用,也就是说可以使用 Animal 引用 Cat 对象。父类引用指向子类对象称为 向上转型 。
Animal animal = new Cat();
)
3.多态
多态分为编译时多态和运行时多态:
编译时多态主要指方法的重载
运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定
运行时多态有三个条件:
继承
覆盖(重写)
向上转型
/**下面的代码中,乐器类(Instrument)有两个子类: Wind 和 Percussion,它们都覆盖了父类的 play() 方法,并且在 main() 方法中使用父类 Instrument 来引用 Wind 和 Percussion 对象。在 Instrument 引用调用 play() 方法时,会执行实际引用对象所在类的 play() 方法,而不是 Instrument 类的方法。
**/
public class Instrument {
public void play() {
System.out.println("Instument 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();
}
}
}