前言:面向对象的三大特征
● 封装
● 继承
● 多态
一、封装
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。适当的封装可以让程式码更容易理解与维护,也加强了代码的安全性。
优点:
-
良好的封装能够减少耦合。
-
类内部的结构可以自由修改。
-
可以对成员变量进行更精确的控制。
-
隐藏信息,实现细节。
实现封装的步骤
一般我们可以通过将类成员用 private 关键字修饰来限制可访问性:
public class Demo{
//将类的成员变量访问权限设置为私有
private String name;
//对外部类提供一个可以访问私有变量name的方法
public String getName (){
return name;
}
//对外部类提供一个可以修改私有变量name的方法
public void setName(String name){
this.name = name;
}
}
这样就做到了外部类必须通过封装类提供的方法才能访问,否则无法直接访问私有变量的效果,封装类提供的方法相当于桥梁,将外部类和私有变量连接起来,但是外部类无法知晓封装类的内部是如何运作的,只能通过桥梁使用。
二、继承
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
例:
儿子可以继承父亲的外貌,性格,同样可以继承父亲的行为模式。
映射到Java中的继承即为:
子类实例化对象可以继承父类的非 private 属性,方法。
但是同样子类也会有自己独特的属性和方法区别于父类,这类属性和方法则只能子类自身的实例化对象使用。
所以多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么,多个类中无需再定义这些属性和行为,只需要和抽取出来的类构成继承关系。(提取公因数的意思)
三、多态
多态是同一个行为具有多个不同表现形式或形态的能力。
(简单理解为:我们举一个动物类型,其中有一个吃东西的方法。则所有动物类的实例化对象,都能调用吃东西的方法,但是动物类有2个子类,1是狗,2是猫,他们各自又有各自的吃东西方法)
public class Test {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 对象调用 show 方法
show(new Dog()); // 以 Dog 对象调用 show 方法
Animal a = new Cat(); // 向上转型
a.eat(); // 调用的是 Cat 的 eat
Cat c = (Cat)a; // 向下转型
c.work(); // 调用的是 Cat 的 work
}
public static void show(Animal a) {
a.eat();
// 类型判断
if (a instanceof Cat) { // 猫做的事情
Cat c = (Cat)a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
}
abstract class Animal {
abstract void eat();
}
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}