面向对象编程的三大特征

在之前的博客中,我们介绍了什么是面向对象编程,面向对象和面向过程编程的区别,今天我们来探讨一下面向对象编程有什么特点。众所周知,面向对象有三大特征,分别是封装,继承和多态。下面我们来看一下这三大特征到底是什么。
1.封装
①为什么要封装?
比如我们要定义一个学生类

public class Student{
	int age;
	String name;
}

当我们new一个学生对象s,再对这个对象进行赋值操作时,s.age这个属性可以赋值任意值,比如负数。但是,我们知道,age属性描述的是学生这个对象年龄的属性,它是不可能为负数的,显然不符合常理。这时,我们便可以对这个类进行封装。
②什么是封装?
封装是面向对象编程的核心思想。将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想。
③封装有什么好处?
1.封装之后,对于那个事物来说,看不到这个事物比较复杂的那一面,只能看到该事物简单的那一面。复杂性封装,对外提供简单的操作入口。照相机就是一个很好的封装的案例,照相机的实现原理非常复杂,但是对于使用照相机的人来说,操作起来是非常方便的是非常便捷的。还有像电视机也是封装的,电视机内存实现非常复杂,但是对于使用者来说不需要关心内部的实现原理,只需要会操作遥控器就行。
2.封装之后才会形成真正的“对象”,真正的“独立体”
3.封装就意味着以后的程序可以重复使用。并且这个事物应该适应性比较强,在任何场合都可以使用。
4.封装之后,对于事物本身,提高了安全性。【安全级别高】
采用封装的思想保证了类内部数据结构的完整性,应用该类的用户不能轻易地直接操作此数据结构,只能执行类允许公开的数据。这样就避免了外部操作对内部数据的影响,提高了程序的可维护性。
④怎么进行封装?
1.所有属性私有化,使用private关键字进行修饰,private表示私有的,修饰的所有数据只能在本类中访问。
2.对外提供简单的操作入口,也就是说以后外部程序想要访问age属性,必须通过这些简单的入口进行访问:
对外提供两个公开的方法,分别是set方法和get方法
想修改age属性,调用set方法
想读取age属性,调用get方法
3.set方法的命名规范:

public void setAge(int a){
	age = a;
}

4.get方法命名规范:

public int getAge(){
	return age;
}

2.继承
①什么是继承?
在Java语言中,类不是独立存在的,类与类之间可以存在着一定的关系,继承就是类与类之间的关系的一种。
利用继承,人们可以基于已存在的类构造一个新类。继承已存在的类就是复用(继承)这些类的方法和域。在此基础上,还可以添加一些新的方法和域,以满足新的需求。
②继承有什么作用?
继承“基本”的作用是:代码复用。
但是继承最“重要”的作用是:有了继承之后才有了以后的“方法的覆盖”和“多态机制”。
③怎样进行继承?
继承的语法格式:
[修饰符列表] class 类名 extends 父类名{
类体 = 属性 + 方法
}
④关于继承中的一些术语:
B类继承A类,其中:
A类称为:父类、基类、超类、superclass
B类称为:子类、派生类、subclass
注意:
私有的不支持继承
构造方法不支持继承
其它数据都可以被继承
Java语言当中的继承只支持单继承,一个类不能同时继承很多类,只能继承一个类。在C++中支持多继承。
虽然Java语言当中只支持单继承,但是一个类也可以间接继承其它类。
继承的设计技巧:
1.将公共操作和域放在超类
2.不要使用受保护的域
3.使用继承实现”is-a“关系
4.除非所有继承的方法都有意义,否则不要使用继承
5.在覆盖方法时,不要改变预期的行为
6.使用多态,而非类型信息
7.不要过多地使用反射
3.多态
①什么是多态?

class Animal{
	void move(){
	}
}
class Cat extends Animal{
	void catchMouse(){
	}
}
class Bird extends Animal{
	void fly(){
	}
}

Animal、Cat、Bird三个类之间的关系:Cat继承Animal、Bird继承Animal,Cat和Bird之间没有任何继承关系
关于多态中涉及到的几个概念:
向上转型(upcasting)子类型–>父类型
又被称为自动类型转换
向下转型(downcasting)父类型–>子类型
又被称为强制类型转换
无论是向上转型还是向下转型,两种类型之间必须要有继承关系。
没有继承关系,程序是无法编译通过的。
下面我们看一段代码

Animal cat = new Cat();
cat.move();

new Cat()创建的对象类型是Cat,cat这个引用的数据类型是Animal,可见它们进行了类型转换,子类型转换成父类型,称为向上转型/upcasting,或者称为自动类型转换
Java中允许这种语法,父类型的引用指向子类型的对象
无论是Cat类有没有重写move方法,运行阶段一定调用的是Cat对象的move方法,因为底层真实对象就是Cat对象。
父类型的引用指向子类型的对象这种机制导致程序存在编译阶段绑定和运行阶段绑定两种不同的形态/状态,这种机制可以称为一种多态语法机制
面向对象编程的核心:定义好类,然后将类实例化为对象,给一个环境驱使一下,让各个对象之间协作起来形成一个系统。
②多态的作用是什么?
1.降低程序的耦合度,提高程序的扩展力。
2.能使用多态尽量使用多态。
3.父类型的引用指向子类型的对象。
下面我们看这样一段代码

Animal cat = new Cat();
cat.catchMouse();

这段代码是无法编译通过的,为什么呢?
因为在编译阶段编译器查到cat的类型是Animal类型,从Animal.class字节码文件当中查找catchMouse()方法,最终没有找到该方法,导致静态绑定失败,没有绑定成功,也就是说编译失败了,别谈运行了。
假设想让以上的对象执行catchMouse()方法,怎么办?cat是无法直接调用的,因为cat的类型是Animal,Animal中没有catchMouse()方法。我们可以将cat强制类型转换为Cat类型。
cat的类型是Animal(父类),转换成Cat类型(子类),被称为向下转型/downcasting/强制类型转换。
注:向下转型也需要两种类型之间必须有继承关系。不然编译报错。强制类型转换需要加强制类型转换符。
什么时候需要使用向下转型呢?
当调用的方法是子类型中特有的,在父类型当中不存在,必须进行向下转型。

发布了47 篇原创文章 · 获赞 102 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/MarcoAsensio/article/details/90049314