1.1. 封装
封装将操作和与操作相关的数据集成在一个类中。
通过访问修饰符public、protected、private限制外部对类内部的方法和属性的访问。让外部只需要调用可访问的方法或属性来实现功能而不用在意类内部的实现。同时也保护内部数据不被随意改变。
就像一台手机,人们钟爱于它的小巧和功能多样。从原先的繁多的实体键发展到现在采用触屏+两三个实体键的操作方式。我们只需要很简单的操作就可以运用手机的多种功能,这就实现了封装。我们不需要去了解手机内部如何实现,就可以使用手机的拍照功能,播放音频的功能。就算以后采用新的技术提高了手机的清晰度的话(手机的内部实现),我们外部操作它的方式还是没有改变。
1.2. 继承
使用继承,实现了对父类代码的重用(包括方法和属性),并对父类进行扩展。
总结:继承归根结底有两个主要原因:1.重用2.扩展
Ps:多态是继承所展现的特性而不是继承的目的。
1.3. 抽象
通过抽象业务逻辑,使得代码符合开闭原则更易于维护和扩展。
比如:当你的公司要你实现一个类 Person 的说话的方法 say(); 。你可能会再代码里直接写
public void say (){ System.out.println("你好"); }
到目前为止,这个工作还是很简单的。但是如果公司要你这个Person类要不仅仅会说中文的话还要会英文等等其他语言呢?
先别急着开始敲代码,到这个时候如果你还没有对未来有点预见并且对原有的编程思想进行改变的话。你在今后将会面临的是无尽的代码修改工作。
因为世界上存在许多种语言,我们不可能在代码中单纯的用 switch 结构选择要输出哪个语种(这看起来是在太蠢了)。这个时候我们可以把 Person类由实体类转为抽象类,把say()这个方法的实现转移到实现Person类的子类中。这时say()方法就成了抽象方法。这样我们再也不怕公司再提怎么样的要求了,就算要讲火星语,我们只要实现一个Alian类并继承Person(外星人也是人吧~)在Alian中实现say()方法
public void say (){ System.out.println("!!@@#@#@……¥%#¥%……"); }
就可以满足公司的需求。虽然从编码的工作量来说好像反而更多一点。但是这样符合开闭原则--即对扩展开放,对修改关闭。
总结:抽象的根本的原因是为了消除需求变化对源码带来的影响,通过对业务逻辑的抽象使得我们在开发时可以放心的编码,当需求变化时,我们可以不用修改原有的运行良好的代码。而只需对现有的类进行扩展。
Ps:抽象又分过程抽象和数据对象。上述所说的是针对过程抽象--即函数级别的抽象。
1.4.多态
多态既是多种形态。多态不仅仅只有类的强制转换,还有方法的重载和运算符的重载都是多态的。比较三者会发现一个共同点。他们被调用的时候可以依据不同的情况有不同的行为。
比如类的强制转换。子类继承父类,便可以在任何使用父类的引用的地方使用子类的实例(里氏代换原则)。
例子:现在有一个熊孩子,经常追赶小动物。追狗的时候狗在跑,追猫的时候猫在跑。
熊孩子根据不同的动物有不同的动作。在这里就可以利用面向对象的多态性来完成编程。
创建一个抽象父类Animal
public abstract class Animal { public abstract void run();//抽象方法 }
创建两个具体实现类Dog和Cat
public class Dog extends Animal{ @Override public void run() { System.out.println("狗在跑"); } }
public class Cat extends Animal{ @Override public void run() { System.out.println("猫在跑"); } }
还一个熊孩子来执行主函数:
public class BearKid { public static void pursueAnimal(Animal animal){ //追赶动物 System.out.println("熊孩子开始追赶动物..."); animal.run(); } public static void main(String[] args) { Animal animal = new Dog(); //实例化一只狗 pursueAnimal(animal); //狗在跑 Animal animal1 = new Cat(); //实例化一只猫 pursueAnimal(animal1); //猫在跑 } }
在主函数中熊孩子的pursueAnimal()方法可以追赶任何动物,只要这个动物继承了Ainmal类,在调用animal的run()方法时会调用实例的run方法。这样就可以实现--依据不同的情况有不同的行为。
Java中的 + 运算符的操作数 不仅可以是整型、浮点数也可以是字符串,这也是多态的表现。
在同一个类中我们可以有多个同名称但不同参数(参数类型或个数不同)的方法,这样在调用的时候依据参数来选择具体的方法,这也是多态哦。