7.javase-面向对象

发布时间:2026/10/6 18:54:36

7.javase-面向对象 面向过程和面向对象的区别面向过程主要关注的是实现的具体的过程因果关系优点对于业务逻辑比较简单的程序可以达到快速开发前期投入成本较低缺点采用面向过程的方式开发很难解决非常复杂的业务逻辑而且也很难关注到每个点的细节软件耦合度高软件拓展力差组件代码复用性差面向对象主要关注的是对象【独立体】的能完成那些功能。优点耦合度低扩展力强。组件复用性强缺点前期投入成本高需要进行独立抽象大量的系统分析和设计。面向对象的三个生命周期OOA - 面向对象分析OOD - 面向对象设计OOP - 面向对象编程类与对象要想使用OOP一定要清楚对象的三个主要特性:对象的行为(behavior): 可以对对象施加哪些操作或可以对对象施加哪些方法?对象的状态(state): 当施加那些方法时对象如何响应?对象标识(identity)如何辨别具有相同行为与状态的不同对象?对象的状态改变不是自发的必须通过调用方法来改变。如果是自发改变只能说明封装遭到了破坏。作为一个类的实例每个对象的标识永远是不同的状态常常也存在着差异。类的定义类是对一个集合的抽象、是对事物分析结构后抽象出来的模板。现实世界中事物A和事物B之间具有共同的特征进行抽象总结出的一个模板这个模板被称为类。语法结构[修饰符列表] class 类名{ //属性(对事物状态信息的抽象) 属性的类型为java所有的数据类型 [属性修饰符] 数据类型 变量名; //这里也可以直接赋值初始化 //方法 [属性修饰符] 返回值类型 方法名(参数列表){ //方法体 } }java中所有的类都是引用类型识别类的简单规则是在分析问题的过程中寻找名词而方法对应着动词。例如在订单处理系统中有这样一些名词:商品(Item)订单(Order)送货地址(Shipping address )付款(Payment)账户(Account)这些名词很可能成为类Item、Order等。接下来查看动词:商品被添加到订单中订单被发送或取消订单货款被支付。对于每一个动词如:“添加”、“发送”、“取消”以及“支付”都要标识出主要负责完成相应动作的对象。例如当一个新的商品添加到订单中时那个订单对象就是被指定的对象因为它知道如何存储商品以及如何对商品进行排序。也就是说add应该是Order类的一个方法而Item对象是一个参数。对象对象是实际存在的个体是从类中创建出来的实例。类与对象的关系类-----实例化------对象对象又被称类的为实例instance对象—抽象----类类描述的是对象的共同特征这些特征包括类的状态—对事物**状态信息(啥样子)的抽象—类的属性类的动作信息—对事物能力能干啥**的抽象 —一个类的方法不同对象对应的状态的数值和动作的结果是可能不一样的对象的创建和使用静态变量可以通过类直接访问, 用static 修饰存储在方法区内存当中。实例变量成员变量、域不能通过类直接访问的类的变量不创建对象这个实例变量在JVM中堆内存中不会在内存中分配区域。如果没有手动赋值系统赋默认值。数据类型 默认值--------------------------------------------byte,short,int,long0double,float0.0booleanfalsechar\u0000 引用数据类型null(空值)对象的创建一个类可以实例化N个对象实例化是通过new关键字去创建的,语法为:引用数据类型 变量名new方法名(实参数列表...);//这里的这个变量名 称之为对象的引用所以叫做对象引用变量。 方法名成和类名一致。方法区: 字节码文件class文件在类加载时候将其放在内存的方法区当中只存一份栈区方法代码执行的时候会给该方法分配内存空间在栈空间压栈。主要用来存储方法的局部变量。堆区new对象在堆内存中存储。new操作符的返回值也是一个引用。下列语句:Date deadline new Date();有两个部分。表达式new Date()构造了一个Date类型的对象并且它的值是对新创建对象的引用这个引用存储在变量deadline中。局部变量不会自动地初始化为null而必须通过调用new或将它们设置为null进行初始化。代码内存分析1TestObj1.java里的代码publicclassTestObj1{publicstaticvoidmain(String[]args){inti10;//i 局部变量//这里 s 是局部变量StudentsnewStudent();s.noi;//再次创建变量StudentstunewStudent();System.out.println(s.no);System.out.println(stu.no);}}Student.java里的代码publicclassStudent{intno;intage;booleansex;Stringaddr;}内存分析图总结对象的实质是通过new运算符在堆内存中开辟的内存空间这块内存空间的地址逻辑地址赋给一个变量这个变量称之为引用变量。类的成员变量实例变量随着类被实例化后在堆内存中对应的实例对象中存储。每个new出来的对象对应内存中的一份内存。java语言中没有指针程序员不能直接操作堆内存。程序员只能通过“引用”去访问堆内存当中的实例的变量。访问变量格式去读数据对象引用变量.对象变量名 修改数据对象引用变量.对象变量名 值;代码内存分析2TestObj2.java里的代码publicclassTestObj2{publicstaticvoidmain(String[]args){//定义一个局部变量u数据类型为User的引用。UserunewUser();System.out.println(u.no);System.out.println(u.name);System.out.println(u.addr);u.no110;// jack是一个String对象u指向的对象(new出来的User的对象)的属性name中存储的是jack的内存地址也就是说这个对象的name属性也是个引用u.namejack;u.addrnewAddress();System.out.println(u.name居住在哪个城市u.addr.city);System.out.println(u.name居住在哪个街道u.addr.street);System.out.println(u.name邮编是u.addr.zipcode);u.addr.city北京;u.addr.street朝阳街道区;u.addr.zipcode11111111;System.out.println(u.name居住在哪个城市u.addr.city);System.out.println(u.name居住在哪个街道u.addr.street);System.out.println(u.name邮编是u.addr.zipcode);Addressau.addr;a.city西安;System.out.println(u.addr.city);System.out.println(a.city);}}classUser{//类的属性的类型可以为java的所有数据类型intno;//String 是一个对象引用类型Stringname;//这里表示这个User类的属性name是一个String的引用。//addr 是一个Address对象的引用类型Addressaddr;//这里表示这个User类的属性addr是一个Address的引用类型}classAddress{Stringcity;Stringstreet;Stringzipcode;}内存分析图JVM内存总结:jvm主要包括三块内存空间分别为堆空间栈空间方法区。堆和方法区空间都各存在一份而栈空间是一个线程一个栈空间。当方法调用的时候该方法所需要的空间在栈空间内存中分配称为压栈。方法执行结束之后该方法所属的内存空间释放称之为弹栈。在栈空间主要存储方法的局部变量。当程序开始运行时方法的代码片段以及整个类代码片段都会存储到方法区当中在类加载的时候这些代码片段会载入。在程序执行的过程中使用new运算符创建的对象会存储在堆内存中主要存储的是对象的实例变量。类的静态变量存储在方法区当中。当堆内存中java对象没有更多的引用指向它或者此对象无法访问时会被垃圾回收器回收。空指针异常空引用访问“实例”相关的数据时候会发生空指针异常publicclassTestObj3{publicstaticvoidmain(String[]args){UserunewUser();System.out.println(u.no);//0unull;//会抛出异常: java.lang.NullPointerException//空引用访问“实例”先关的数据时候会发生空指针异常System.out.println(u.no);//0}}总结:对象使用new运算符在堆内存中开辟的内存空间。引用是一个变量保存了指向堆内存中的对象的内存地址。创建一个对象没有用变量接受称之为匿名对象。如new Test().add()。匿名对象只能使用一次使用完后立即被销毁。构造方法构造方法/构造器/Constructor构造方法语法结构[修饰符列表]构造方法名(形式参数列表){//方法体}使用细节构造方法没有返回值。构造方法名称和类名必须保持一致。当我们在类中没有写构造器使这种情况下,编译器在编译的时候会默认加上一个无参且方法体为空的构造方法。但是,如果类的构造函数被重写了(类中有有参构造方法), 这时编译器就不会再给它默认加上一个无参且方法体为空的构造函数.可以理解为无参的构造方法被覆盖了。如果类中提供了至少一个构造器但是没有提供无参数的构造器则在构造对象时如果没有提供参数就会被视为不合法。new无参构造器创建对象会报错。建议开发中手动为当前类创建无参构造方法因为无参构造方法太常用了。构造方法不能被static、final、synchronized、abstract和native修饰构造方法支持重载机制。使用this(形参)可以调用其他构造方法必须放在构造方法第一行。构造方法的作用初始化实例变量的内存空间给实例变量赋值。publicclassAccount{//账号privateStringaccount;//余额privatedoublebalance;publicAccount(){//无参构造方法初始化实质//account null;//balance 0.0;}publicAccount(Stringaccount){this.accountaccount;}publicAccount(Stringaccount,doublebalance){this.accountaccount;this.balancebalance;}}在执行构造器之前先执行赋值操作。当一个类的所有构造器都希望把相同的值赋予某个特定的实例域时这种方式特别有用。初始化实例域时初始值不一定是常量值也有可能是一个代码块方法。this关键字this可以翻译为“当前对象”其实代表当前正在执行这个行为/动作的对象。this的内存分析this是一个引用是一个变量this变量中保存了内存地址指向了自身对象this 存储在JVM堆内存对象内部。每一个对象的内存中都有this且不相同。为什么要使用this变量在代码运行时候当某个对象执行某个实例方法(执行动作)过程中想访问当前对象一些属性或别的实例方法。我们一般采用的方式引用.xxx。但是这个引用在不同对象访问这个实例方法必须代表对应的对象(比如多态)new 出来的对象无法满足。 所以this关键字诞生了。所以this代表当前正在执行这个行为/动作的对象。在每一个方法中使用this关键字接受隐式参数。this 是可以省略的, 什么时候不能省略用来区分局部变量和实例变量的时候“this.”不能省略。this可以用在哪里可以使用在实例方法当中代表当前对象【语法格式this.】可以使用在构造方法当中通过当前的构造方法调用其他构造方法【语法格式this(实参)】this()只能出现在构造函数第一行。publicclassThisTest2{publicstaticvoidmain(String[]args){ThisTest2.doSome();ThisTest2t2newThisTest2();t2.doSome();t2null;//带有static的方法其实既可以采用类名方式访问也可采用引用方式访问。但是即使采用引用方式的访问实际上执行的时候//和引用指向的对象无关。t2.doSome();//这里不会出现空指针异常。}publicstaticvoiddoSome(){System.out.println(do some);}}
延伸阅读

更多相关文章

2026/10/6 18:54:36

高斯泼溅复刻现实:像照片,还不够

把一间真实房间拍下来,再在屏幕里转过同一扇门,看见墙面的纹理、桌角的磨损和窗边的光,3D高斯泼溅确实能带来很强的临场感。问题常出现在演示结束以后:镜头能不能走到桌子背后?门口的重影能不能消掉?放进头…

2026/10/6 18:49:35

Apache Mesos 的 CMake 构建配置选项全解析

集群管理任务调度后端 【免费下载链接】mesos Apache Mesos 项目地址: https://gitcode.com/gh_mirrors/mesos1/mesos 点击查看 免费下载 Apache Mesos 官方同时维护 Autotools 与 CMake 两套构建系统,其中 CMake 构建具有更清晰的依赖图、更强的跨平台…

2026/10/6 19:54:39

企业级西服定制管理系统:SpringBoot+Vue+MyBatis+MySQL全栈解析

企业级私人西服定制管理系统这个方向,关注的人其实比想象中多。一方面是定制行业本身在升级,门店老板想把手里的客户、量体、面料、订单管明白;另一方面是这套技术栈太经典了——SpringBoot Vue MyBatis MySQL,几乎是国内全栈开…

2026/10/6 19:54:39

运放偏置电压与偏置电流:原理、影响与工程补偿

先从一个我前阵子调试的小问题说起。一个简单的同相放大电路,理论上增益应该做到101倍,输入给的是纯直流信号,结果实测输出总是比理论值高出来好几毫伏,怎么算都对不上。换了个运放,数值变了,方向有时甚至反…

2026/10/6 19:54:39

SpringBoot固定资产管理系统实战:数据模型、折旧计算与避坑指南

简介:本资源为基于SpringBoot的固定资产管理系统毕业设计全套资料,面向计算机相关专业需要完成课程设计或毕业论文的本科生,以及希望学习企业级Java Web开发实践的开发者。系统围绕资产分类、资产审批、个人资产与用户管理等核心业务展开&…

2026/10/6 19:54:39

OpenShell实战:用模块化与插件机制打造高效可迁移的Shell环境

1. 项目定位:OpenShell到底解决了什么问题先说结论:OpenShell是一个轻量级的Shell环境配置管理框架,定位介于“开箱即用的终端增强工具”和“完全手工管理的裸Shell”之间。如果你每天要花大量时间在终端上操作,又受够了反复修改.…

2026/10/6 19:54:39

AngularJS双向绑定与ng-include实战:老项目维护指南

AngularJS 这名字现在提起来,很多人第一反应是“古董”。但你要是去翻那些 2015 到 2018 年间上线的后台管理系统、企业内部工具、老牌电商站点,AngularJS(特指 AngularJS 1.x)的身影依然随处可见。这两年我还接过好几个维护老项目…

2026/10/6 19:49:39

PHP heredoc语法错误全解析:从报错定位到版本差异与避坑实践

做PHP开发这些年,一提到heredoc,我脑子里第一反应不是方便,而是那条让人头大的“Parse error: syntax error”。尤其项目里用到heredoc字符串、邮件模板、批量SQL拼接时,代码动不动就报语法错误,很多时候明明看着缩进都…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/6 4:01:51

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 0:03:23

MR25H40CDF+STM32F031C6工业级高可靠数据存储方案

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的 PLC 控制柜里、在风电变流器的散热片背面、在矿井监测终端的金属外壳下,你经常能看到一块指甲盖大小的黑色芯片——它既不是 Flash,也不是…

2026/10/6 0:03:23

MRAM+STM32工业断电数据保全实战指南

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的PLC柜里、在野外无人值守的环境监测终端里、在高速运转的包装机控制板上,你经常能看到一块指甲盖大小的黑色芯片,旁边贴着“MR25H40CDF”丝…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑