java学习07

本文详细介绍了面向对象编程与面向过程编程的区别,强调面向对象编程的三大特性——封装、继承和多态。通过蛋炒饭与盖饭的比喻,生动解释了两者在扩展性和耦合度上的差异。面向对象编程更符合人类思维,适合大型项目开发,而面向过程编程则适用于小型项目,具有快速开发的优点。文章还探讨了类与对象的概念,以及实例化、抽象、构造方法等核心概念,并提及了垃圾回收机制和参数传递方式。
摘要由CSDN通过智能技术生成

面向对象

面向过程和面向对象有什么区别?

从语言方面出发:
对于C语言来说,是完全面向过程的。
对于C++语言来说,是一半面向过程,一半是面向对象。(C++是半面向对象的)
对于Java语言来说,是完全面向对象的。

什么是面向过程的开发方式?
面向过程的开发方式主要的特点是:
注重步骤,注重的是实现这个功能的步骤。
第一步干什么
第二步干什么

另外面向过程也注重实现功能的因果关系。
因为A所有B
因为B所以C
因为C所以D

面向过程中没有对象的概念。只是实现这个功能的步骤以及因果关系。

面向过程有什么缺点?(耦合度高,扩展力差。)
面向过程最主要是每一步与每一步的因果关系,其中A步骤因果关系到B
步骤,A和B联合起来形成一个子模块,子模块和子模块之间又因为因果
关系结合在一起,假设其中任何一个因果关系出现问题(错误),此时
整个系统的运转都会出现问题。(代码和代码之间的耦合度太高,扩展力
太差。)
螺栓螺母拧在一起:耦合度高吗?
这是耦合度低的,因为螺栓螺母可以再拧开。(它们之间是有接口的。)
螺栓螺母拧在一起之后,再用焊条焊接在一起,耦合度高吗?
这个耦合度就很高了。耦合度就是黏连程度。
往往耦合度高的扩展力就差。

耦合度高导致扩展力差。(集成显卡:计算机显卡不是独立的,是集成到主板上的)
耦合度低导致扩展力强。(灯泡和灯口关系,螺栓螺母关系)

采用面向过程的方式开发一台计算机会是怎样?
这台计算机将没有任何一个部件,所有的都是融合在一起的。
你的这台计算机是一个实心的,没有部件的。一体机。
假设这台一体机的任何一个“部位”出问题,整个计算机就不能用了,
必须扔掉了。(没有对象的概念。)

采用面向对象的方式开发一台计算机会是怎样?
内存条是一个对象
主板是一个对象
CPU是一个对象
硬盘是一个对象
然后这些对象组装在一起,形成一台计算机。
假设其中CPU坏了,我们可以将CPU拆下来,换一个新的。

面向过程有什么优点?(快速开发)
对于小型项目(功能),采用面向过程的方式进行开发,效率较高。
不需要前期进行对象的提取,模型的建立,采用面向过程
方式可以直接开始干活。一上来直接写代码,编写因果关系。
从而实现功能。

什么是面向对象的开发方式?
采用面向对象的方式进行开发,更符合人类的思维方式。(面向对象成为主流的原因)
人类就是以“对象”的方式去认识世界的。
所以面向对象更容易让我们接受。

面向对象就是将现实世界分割成不同的单元,然后每一个单元
都实现成对象,然后给一个环境驱动一下,让各个对象之间协
作起来形成一个系统。

对象“张三”
对象“香烟”
对象“打火机”
对象“吸烟的场所”
然后将以上的4个对象组合在一起,就可以模拟一个人的抽烟场景。
其中“张三”对象可以更换为“李四”
其中“香烟”也可以更换品牌。
其中“打火机”也可以更换。
其中“吸烟的场所”也可以更换。

采用面向对象的方式进行开发:
耦合度低,扩展力强。

找一个合适的案例。说明一下面向对象和面向过程的区别?
蛋炒饭:
鸡蛋和米饭完全混合在一起。没有独立对象的概念。
假设客户提出新需求:我只想吃蛋炒饭中的米饭,怎么办?
客户提出需求,软件开发者必须满足这个需求,于是
开始扩展,这个软件的扩展是一场噩梦。(很难扩展,耦合度太高了。)

盖饭:
老板,来一份:鱼香肉丝盖饭
鱼香肉丝是一道菜,可以看成一个独立的对象。
米饭可以看成一个独立的对象。
两个对象准备好之后,只要有一个动作,叫做:“盖”
这样两个对象就组合在一起了。

假设客户提出新需求:我不想吃鱼香肉丝盖饭,想吃西红柿鸡蛋盖饭。
这个扩展就很轻松了。直接把“鱼香肉丝”对象换成“西红柿鸡蛋”对象。

面向过程主要关注的是:实现步骤以及整个过程。
面向对象主要关注的是:对象A,对象B,对象C,然后对象ABC组合,或者CBA组合…

当我们采用面向对象的方式贯穿整个系统的话,涉及到三个术语:
OOA:面向对象分析(Object-Oriented Analysis)
OOD:面向对象设计(Object-Oriented Design)
OOP:面向对象编程(Object-Oriented Programming)
整个软件开发的过程,都是采用OO进行贯穿的。

实现一个软件的过程:
分析(A) --> 设计(D) --> 编程§

leader 领导/经理/组长
team 团队
PM 项目经理(整个项目的监管人)Project Manager

面向对象包括三大特征
封装(Encapsulation)
继承 (Inheritance)
多态 (Polymorphism)

任何一个面向对象的编程语言都包括这三个特征
例如:
python也有封装 继承 多态。
java也有封装 继承 多态。

注意:java只是面向对象编程语言中的一种。
除了java之外,还有其它很多很多的编程语言也是面向对象的。

类和对象的概念

面向对象当中最主要“一词”是:对象。

什么是类?
类实际上在现实世界当中是不存在的,是一个抽象的概念。是一个模板。是我们人类大脑进行“思考、总结、抽象”的一个结果。(主要是因为人类的大脑不一般才有了类的概念。)

类本质上是现实世界当中某些事物具有共同特征,将这些共同特征提取出来形成的概念就是一个“类”,“类”就是一个模板。

明星是一个类

什么是对象?
对象是实际存在的个体。(真实存在的个体)

宋小宝就是一个对象
姚明就是一个对象
刘德华就是一个对象

宋小宝、姚明、刘德华这3个对象都属于“明星”这个类。

在java语言中,要想得到“对象”,必须先定义“类”,“对象”是通过“类”这个模板创造出来的。
类就是一个模板:类中描述的是所有对象的“共同特征信息”
对象就是通过类创建出的个体。

类:不存在的,人类大脑思考总结一个模板(这个模板当中描述了共同特征。)
对象:实际存在的个体。
实例:对象还有另一个名字叫做实例。
实例化:通过类这个模板创建对象的过程,叫做:实例化。
抽象:多个对象具有共同特征,进行思考总结抽取共同特征的过程。

类 --【实例化】–> 对象(实例)
对象 --【抽象】–> 类

类是一个模板,是描述共同特征的一个模板,那么共同特征包括什么呢?

潘长江对象:
名字:潘长江
身高:165cm
打篮球:非专业的
学习:考试80分

姚明对象:
名字:姚明
身高:240cm
打篮球:NBA专业球员,打篮球非常棒
学习:考试100分

共同特征包括哪些?
名字、身高都属于名词(状态特征)
打篮球、学习都属于动词(动作特征)

类 = 属性 + 方法
属性来源于:状态
方法来源于:动作

public class 明星类{
//属性–>状态,多见于名词
名字属性;
身高属性;

//方法–>动作,多见于动词
打篮球方法(){

}
学习方法(){

}
}

定义一个学生类(Student)
public class Student {
// 属性
// 姓名
// 性别
// 身高
// 方法
public … sing(){

}public … dance(){

}
public … study(){

}

}

为什么要做软件开发?
解决现实生活当中的问题。

软件开发既然是为了解决现实世界当中的问题,那么首先
java软件必须能够模拟现实世界。

其实软件是一个虚拟的世界。
这个虚拟的世界需要和现实世界一一对应,这才叫模拟。

类的定义
怎么定义一个类,语法格式是什么?
[修饰符列表] class 类名 {
//类体 = 属性 + 方法
// 属性在代码上以“变量”的形式存在(描述状态)
// 方法描述动作/行为
}
注意:修饰符列表可以省略。

为什么属性是“以”变量的形式存在的?
假设要描述一个学生:
学生包括哪些属性:
学号: 110
姓名:“张三”
性别:‘男’ (true/false)
住址:“深圳宝安区”
答案:是因为属性对应的是“数据”,数据在程序中只能放到变量中。
结论:属性其实就是变量。

变量根据出现位置进行划分:
方法体当中声明的变量:局部变量。
方法体外声明的变量:成员变量。(成员变量就是“属性”)
成员变量没有赋值时,系统默认赋值,赋的值都是默认值。
null是一个java关键字,全部小写,表示空,是引用类型的默认值。

观察“学生对象1”和“学生对象2”的共同特征,然后再利用java语言
将该“学生类”表述/表达出来。(这里只表达属性,不表达方法.)

编译的过程
按说应该先编译XueSheng.java,然后再编译XueShengTest.java
但是对于编译器来说,编译XueShengTest.java文件的时候,会自动
找XueSheng.class,如果没有,会自动编译XueSheng.java文件,生成
XueSheng.class文件。
第一种方式:
javac XueSheng.java
javac XueShengTest.java
第二种方式:
javac XueShengTest.java
第三种方式:
javac *.java

在语法级别上是怎么完成对象创建
类名 变量名 = new 类名();
这样就完成了对象的创建。
java中所有的“类”都属于引用数据类型。

什么是实例变量?
对象又被称为实例。
实例变量实际上就是:对象级别的变量。
public class 明星类{
double height;
}
身高这个属性所有的明星对象都有,但是每一个对象都有“自己的身高值”。
假设创建10个明星对象,height变量应该有10份。
所以这种变量被称为对象级别的变量。属于实例变量。

实例变量在访问的时候,必须先创建对象。
不能直接通过“类名”直接访问“实例变量”。

对象和引用的区别?
对象是通过new出来的,在堆内存中存储。
引用:是变量,并且该变量中保存了内存地址指向了堆内存当中的对象。

访问实例变量
语法:引用.实例变量名
可以通过"="赋值的方法将内存中实例变量的名字修改。

画内存图注意事项:
第一:在内存图上不要体现出代码。内存上应该主要体现“数据”。
第二:画图的时候,图上的图形应该有先后顺序,先画什么,再
画什么,必须是有顺序的,而不是想起来这个画这个,想起来那个画那个。
程序代码是有执行顺序的,程序执行到哪里你就画哪里就行了。

为什么要画内存图(非常重要)?
第一:有了内存图,程序不运行,也知道结果。(可以推算出结果)
第二:有了内存图,有助于调试程序。
画内存图是对Java运行机制的一种理解。不知道运行机制,以后复杂的
程序出现错误之后不会调试的,调不明白。

程序在什么情况下会出现空指针异常呢?
“空引用” 访问 "对象相关"的数据时,会出现空指针异常。

关于垃圾回收器GC
在java语言中,垃圾回收器主要针对的是堆内存。
在Java对象没有任何引用指向该对象的时候,GC会考虑将该垃圾数据释放回收掉。

方法在调用的时候参数是如何传递的?
实际上,在java语言中,方法调用时参数传递,和类型无关,都是将变量中保存的那个“值”传过去,这个“值”可能是一个数字100,也可能是一个java对象的内存地址:0x1234
不管是哪一种数据类型的传递,都是将“变量中保存的那个值复制一份传递过去。

构造方法(Constructor)
构造方法是一个比较特殊的方法,通过构造方法可以完成对象的创建,以及实例变量的初始化。换句话说:构造方法是用来创建对象,并且同时给对象的属性赋值。
当一个类没有提供任何构造方法,但是系统实际上会自动提供一个无参数的构造方法。这个方法被称为缺省构造器。
使用new运算符来调用构造方法。
new  构造方法名(实际参数列表);
构造方法的语法结构
  [修饰符列表] 构造方法名(形式参数列表){
  构造方法体;
}
注意:
修饰符列表目前统一写:public。不要写public static。
构造方法名和类名必须一致
构造方法不需要指定返回值,也不能写void,写上void表示普通方法,就不是构造方法了。
通常在构造方法体中给属性赋值,完成属性的初始化,实例变量是在构造方法执行的过程中完成初始化(赋值)。

当一个类中没有提供任何构造方法,系统默认提供一个无参数的构造方法。建议将无参数的构造方法手动写出来。无参数构造方法体中虽然什么都没写,但是实际上是在这个方法体里面进行的实例变量的初始化。

public class ConstructorTest01{
	int a;
	public ConstructorTest01(){
		//这里实际上有"a = 0;"这行代码,我们看不见。
	}
}

当一个类中手动提供了构造方法,那么系统将不再提供无参数构造方法。
对于实例变量来说,只要没有在构造方法中手动赋值,统一都会默认赋系统值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值