6.1 面向过程与面向对象
什么叫面向对象?
面向对象(Object-Oriented,简称OO)就是一种常见的程序结构设计方法。
面向对象思想的基础是将相关的数据和方法放在一起,组合成一种新的复合数据类型,然后使用新创建的复合数据类型作为项目的基础。
面向对象是一个很抽象的概念,它相对面向过程而言。
过程与对象都是一种解决问题的思想。
面向过程:强调的是功能行为,面向过程就是分析出实现需求所需要的步骤,通过函数一步一步实现这些步骤,接着依次调用即可,也就是一种过程,先干啥,再干啥;
面向对象:将功能封装到对象里,强调的是具备某功能的对象;面向对象是把整个需求按照特点、功能划分,将这些存在共性的部分封装成对象,创建了对象不是为了完成某一个步骤,而是描述某个事物在解决问题的步骤中的行为
按照面向对象的思想,可以把任何的东西看做对象!
面向过程和面向对象一定是互斥的吗?肯定不是
我们在处理问题时可以完全的面向过程 但是不能完全面向对象。举个例子来说:
你让女朋友做饭 你这个角度而言 面向对象
从女朋友这个角度而言呢?如果GF做 面向过程;如果GF不做 叫外卖 面向对象
从餐馆这个角度而言呢?应该是要做饭 面向过程;如果餐馆不做 可以叫别家餐馆做
.....别的餐馆都不做 这个饭始终没人做 相互踢皮球
从中可以看出什么 这个事最终要被处理-面向过程
所以 面向过程其实是最基本的思路 而面向对象是基于面向过程的思路
老板让王经理去招人
从老板的角度而言 面向对象 指挥老王
从老王的角度而言 这一整天
刷牙洗脸 穿衣下楼 吃早餐 上班坐交通工具//11路
去公司开始上班 面试应聘者 中午吃午饭 。。。。下班回家
如果从一整天这个跨度而言 面向过程
从这个例子中就可以表明一个问题
以前或者是今后我们所写的代码 宏观上而言 都是在面向过程
只不过在某一个时刻 某一行 我们会用到一些面向对象的东西
System.out.println("来了老弟~");
//系统过来.输出.在控制台输出(输出打印的内容)
Scanner scanner=new Scanner(System.in);
//把那个扫描控制台的那个人给我叫过来 这个人的名字就是scanner
int a=scanner.nextInt();
//你让这个人从控制台读入一个整数并且给了变量a
Random random=new Random();
//把那个负责生成随机数的人给我叫过来 这个人的名字是random
int a=random.nextInt();
//让这个人给我生成一个随机的整数 给变量a
6.2 对象与类
1、面向对象有什么样的好处呢?
可以仿真的模拟现实生活中的事物,可以实现更加复杂的业务逻辑
淘宝在买东西的时候 查看商品->付款->生成订单->物流信息
如何描述一个坐标呢?
在面向过程的思想里面
int x,y;
int[] point={1,2};
额外的 如果是一组坐标
int x1,y1,x2,y2,x3,y3....
int[][] points={{1,2},{3,4},{5,6}};
其次对于他们之间的操作
getDistance(p1,p2) 求两点间的距离
会发现 数据 和 操作 是分开的
弊端就是不方便统一管理
在面向对象的思想里面
p1=创建一个Point对象并且制定x=1,y=2
p2=创建一个Point对象并且指定x=3,y=4
p1.x p1.y
p1.getDistance(p2) 让p1自己去和p2之间计算距离
好处在于将数据和操作统一起来了
意味着将点拟人化 该事物的数据和操作就可以统一起来了
什么是对象?
但凡是真实存在的且具体的事物 都称之为对象
就是由某一个类所描述出来的具体的事物
一个打火机 一根烟 一个手机 一台电脑....
什么是类?
类(class)是Java 语言的最小编程单位,也是设计和实现Java 程序的基础,本部分将深入介绍类的相关知识。
类的概念
类是一组事物共有特征和功能的描述。类是对于一组事物的总体描述,是按照面向对象技术进行设计时最小的单位,也是组成项目的最基本的模块。类的概念是抽象的,类似于建筑设计中的图纸,是对于现实需要代表的具体内容的抽象。类只包含框架结构,而不包含具体的数据。所以类代表的是总体,而不代表某个特定的个体。
我的总结:类是抽象的,对象是具体的,实实在在的!
类的定义:
[修饰符] class 类名{
1~n个构造方法;
0~n个字段;
0~n个方法
}
定义类,其实就是定义类里面的对象
对象包含:
状态;(属性)
功能、行为;(方法)
通过类来描述对象;
状态--------成员变量;
功能、行为——方法;
class Person{
//属性
private String name;
private int age;
private int sal;
//方法
public void show(){
System.out.println("个人情况:"+name+age+sal);
}
}
注意:建议一个类一个.java文件 方便类管理
也就意味着当我们在创建一个类的时候 其实就是在自定义一个数据类型
对象就是由一个类所描述的内容从而产生的一个具体的事物
目前而言 但凡创建对象 用new关键字
格式:
类名/数据类型 变量名=new 类名();
如何访问对象中的成员呢 变量名.成员
6.3 对象的内存图解I
1.在堆内存中开辟一个空间并分配地址
2.按照类的描述,在该空间中定义成员变量 并且有默认初始化值
3.加载成员函数进入方法区(只加载一次)
4.对象创建完毕 将空间地址赋值给相应的变量
5.变量(p1/p2)调用成员变量
先通过该变量所存储的地址去堆空间中找
然后在该空间中找相应的成员变量
6.变量(p1/p2)调用成员函数
直接去方法区中找该成员函数
将该函数加载进栈内存开始运行
为了方便区分哪个对象调用的该成员函数
由this这个关键字段 来区分 this主要存的是当前对象的地址
注意:当成员函数在操作变量的时候
先在当前函数的空间里找 局部变量
如果没有找到,再去this所指向的堆内存中对象所属空间里去找
构造方法
构造方法:用来构造类的实例(每一个类都默认有一个无参的构造方法,得使用new调用)
字段:类或对象所包含的数据,对类状态的一种描述;
方法:类或对象的特征或行为
作用:
给类中的字段进行初始化,可以用来创建对象。
特点:
方法名与类名相同
不用定义返回值类型
不需要写return语句
我的总结:
注意:
默认构造方法的特点。
多个构造方法是以重载的形式存在的。
构造方法的重载:(需要哪个就去适配哪个,调用哪个)
this([实参]);调用当前类的构造方法
注意: this([实参]);必须放在构造器的第一行;
对象的产生格式:
类名称 对象名 = new 类名称();
因为有(),所以是方法,实际上它就是构造方法,并且是非私有的构造方法。
如:CellPhone cp = new CellPhone();
static关键字
特点:
随着类的加载而加载
优先于对象存在
被所有对象所共享
可以直接被类名调用
使用注意:
静态方法只能访问静态成员
但是非静态成员可以访问静态成员;
静态方法中不可以使用this,super关键字
主方法(main)是静态的(可以利用类名去调用静态的main方法,很正常!但是会陷入死循环,导致内存溢出,jvm自动停止!)
public static void main(String[] agrs){}
可修饰字段,方法。
用static 修饰的成员表示它属于这个类共有,而不是属于该类的单个实例。
static 修饰的字段 == 类字段
static 修饰的方法 == 类方法
没使用static修饰的字段和方法,成员属于类的单个实例,
不属于类。
没有static 修饰的字段 == 实例字段
没有static 修饰的方法 == 实例方法
类和实例访问字段和方法的语法:
访问类成员: 类.字段 类.方法
访问实例成员: 实例.字段 实例.方法
我的总结:
static 修饰的字段和方法,既可以通过类调用,也可以使用实例调用;
没static 修饰的字段和方法,只能使用实例来调用(建议使用:类名来调用; 其实在底层,对象调用类成员,也会转换类名调用)
static关键字不能与this,super同时连用!
匿名对象
一个没有名字的对象, 创建了一个对象出来,没有赋给一个变量;
特点:
对方法或字段只进行一次调用时;
可作为实际参数进行传递;
只在堆里面开辟存储区域,
只能使用一次, 使用完就被销毁了;
何时使用?只拿来用一次!!
new Person();表示匿名对象,没有名字的对象
new Person().age = 17;//使用一次之后就被销毁了
this关键字
特点:this表示当前对象。
当前对象 ←→ 当前正在调用实例成员的对象
换言之:谁调用了方法,谁就是当前对象。
什么时候使用this关键字呢?
方法间的相互调用;
this.字段;
构造器中相互调用,但是此时this([参数])必须写在构造方法第一行。
this不能用在static修饰的方法里和static修饰的代码块里;
g:构造方法中的this.name = name;
来源:CSDN
作者:weixin_44077638
链接:https://blog.csdn.net/weixin_44077638/article/details/104593656