`
lgx2351
  • 浏览: 176013 次
  • 性别: 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 字符集的支持。

分享到:
评论

相关推荐

    java 基础知识总结(经典)

    这篇“Java基础知识总结(经典)”涵盖了Java开发中的核心概念和重要知识点,旨在为初学者和有经验的开发者提供一个全面的回顾。以下是主要的学习点: 1. **Java环境配置**:在开始编程之前,必须安装Java ...

    JAVA知识点总结(XMIND格式)

    以上知识点在"JAVA知识点总结思维导图(xmind)"中可能以思维导图的形式详细展开,包括每个主题的子话题和相关实例,帮助学习者系统地理解和掌握Java编程。通过深入学习和实践这些知识点,可以成为一名熟练的Java...

    java知识点总结

    以上内容仅是Java知识点的冰山一角,实际学习中还需要深入理解JVM原理、设计模式、反射、注解、模块化系统(如Java 9+的模块系统)以及现代开发工具如Maven、Gradle的使用。不断实践和项目经验积累,才能真正掌握...

    java基础知识总结(经典)

    Java以其跨平台、面向对象和安全性等特点,迅速成为全球开发者的重要工具。Java分为三个主要的技术架构: 1. JAVAEE(Java Platform Enterprise Edition):专用于开发企业级应用,特别是在Web开发领域。 2. JAVASE...

    Java 学习基本知识总结

    ### Java 学习基本知识总结 #### Java基础入门 ##### Java语言概述 - **起源与发展**:Java由Sun Microsystems公司于1995年推出,最初由James Gosling设计。它是一种面向对象、跨平台的高级编程语言。 - **特点**...

    java基础知识总结

    这份“java基础知识总结”涵盖了入门级别的关键概念,旨在帮助初学者理解Java的总体框架。 1. **Java概述**:Java是由Sun Microsystems(现为Oracle Corporation)开发的,由James Gosling引领的团队于1995年推出。...

    Java基础知识总结

    Java基础知识总结涵盖了面向对象编程的核心概念,是学习Java语言的基础。以下是对这些知识点的详细解释: 一、面向对象的理论知识 面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它基于“对象...

    java面向对象程序设计基础知识总结.zip

    1. 类与对象:在Java中,一切皆为对象,而类是创建对象的模板。类定义了对象的状态(属性)和行为(方法)。例如,我们可以创建一个名为"Student"的类,其中包含姓名、年龄等属性和学习、玩耍等方法。 2. 封装:...

    java面向对象程序设计基础知识总结

    - 对象:类的实例,是实际存在的实体,具备类中定义的属性和方法。 2. 封装 封装是面向对象的重要特性,它隐藏了对象的内部实现细节,仅通过公共接口与外界交互。在Java中,通过访问修饰符(public, private, ...

    java基础知识总结 Java学习资料

    4. **类与对象**: Java是面向对象的语言,一切皆为对象。类是创建对象的蓝图,包含属性(成员变量)和方法(成员函数)。对象则是类的实例,通过`new`关键字创建。 5. **封装、继承、多态**: 这是面向对象编程的三...

    java知识总结

    ### Java知识精要详解 #### 一、Java基础概述 **1. Java的本质与特性** Java是一种纯面向对象的语言,其核心理念在于一切皆可封装为类,无论是函数还是变量,均需置于类中,避免了传统编程语言中类外定义的混乱,...

    Java基础知识整理

    面向对象是一种编程范式,Java语言是完全面向对象的,它将一切事物都抽象为对象。面向对象的特征有四个:抽象、继承、封装和多态性。 * 抽象:抽象是指对事物的某些特征或行为的描述,而不是对事物的完整描述。抽象...

    计算机领域的java基础知识总结

    2. **类与对象**:Java是面向对象的语言,一切皆为对象。类是对象的蓝图,包含属性(成员变量)和行为(方法)。对象是类的实例,通过`new`关键字创建。 3. **封装、继承和多态**:这是面向对象的三大特性。封装...

    对java总的总结ppt

    3. **类与对象**:Java是面向对象的语言,一切皆为对象,类是创建对象的模板,对象则是类的实例。 **二、Java核心技术** 1. **JVM(Java虚拟机)**:Java程序需要在JVM上运行,JVM负责解释执行字节码,实现跨平台...

    java对象创建过程

    ### Java对象创建过程详解 ...总结而言,Java对象的创建过程涉及类加载、内存分配、初始化等多个环节,每个环节都扮演着重要的角色。深入理解这些基础知识有助于开发者编写更高效、更健壮的Java应用程序。

    Java简单知识点总结

    在Java简单知识点总结中,我们将深入探讨Java的基础概念、语法特性、数据类型、控制结构、类与对象以及异常处理等方面。 1. **基础概念** - **JVM(Java虚拟机)**:Java程序通过JVM运行,它提供了跨平台的能力,...

    java语言要点总结

    在Java中,一切都是对象,包括基本数据类型也被包装成了对象的形式。Java通过引用的概念来管理这些对象,这与C或C++中的指针有着本质的不同。 在Java中,当你声明一个对象变量时,实际上是在创建一个对该对象的引用...

    JAVA小知识

    1. **类与对象**:Java是一种面向对象的语言,一切皆为对象。类是创建对象的模板,而对象是类的实例。 2. **封装**:这是面向对象的基本特性之一,它隐藏了对象的内部实现细节,只对外提供公共接口来访问和修改数据...

    java基础学习总结

    2. **类和对象**:在Java中,一切皆为对象。类是创建对象的蓝图,包含了属性(变量)和行为(方法)。对象则是类的实例,用来存储和操作数据。 3. **接口**:接口是一种定义行为的规范,它包含一组抽象方法。类可以...

    java基础知识总结(经典).doc

    了解了这些基础知识后,开发者可以进一步学习Java的类、对象、继承、封装、多态、异常处理、集合框架、IO流、多线程、网络编程等更深入的概念。Java的广泛应用使其成为学习和职业发展的重要选择。通过编写代码、分析...

Global site tag (gtag.js) - Google Analytics