面向对象
对象有以下特点:
- 对象具有属性和行为。
- 对象具有变化的状态。
- 对象具有唯一性。
- 对象都是某个类别的实例。
- 一切皆为对象,真实世界中的所有事物都可以视为对象。
类
类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和方法两个主要部分。
对象
对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。
三大特性
封装、继承、多态。
封装
隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。
比如我们使用的手机就属于一种封装,你不用管手机是怎么制作的,你直接用就可以了,因为别人已经给你“封装”好了,我们可以拿来就用。在面向对象语言中的封装就是这种意思,你就属于那个手机组装员,将代码封装起来,然后“打包”起来,别人引入了这个包就直接使用你写好的代码方法就可以了,而不必管里面是怎么写的。
继承
继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的 功能,但不能选择性地继承父类。通过使用继承可以提高代码复用性。继承是多态的前提。
可以直接将继承理解为扩展,子类比父类多了更多功能。
- 用来提高代码的复用性
- 将相同的功能模块封装到方法中需要使用时调用方法达到代码复用的目的
- 通过继承将多个类中的相同的类容摘取出来,变成一个新类,让其他类和当前的新类产生关系,达到代码复用性的目的
这个可以从生物分类上来理解,生物从一个细胞一步步进化成现在的各种各样的生物,比如下图
生物一步步从父类中进行“继承”,然后能力越来越多。
比如我们的继承关系是:人类 < 动物类 < 原核生物类
比如玫瑰的继承关系是:玫瑰 < 植物类 < 原核生物类
动物类的生物都有原核生物的功能,但原核生物不一定都有动物类的功能;人类都有动物类所有的功能,但动物类不一定都有人类的功能。
继承就是这么一种关系概念,子类有父类的功能,但父类没有子类的功能。子类只能继承一个父类。
// 动物
public class Animal {
public void move(){
System.out.println("移动");
}
}
// 人
public class Person extends Animal {
public void study() {
System.out.println("学习");
}
}
// 狗
public class Dog extends Animal {
public void bite(){
System.out.println("撕咬");
}
}
多态
它是指在父类中定义的属性和方法被子类继承之后,同一个行为具有多个不同表现形式或形态的能力。
继承是多态的前提,要有多态就一定要进行继承。还是通过生物分类来理解:
原核生物类派生出了动物类、植物类,而动物和植物要想存活都必须通过“吃”来生存下去,而动物可以用嘴吃,而植物可以通过根茎进行营养吸收来“吃”,这种相同的行为所展现的多种不同的状态,这就称为多态。
示例代码详见下方 抽象 内容
接口
接口就是一个规范,是某个事物对外提供的一些功能的说明。我们还可以利用接口实现多态功能,一个类可以实现多个接口。
比如要求 U 盘有 USB 接口,如果没有实现这种类型的接口就无法插入电脑上 USB 插口进行连接。所以接口就是用来对功能进行限制,让实现的类要必须实现的接口中的方法。
// U 盘
public class USBDrive implements IUSB {
@Override
public void model() {
System.out.println("拥有USB接口");
}
}
interface IUSB {
// 输出接口型号
void model();
}
抽象
抽象就是把一个对象分析出各个属性,来替代表达的手法 。从众多的事物中抽取出共同的、本质性的特征。
就比如狗,猫,猪都会奔跑、吃饭、饥饿,那我们就抽象出来称为一个动物类。
抽象就一定不具体,就像“奔跑”这个词一样,这就是一个抽象的词,你不知道它是什么动作进行奔跑的,也许是双脚进行奔跑,也许是四条腿奔跑。总之它就是不具体。
就比如下方的简笔画蜗牛一样,它就是一个抽象的蜗牛,虽然蜗牛有几十几百种,但抽象出来他们都是“蜗牛”,我们用抽象的方式表现出来如下所示。
![]()
在代码中我们只用抽象的、简单的方式去把共同的功能提取出来,写成抽象方法,写到抽象类中就可以了。比如我们做个抽象的生物类,它有一个移动的方法,但我们知道,不同的动物移动的方式是不同的,猫狗用四肢走路,蛇向前爬行,鱼用游的方式,鸟用飞的方式移动等等,但所有继承自生物类的子类都有生物类的所有特点就是:都能移动。这也是它的多态性,同样的功能展现出不同的方式。示例代码如下:
// 生物类
public abstract class Biology {
/**
* 抽象方法 移动
*/
public abstract void move();
}
// 鱼
class Fish extends Biology {
@Override
public void move() {
System.out.println("游泳移动");
}
}
// 狗
class Dog extends Biology {
@Override
public void move() {
System.out.println("四肢移动");
}
}
// 蛇
class snake extends Biology {
@Override
public void move() {
System.out.println("爬行移动");
}
}
《面向对象的概念》有1条评论