`
lgx2351
  • 浏览: 175993 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

java知识总结之二:一切都是对象

阅读更多

尽管java是基于C++的,但是相比之下 ,java是一种更加“纯粹”的面向对象的语言。

c++与java都是混合/杂合型语言,但是,java中这种杂合性没有c++重要。杂合性语言允许多种编程风格。C++之所以是杂合性语言,因为他要支持C向后兼容,因为C++是C的一个超集,它会包含C不具备的特性,这使得C++显得过于复杂了。

而java是纯粹的面向对象的语言,在java设计之初就把思想转换到面向对象中来了,这使得java学习起来比C++更简单。在java里,一切都是对象。

 

 

一:用引用来操纵对象

每种语言都有自己的操纵内存中元素的方式。如C,C++就是通过指针来操纵对象。

所有的一切在java里都简化了,因为在java里一切都视为对象,因此可以用同一个固定的语法。java里一切都是对象,但操纵的标识符实际上是对象的一个“引用”(reference)。可以想象成遥控器(引用)与电视机(对象)的关系。只要有遥控器就可以建立与电视机的联系。当想换台或音量控制时,只要操作遥控器就行,如果你想在房间里走动,依然可以控制电视机,只需要携带遥控器就好了,而不是电视机。此外,如果没有电视机,遥控器依旧可以存在。但是,此时如果要向遥控器发送消息,因为引用没有指定到对象,那么就会报编绎错误。所以,我们在创建一个引用的同时一定要记得初始化。

在 java 里,如果是 null ,那么它的意思是说明引用没有指向对象 。比如程序中我们从前台传到 action 的元素的值,如果前台并没有这个元素,那么在 action 取得到的值就是 null 。

 

 

二:必须由你来创建所有对象

创建了一个引用,就希望它与一个对象关联。我们用new一个对象来实现。new的意思是”给我一个对象“。常常,我们new一个已存在现成类,也可以是自行创建的类。

对于对象的存储位置,首先我们要明白有什么存储区域,如下,有五个地方可以存储数据:

1)寄存器

这是最快的存储区,因为它位于处理器内部,这不同于其它的存储区。但它的数量有限,所以寄存器需要根据需求进行分配。

2)堆栈

它位于RAM(随机访问存储器)中,它是通过堆栈指针来移动。栈指针向下移动则分配新的内存,如果向上移动则释放那些内存。引用存储在栈里,而对象是存储在堆里。

3)堆

它是一种通用的内存池,也位于RAM中,它存放所有的java对象。堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆中存活多长时间。因此,在堆里分配存储有很大的灵活性。当需要一个对象时,只要程序里 new 一个对象,当执行这行代码时,会自动在堆里进行存储分配。当然,这也是要付出相应代价的:在堆里进行存储分配和清理可能比在堆栈里进行存储分配需要更多的时间。(这里假设java也可以像c++\c一样可以在堆栈里创建对象)

4)常量存储

常量直接存放在程序代码内部,这样是安全的,因为它永远不会被改变。

5)非RAM存储

数据完全存活于程序之外 ,不受程序的控制,在程序没有运行时也存在。 两个基本的例子就是:流对象和持久化对象。在流对象中,对象转化为字节流,通常被发送给另一台机器 。在”持久化对象“中,对象被存放在磁盘上。国此,即使程序终止,它们仍可以保持自己的状态。这种存储方式 的技巧:把对象转化成可以存储在其它媒价上的事件,在需要时,再恢复成基于RAM的对象。java提供了对国量级持久化的支持:如JDBC和Hibernate这样的机制就提供了复杂的对数据库的存储和读取对象信息的支持。

 

例外情况:基本类型

因为基本类型大小都固定了,如果对于它们也用new来把对象放在堆里往往不是很有效,基本类型是存在栈内存里的,而不是存储在堆内存里。

 

java中数组

几乎每种语言都支持数组。在C和C++中使用数组是很危险的,因为在C和C++中,数组就是内存快,如果在数组初始化前使用内存,或是访问了内存之外的数组,那就会产生很糟的后果。

这些问题在java中不会出现,因为java确定数组会被初始化,且必须在它的范围内访问。这种范围检查,是以每个数组上少量的内存开销及运行中的下标检查为代价的。但由此换来的安全性,这些代价是可以付出的。

在java里,当创建一个数组对象时,实质上是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值,该值拥有自己的关键字null。在java里一旦看到null,就知道这个引用没有指向某个对象。如果试图使用一个还为null的引用,那么就会报错。所以,在java里在使用任何引用时,都必须为引用指定对象。

 

 

三:永远不需要销毁对象:

在java里的对象不具备基本类型一样的生命周期。当用new一个对象时,这对象可以存放于作用域之外。

{
  String s = new String("sadfasf");
}

在上面的代码中,引用s在作用域外就消失了,但是s指向的String对象却仍继续占据着内存空间。在这个作用域后,我们就没有办法访问这个对象了,因为这个对象的唯一的引用已经超出作用域范围了。当然,我们可以在代码中用传递和复制对象引用来在作用域外再使用这个对象。

在C++中就不是这样了,你必须保证对象的保留时间与使用对象的保留时间一样长,而且要确保在使用完对象后,要把它销毁。

那么java的种方式带来了一个问题,既然对象一直存在内存里,那么怎么才能防止对象存满内存呢?这在C++里会遇到的严重问题,在java里很好的解决了,这就是垃圾回收。

 

 

四:创建新的数据类型:类

java里一切都是对象,那么什么决定了某一类对象的外观和与行为的?是什么确定了对象的类型?答案就是类---class。

 

字段和方法

一旦定义了一个类,接着就可以在类里设置两种类型的元素:字段和方法。字段可以是任意类型的对象,可以通过其引用与其进行通信;也可以是基本类型的一咱。如果字段是对某个对象的引用,那么必须初始化该引用,以使其它与一个对象相关联(通过new来实现)。在java里,你所做的全部工作就是字义类,产生类的对象,以及发送消息给这些对象。

 

static关键字

通常我们在创建类时,都是在描述这个类的对象的外观与行为。只在没有new对象,这个类的对象就没有创建。只有new了对象,数据存储空间才会分配,其方法才能供外面调用。

有两种情况是上面说的无法解决的:一是只想为某特定域分配单一存储空间,而不去考虑空间要创建多少对象,甚至根本不不创建任何对象。二是希望某个方法不与包含它的类的任何对象关联在一起。也就是即使没有对象,也能够调用这个方法。

通过static可以满足上面要求。当声明一个事物为static时,就意味着这个域或方法不会和包含它的那个类的任何对象实例关联在一起。所以,即使从未创建对象实例,也可以调用static方法和static域。

先说说static字段

class StaticTest{
 static int i =10;
}
 
StaticTest st1 = new StaticText();
StaticTest st2 = new StaticText();

 上面,就算你创建了两个StaticText对象,StaticText.i也只有一份存储空间,两个对象共享一个同一个i。当其中一个对象操作i使其值变化时,用另一对象去获取i的值也是变化后的值。

一般我们用类名.变量的方式来访问static成员,虽然也可以用对象.变量的方式来访问,但是前者可以让人一看就知道变量是static的。

再说说static方法:

static变量会改变数据的创建方式,因为静态域对每个类都只有一份存储空间,而非static字段则是对每个对象都有一份存储空间。但是对于静态方法来说,差别就没有那么大了,静态方法的一个重要用户就是在不创建任何对象的前提下你也可以调用这个方法。这对于main方法很重要,因为它是运行一个的应用时的入口点。

 

 

五:另注意以下两点:
1. 当变量做为类的成员时,如果没有初始化, java 会自动初始化。但是当变量做为方法的局部变量时 , 如果没有初始化编绎器就会报错。
2.以下代码说明需要多少字节才能容纳对特定字符串对象:

int storage(String s){
 return s.length() * 2
}

 注意:字符串中的每个字符有 2 个字节,有 16 位(一个字节 8 位),以此来对 Unicode 字符集的支持。

分享到:
评论

相关推荐

    IncompatibleClassChangeError(解决方案).md

    IncompatibleClassChangeError(解决方案).md

    中国智慧工地行业市场研究(2023)Word(63页).docx

    智慧工地,作为现代建筑施工管理的创新模式,以“智慧工地云平台”为核心,整合施工现场的“人机料法环”关键要素,实现了业务系统的协同共享,为施工企业提供了标准化、精益化的工程管理方案,同时也为政府监管提供了数据分析及决策支持。这一解决方案依托云网一体化产品及物联网资源,通过集成公司业务优势,面向政府监管部门和建筑施工企业,自主研发并整合加载了多种工地行业应用。这些应用不仅全面连接了施工现场的人员、机械、车辆和物料,实现了数据的智能采集、定位、监测、控制、分析及管理,还打造了物联网终端、网络层、平台层、应用层等全方位的安全能力,确保了整个系统的可靠、可用、可控和保密。 在整体解决方案中,智慧工地提供了政府监管级、建筑企业级和施工现场级三类解决方案。政府监管级解决方案以一体化监管平台为核心,通过GIS地图展示辖区内工程项目、人员、设备信息,实现了施工现场安全状况和参建各方行为的实时监控和事前预防。建筑企业级解决方案则通过综合管理平台,提供项目管理、进度管控、劳务实名制等一站式服务,帮助企业实现工程管理的标准化和精益化。施工现场级解决方案则以可视化平台为基础,集成多个业务应用子系统,借助物联网应用终端,实现了施工信息化、管理智能化、监测自动化和决策可视化。这些解决方案的应用,不仅提高了施工效率和工程质量,还降低了安全风险,为建筑行业的可持续发展提供了有力支持。 值得一提的是,智慧工地的应用系统还围绕着工地“人、机、材、环”四个重要因素,提供了各类信息化应用系统。这些系统通过配置同步用户的组织结构、智能权限,结合各类子系统应用,实现了信息的有效触达、问题的及时跟进和工地的有序管理。此外,智慧工地还结合了虚拟现实(VR)和建筑信息模型(BIM)等先进技术,为施工人员提供了更为直观、生动的培训和管理工具。这些创新技术的应用,不仅提升了施工人员的技能水平和安全意识,还为建筑行业的数字化转型和智能化升级注入了新的活力。总的来说,智慧工地解决方案以其创新性、实用性和高效性,正在逐步改变建筑施工行业的传统管理模式,引领着建筑行业向更加智能化、高效化和可持续化的方向发展。

    java大题啊实打实的

    123

    asdjhfjsnlkdmv

    asdjhfjsnlkdmv

    二手车价格预测,代码核心任务是通过机器学习模型(如线性回归、随机森林和KNN回归)预测车辆的价格(current price),并使用评估指标(如 R² 和 MSE)来衡量不同模型的预测效果

    该代码实现了基于机器学习的车辆价格预测模型,利用不同回归算法(如线性回归、随机森林回归和 KNN 回归)对车辆的当前价格(current price)进行预测。代码首先进行数据加载与预处理,包括删除无关特征、归一化处理等;然后使用不同的机器学习模型进行训练,并评估它们的表现(通过 R²、MAE、MSE 等指标);最后通过可视化工具对模型预测效果进行分析。目的是为车辆价格预测任务找到最合适的回归模型。 适用人群: 数据科学家和机器学习工程师:对于需要进行回归建模和模型选择的从业者,尤其是对车辆数据或类似领域有兴趣的。 企业数据分析师:在汽车行业或二手车市场中,需要对车辆价格进行预测和分析的专业人员。 机器学习学习者:希望学习如何使用 Python 实现机器学习模型、数据预处理和评估的初学者或中级学习者。 使用场景及目标: 汽车定价与估值:用于为汽车或二手车定价,尤其是当需要预测车辆的当前市场价格时。 汽车行业市场分析:通过数据分析和回归预测,帮助汽车销售商、经销商或市场分析师预测未来的市场价格趋势。 二手车市场:为二手车买卖双方提供价格参考,帮助制定合理的交易价格。

    基于模型预测控制(mpc)的车辆道,车辆轨迹跟踪,道轨迹为五次多项式,matlab与carsim联防控制

    基于模型预测控制(mpc)的车辆道,车辆轨迹跟踪,道轨迹为五次多项式,matlab与carsim联防控制

    StoreError解决办法.md

    StoreError解决办法.md

    白色精致风格的个人简历模板下载.zip

    白色精致风格的个人简历模板下载.zip

    白色宽屏风格的房产介绍服务网站模板下载.zip

    白色宽屏风格的房产介绍服务网站模板下载.zip

    基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目)

    基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目),本资源中的源码都是经过本地编译过可运行的,评审分达到98分,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、毕业设计、期末大作业和课程设计使用需求,如果有需要的话可以放心下载使用。 基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目)基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目)基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目)基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目)基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目)基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目)基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目)基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目)基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目)基于Python实现的医疗知识图谱的知识问答系统源码毕业设计(高分项目)基于

    白色宽屏风格的生物医疗实验室企业网站模板.rar

    白色宽屏风格的生物医疗实验室企业网站模板.rar

    C# 操作Access数据库

    C# 操作Access数据库

    NSFileSystemError如何解决.md

    NSFileSystemError如何解决.md

    白色简洁风格的商户销售统计图源码下载.zip

    白色简洁风格的商户销售统计图源码下载.zip

    白色简洁风格的室内设计整站网站源码下载.zip

    白色简洁风格的室内设计整站网站源码下载.zip

    侧吸式油烟机sw16可编辑全套技术资料100%好用.zip

    侧吸式油烟机sw16可编辑全套技术资料100%好用.zip

    matlab人脸识别代码

    在 MATLAB 中进行人脸识别可以通过使用内置的工具箱和函数来实现。MATLAB 提供了计算机视觉工具箱(Computer Vision Toolbox),其中包含了用于图像处理、特征提取以及机器学习的函数,可以用来构建一个人脸识别系统。下面是一个简化的教程,介绍如何使用 MATLAB 进行人脸识别。 ### 准备工作 1. **安装必要的工具箱**:确保你已经安装了“计算机视觉工具箱”和“深度学习工具箱”。如果没有,可以通过 MATLAB 的附加功能管理器安装它们。 2. **获取数据集**:准备一个包含不同个体的人脸图像的数据集。你可以自己收集图片,或者使用公开的数据集如 AT&T Faces Database 或 LFW (Labeled Faces in the Wild) 数据集。 3. **安装预训练模型(可选)**:如果你打算使用深度学习方法,MATLAB 提供了一些预训练的卷积神经网络(CNN)模型,比如 AlexNet, GoogLeNet 等,可以直接加载并用于特征提取或分类。 ### 步骤指南 #### 1. 加载人脸检测器 ```matlab face

    白色宽屏风格的建筑设计公司企业网站源码下载.zip

    白色宽屏风格的建筑设计公司企业网站源码下载.zip

    智慧工地产品方案Word(179页).doc

    智慧工地,作为现代建筑施工管理的创新模式,以“智慧工地云平台”为核心,整合施工现场的“人机料法环”关键要素,实现了业务系统的协同共享,为施工企业提供了标准化、精益化的工程管理方案,同时也为政府监管提供了数据分析及决策支持。这一解决方案依托云网一体化产品及物联网资源,通过集成公司业务优势,面向政府监管部门和建筑施工企业,自主研发并整合加载了多种工地行业应用。这些应用不仅全面连接了施工现场的人员、机械、车辆和物料,实现了数据的智能采集、定位、监测、控制、分析及管理,还打造了物联网终端、网络层、平台层、应用层等全方位的安全能力,确保了整个系统的可靠、可用、可控和保密。 在整体解决方案中,智慧工地提供了政府监管级、建筑企业级和施工现场级三类解决方案。政府监管级解决方案以一体化监管平台为核心,通过GIS地图展示辖区内工程项目、人员、设备信息,实现了施工现场安全状况和参建各方行为的实时监控和事前预防。建筑企业级解决方案则通过综合管理平台,提供项目管理、进度管控、劳务实名制等一站式服务,帮助企业实现工程管理的标准化和精益化。施工现场级解决方案则以可视化平台为基础,集成多个业务应用子系统,借助物联网应用终端,实现了施工信息化、管理智能化、监测自动化和决策可视化。这些解决方案的应用,不仅提高了施工效率和工程质量,还降低了安全风险,为建筑行业的可持续发展提供了有力支持。 值得一提的是,智慧工地的应用系统还围绕着工地“人、机、材、环”四个重要因素,提供了各类信息化应用系统。这些系统通过配置同步用户的组织结构、智能权限,结合各类子系统应用,实现了信息的有效触达、问题的及时跟进和工地的有序管理。此外,智慧工地还结合了虚拟现实(VR)和建筑信息模型(BIM)等先进技术,为施工人员提供了更为直观、生动的培训和管理工具。这些创新技术的应用,不仅提升了施工人员的技能水平和安全意识,还为建筑行业的数字化转型和智能化升级注入了新的活力。总的来说,智慧工地解决方案以其创新性、实用性和高效性,正在逐步改变建筑施工行业的传统管理模式,引领着建筑行业向更加智能化、高效化和可持续化的方向发展。

    履带车底盘sw16全套技术资料100%好用.zip

    履带车底盘sw16全套技术资料100%好用.zip

Global site tag (gtag.js) - Google Analytics