文章目录
从小就听说, 面向对象具有三大特征: 封装,继承和多态,现在18岁了, 还是不甚了解, 希望回到这18年的记忆中, 让回忆来告诉你答案
封装(Encapsulation)
首先, 作为三特征之一的封装, 我们需要问自己的记忆几个问题, (模仿郝斌老师)
- 什么是封装
- 为什么需要封装
- 如何封装
(What)什么是封装?
封装, 就是字面意思, 没什么别的意思, 把一个对象封装起来, 使其内部的细节隐藏, 比如我们吃饭的家伙–键盘
(Why)为什么需要封装?
面向对象设计的初衷, 是就是对客观世界对象的模拟
, 那么为了更好的维护和使用我们所创造的对象, 将对象内部的细节进行隐藏
就是一种较好的选择, 也就是封装, 当然这种封装也只是适当封装, 比如我们的键盘只要用用力也是可以扣下来清洗的或者拆开更换内部零件.
(How)如何封装?
- 对于对象内部的成员变量使用
private
关键字修饰 - 提供该成员变量对应的get, set方法, 便于必要时进行修改
下面举例来论证, 封装与不封装的效果差异:
假设你要去找机器人Tony老师剪头发, 但是剪多少厘米这种事情, 被别人随便修改了, 就会造成难以见人的后果
class Tony {
int cutLength;
}
public class HairCut {
public static void main(String[] args) {
Tony teacherTony = new Tony();
teacherTony.cutLength = 1;
System.out.println("Tony老师将剪去你" + teacherTony.cutLength + "厘米的头发!");
teacherTony.cutLength = 7;
System.out.println("Tony老师将剪去你" + teacherTony.cutLength + "厘米的头发!!!!!");
System.out.println("恭喜, 你凸兀了!!!");
}
}
但是经过封装之后, 我们就可以对Tony老师这个对象进行适当的控制
class Tony {
private int cutLength;
public int getCutLength() {
return cutLength;
}
public void setCutLength(int cutLength) {
if (cutLength > 0 && cutLength < 3) {
this.cutLength = cutLength;
} else {
System.out.println("差评, 退卡警告~~~~~");
}
}
}
public class HairCut {
public static void main(String[] args) {
Tony teacherTony = new Tony();
teacherTony.setCutLength(7);
System.out.println("Tony老师将剪去你" + teacherTony.getCutLength() + "厘米的头发!");
}
}
(Caution)封装需要注意什么
对象内部的get, set方法不可以使用static
修饰 (废话~~)
总结
适当的封装可以隐藏不必要的细节, 减少对象之间的耦合, 且并不影响修改.
继承(Inheritance)
为什么需要继承?
减少重复的程序代码
这里以<>中Animal
举例, 动物具有eat
的动作, 猫和狗同属于Animal
的范畴, 所以自然也拥有eat
的能力. 那么在设计对象的过程中, 我们可以用Animal
作为猫狗的共同父类, 所以可以称猫狗与动物是一种一般到特殊的关系, 在面向对象里翻译成继承
下面是代码举例
class Animal {
public void eat() {
}
public void sleep() {
}
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗狗偶类");
}
}
class Cat extends Animal{
@Override
public void eat() {
System.out.println("mimi");
}
}
注意的点
- java中只支持单继承, 但是java可以实现间接继承, 比如泰迪集成狗, 狗继承动物, 则泰迪也继承了动物的特征
- 父类中的构造方法和被
private
修饰的内容, 无法被继承(所以protect
欢迎您) - java中的类默认继承
Object
类中所有特征
多态(Polymorphism)
什么是多态?
同一行为具有多个不同表现形式或形态的能力
说人话就是, meizi穿JK就是妹子, 但是小伙子穿就是女装大佬, 比如以上面小狗的例子
class Animal {
public void eat() {
}
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗狗偶类");
}
}
class Cat extends Animal{
@Override
public void eat() {
System.out.println("mimi");
}
}
public class TestAnimal {
public static void main(String[] args) {
Animal cat = new Cat();
Animal dog = new Dog();
dog.eat();
cat.eat();
}
}
其中Animal cat = new Cat();
都是父类型引用指向了子类型对象,都属于向上转型(Upcasting),或者叫做自动类型转换
总结
多态的实现, 离不开继承, 方法覆盖, 父类型引用指向子类型对象这三个条件.