一. 什么是面向对象(OOP)
我理解的面向对象,是一种编程思想,代码的书写格式,面向对象编程思想指导我们写出复用性更高,更简洁的代码.
举个例子:把大象装进冰箱
面向过程:总共分三个过程,
-第一个过程:把冰箱门打开 (关着门的冰箱) 返回值是开着门的冰箱
-第二个过程:把大象装进去 (开着门的冰箱) 返回值是开着门,装着大象的冰箱
-第三个过程:把冰箱门关上 (开着门,装着大象的冰箱) 返回值是关着门,装着大象的冰箱
面向过程就是什么事我们都要亲力亲为,我们要自己打开冰箱,装大象,关门.
面向对象: 总共分三个动作,(每个动作都有一个对象去执行)
第一个动作: 冰箱.开门()
第二个动作: 冰箱.装进(大象)
第三个动作: 冰箱.关门()
或者是链式调用 冰箱.开门().装进(大象).关门()
面向对象就是我们创建-(new)一个对象,给对象添加上一些属性和功能(方法),之后操作这个对象来完成把大象装进冰箱的效果.
说到这里你可能有一点不理解,创建对象好麻烦,不如面向过程来的直接
那我们继续看下一个例子
话说三国时期,曹操带领百万大军攻打东吴,大军在长江赤壁驻扎,军船连成一片。
眼看就要灭了东吴,统一天下,曹操大悦,于是大宴众文武。在酒席间,曹操诗性大发,不觉吟道:“喝酒唱歌,人生真爽…”。
众文武齐呼:”丞相好诗!“于是命印刷工匠刻版印刷,以便流传天下。
版样给曹操一看,曹操感觉不妥,说道”喝与唱,此话过俗,应改为‘对酒当歌’较好!“,于是命工匠重新雕刻。
那时候,还没发明活字印刷术,如果样板要改,只能重头雕刻。工匠眼看连夜刻版之工,彻底白费,心中叫苦不迭。只得照办。
版样再次出来请曹操过目,曹操细细一品,觉得还是不好,说”人生真爽太过直接,应该改问语才够意境,因此应改为‘对酒当歌,人生几何?’“,于是…
在活字印刷术还没出现之前,如果版样有改动,只能重新雕刻。
而且在印刷完成后,这个样板就失去了它的价值,如果需要其他样板只能重新雕刻。
而活字印刷术的出现就大大改善了印刷技术。如上例”喝酒唱歌,人生真爽“,如果用活字印刷,只需要改四个字就可,其余工作都未白做。岂不快哉!!
活字印刷也反应了OOP。
当要改动时,只需要改要改的地方,此为 可维护;
当这些字用完后,并非就完全没有价值了,它完全可以在后来的印刷中重复使用,此乃 可复用;
次诗若要加字,只需另刻字加入即可,这就是 可扩展;
字的排列可以横排,也可以竖排,此是 灵活性好。
现在我想你对面向对象应该有大致的了解了,那我们接着说面向对象的三个特征
二. 封装(private)
什么是封装?
封装是将类的某些信息隐藏在类的内部,不允许外部程序直接访问,
而是通过该类提供的方法来实现对隐藏信息的操作和访问.
简单的来说就是 合理隐藏,合理暴露
那该怎么封装呢?
这时就需要使用到一个java关键字 private(翻译过来就是私有的),来修饰我们需要封装的属性,方法
什么是java关键字呢?
关键字也称为保留字,是指java语言中规定了 特定含义的标示符。对于保留字,用户只能按照系统规定的方式使用,不能自行定义。
public class PrivateTest {
// 封装也就是将属性私有化,同时为每个属性创建取值getter和赋值setter方法
private String name;
private int age;
public PrivateTest() {
}
public PrivateTest(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Demo01 {
public static void main(String[] args) {
PrivateTest privateTest = new PrivateTest();
//privateTest.name;//'name' has private access in 'PrivateTest' 翻译过来就是访问权限是私有的
/*这时我们需要通过 PrivateTest类中的get和set方法来操作类中的属性*/
privateTest.setName("张三"); //设置属性
System.out.println(privateTest.getName()); //获取属性
privateTest.setAge(21); //设置属性
System.out.println(privateTest.getAge()); //获取属性
}
}
那么问题又来了,我们为什么要使用封装?这样看起来繁琐,直接操作属性不是更加的方便快捷吗?
我们为什么要使用封装?
可以提高类中属性的安全性,不让外部程序随意修改调用(只能通过规定的方法访问数据),并且对所赋予的值加以判断.
封装的好处有哪些?
- 提高安全性
- 提高复用性
- 隐藏了实现细节
- 方便加入控制语句
- 方便修改实现
二. 继承(extends)
什么是继承?
子类继承父类所拥有的属性和方法(私有方法除外)
继承的好处?
代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性(子类也可以有自己的方法和属性,这样使得子类的功能更加的强大)
提高代码的复用性
提高代码的扩展性
使类与类之间有了关系(多态的前提)
继承的缺点?
增强了耦合性(当父类的常量,变量,方法被修改时,需要考虑子类的修改,导致大量代码被重构)
继承是入侵性的(只要继承,就必须拥有父类的所有属性和方法)
降低了代码的灵活性
三. 多态
什么是多态?
父类的引用指向子类对象
接口的多种不同实现方式即为多态
多态的作用?
提高复用性,(应用程序不必为每个派生类编写功能调用,只需要对抽象基类进行处理即可)
提高维护性(向下兼容)
提高扩展性(增加新的子类不影响已存在类的多态性,继承性,以及其他特性的运行和操作)
消除类型之间的耦合关系
简化代码
派生类的功能可以被基类的方法或引用调用,这是向下兼容,可以提高扩充性和可维护性(多态的真正作用)
多态可以用在什么地方?
可以用在方法参数中和方法的返回类型中
多态的前提?
要有实现或继承
要有重写
父类的引用指向子类对象