`
oh_nerd
  • 浏览: 5190 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类

java,一切都是对象?

阅读更多

 

真的是一切都是对象?

首先得明确java中的对象存储位置:

1)  寄存器:最快的存储区,在处理器内部,暂时忽略。

2)  堆栈:速度仅次于寄存器,但是得明确规定数据的大小和生命周期,对象的引用存储于其中(java对象不存在此)。

3)  堆:java对象的存储区,无需知道数据大小,生命周期。

4)  静态存储:static来标识的对象存储区。

5)  常量存储:常量值通常直接存放在程序代码内部,他们永远不会被改变。

6)  RAM,忽略。

StringBuffer stringBuffer=new StringBuffer(“hello, world”),见惯不惯的一个代码段。实际java的操作机制:new StringBuffer(“hello, world”)创建了一个对象,该对象被存储到堆中,其实这个对象我们看不见摸不到。为了能够操作该对象,就有了StringBuffer stringBuffer这样一个引用,这个引用存储在堆栈中,”=”将两者联系在了一起。既然stringBuffer是指向new StringBuffer(“hello,world”)这个对象的,再来个StringBuffer stringBuffer1=stringBuffer,这里其实是引用的赋值而非对象本身的赋值,同理若有stringBuffer1==stringBuffer这样一个语句,也是引用的事。以上都好理解,直到看到Bruce Eckel说:java中的任何传递对象的场合,这里的传递实际上是引用,这不是c中的形参实参的关系么。于是立马敲下代码:

 

package com.cedric.thinkingInJava.test;

class Person{
	String name;
	int age;
}

public class ReferenceAndArgs {
	
	public static void main(String[] args) {
		Person person=new Person();
		Person personBeforeChangeAge;
		
		setPersonInfo(person);
		personBeforeChangeAge=person;
		
		System.out.println("Before the change:");
		printPersonInfo(personBeforeChangeAge);
		
		System.out.println("After the change:");
		changeTheAge(person);
		printPersonInfo(person);
		printPersonInfo(personBeforeChangeAge);
		//这里可以认为所有的引用都指向了最初的new Person()这个对象
	}
	
	static void setPersonInfo(Person person) {
		person.name="nerd";
		person.age=22;
	}
	
	static void printPersonInfo(Person person) {
		System.out.println(person.name+" "+person.age);
	}
	
	static void changeTheAge(Person person) {
		person.age++;
		printPersonInfo(person);
	}
}

运行结果:

Before the change:

nerd 22

After the change:

nerd 23

nerd 23

nerd 23

从结果上看,的确所有的引用都指向了一个对象。再试一次:

package com.cedric.thinkingInJava.test;
public class test {

	static void numberIncreaseByOne(String number){
		number=new String("2");
		printNumber(number);
	}
	
	static void printNumber(String number) {
		System.out.println(number);
	}
	
	public static void main(String[] args) {
		String integer=new String("1");
		
		numberIncreaseByOne(integer);
		printNumber(integer);	    
	}
}

结果是

    2

    1

问题出现:String是个对象,那定义的integernumber应该指向同一个对象才对,实际并非如此,它是值传递。这里就回到了最开始的问题:真的是一切都是对象?其实在java里有基本变量,也就是常见的int char,long ,float,double等,他们不用new来创建,他们的值存储在堆栈中,这样可以更高效的运行,说白了他们不是对象。既然不是对象,他们在函数的参数传递时就是值的传递,和c中的实参传递一样。再来看Stringgoogle后知道它是封装类,看看它的源码:

 

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence
{
    /** The value is used for character storage. */
    private final char value[];

    /** The offset is the first index of the storage that is used. */
    private final int offset;

    /** The count is the number of characters in the String. */
    private final int count;
……

 里面的final char value[]就可以说明一切了:首先它其实是对char的一个封装而已,char就是基本类型,此外又是final类型,final类型网上看来是存储在常量存储区的。常量存储区的数据时永远不会变的,没有像其他对象一样的引用,所以就有了虽然是对象,但是还是值传递。那么IntegerFloat等就可以解释为什么也是值传递了。至于StringBuffer,它的源代码继承了AbstractStringBuffer

 

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
     * The value is used for character storage.
     */
    char value[];

    /** 
     * The count is the number of characters used.
     */
    int count;

    /** 
     * This no-arg constructor is necessary for serialization of subclasses.
     */
    AbstractStringBuilder() {
}

 这里的char并非final类型,和String的实现方法并不相同。

虽然知道了类似String这种封装类,但是里面真正的实现机制还是模糊的,下次带着这个问题去看final

分享到:
评论

相关推荐

    Java面向对象程序设计

    Java作为一款纯面向对象的语言,其一切皆为对象,包括基本类型都有对应的包装类。 2. **类与对象**:类是创建对象的模板或蓝图,定义了一组相关的属性(数据成员)和方法(成员函数)。对象则是类的实例,具有类...

    [java]读书笔记整理:一切都是对象

    在Java中,一切都被视为对象,这意味着无论处理何种类型的数据,都可以使用相同的语法来进行操作。当我们提到“操纵对象”时,实际上是在操纵该对象的引用。引用类似于遥控器与电视机的关系:我们通过遥控器(引用)...

    Java面向对象程序设计课本例题源代码

    1. **类与对象**:在Java中,一切皆为对象,而类是创建对象的蓝图。源代码中会展示如何定义类,包括类的属性(成员变量)和行为(方法)。通过实例化类,你可以创建具有特定状态和行为的对象。 2. **封装**:封装是...

    java基础与面向对象习题与答案

    - **类与对象**:Java是面向对象的语言,一切皆为对象。类是创建对象的模板,包含属性(成员变量)和方法(成员函数)。了解如何定义类和实例化对象是基础学习的关键。 - **封装**:封装是隐藏对象的属性和实现...

    Java面向对象程序设计讲课提纲

    - **面向对象**:Java是纯面向对象的语言,一切皆为对象,它支持类、接口、继承、封装和多态等面向对象特性。 - **自动内存管理**:Java引入了垃圾回收机制,程序员无需手动管理内存,减少了内存泄漏和空指针异常...

    JAVA面向对象基础

    ### JAVA面向对象基础知识点详解 #### 一、面向对象编程语言的发展史 面向对象编程(Object-...掌握面向对象的基础概念,对于任何想要深入学习和应用Java或其他面向对象语言的开发者来说,都是至关重要的第一步。

    Thinking in Java 自学笔记——第二章 一切皆对象

    在Java中,一切都被视为对象,这意味着无论是字符串、数字还是其他数据类型都可以被视为对象来进行操作。当我们声明一个对象时,实际上是在声明一个对该对象的引用。例如: ```java Object obj; ``` 这里的`obj`...

    Java面向对象编程.pdf 高清PDF下载.rar 下载

    Java的核心理念是“一切皆为对象”,这使得它在处理复杂系统和大型项目时表现出色。 面向对象编程(Object-Oriented Programming,简称OOP)是Java的基础。在OOP中,程序被设计为一组相互协作的对象,每个对象都...

    java面向对象核心编程

    1. **类与对象**:在Java中,一切皆为对象。类是创建对象的模板,它定义了对象的状态(数据成员)和行为(方法)。对象是类的实例,拥有类所定义的属性和方法。通过`class`关键字我们创建类,通过`new`关键字实例化...

    java对象创建过程

    在Java编程语言中,对象是程序的基本单元,一切皆对象这一概念使得Java在面向对象编程领域具有重要的地位。本文将详细阐述Java对象的创建过程,帮助读者深入理解Java基础。 #### 一、类加载机制 在Java中,对象是...

    java面向对象教程(PPT)

    1. **类与对象**:在Java中,一切皆为对象。类是创建对象的蓝图,它定义了对象的属性(数据成员)和行为(方法)。在PPT中,你将学习如何定义类,包括类的构造器、访问修饰符和封装原则。 2. **继承**:继承是面向...

    java面向对象基础、高级pdf讲义

    Java是一种广泛使用的面向对象编程语言,它的设计哲学是“一切皆对象”。本讲义将全面深入地介绍Java面向对象的基础概念和高级特性,帮助开发者从初学者到精通者逐步提升技能。 一、面向对象基础 1. 类与对象:类...

    我的Java面相对象考试复习资料

    在Java中,一切皆为对象,这是面向对象编程的基础理念。本复习资料主要涵盖了以下几个关键知识点: 1. **类与对象**:类是创建对象的蓝图,它定义了对象的属性(数据成员)和行为(方法)。对象则是类的实例,它们...

    再发一些Java对象、Java类学习实例.rar

    在Java中,一切皆为对象。一个对象代表了现实世界中的一个实体,它可以有属性(也称为成员变量或字段)和行为(方法)。例如,如果你创建一个"汽车"类,这个类的对象可能有"颜色"、"速度"这样的属性,以及"启动"、...

    java(面向对象编程)课件

    1. **类与对象**:在Java中,一切皆为对象。类是创建对象的模板,它定义了对象的属性(成员变量)和行为(方法)。通过实例化类,我们可以创建具有相同特征和行为的对象。例如,你可以创建一个名为"Person"的类,...

    Java数据结构与面向对象编程基础

    Java数据结构与面向对象编程是计算机科学中的核心概念,它们对于任何Java开发者来说都是不可或缺的知识。数据结构是指在计算机中组织、存储和处理数据的方式,而面向对象编程(Object-Oriented Programming,OOP)是...

    东北大学JAVA 面向对象实验全部实验代码1到6

    1. 类与对象:在Java中,一切皆为对象,类是创建对象的模板。"java-exp"可能包含了多个类文件,每个类代表一种特定的数据结构或功能,比如“Student”类用于描述学生的属性和行为。 2. 封装:这是面向对象的基本...

    Java面向对象程序设计本科课程详细ppt

    在Java中,一切皆为对象,类是创建对象的模板,它定义了对象的状态(数据成员)和行为(方法)。继承、封装和多态是面向对象的三大特性。 2. **类与对象**:类是创建对象的蓝图,它定义了对象的属性(字段)和行为...

    java面向对象程序设计PPT

    在Java中,一切皆为对象,这是其面向对象特性的一个显著特征。 1. **封装**:封装是面向对象的核心概念之一,它隐藏了对象的内部细节,只对外提供公共接口进行交互。在Java中,我们使用类(class)来定义对象的结构...

Global site tag (gtag.js) - Google Analytics