`

java中的对象详谈

    博客分类:
  • java
阅读更多
2.1 用引用操作对象
(1)Java语言是一种纯面向对象的编程语言,Java中操纵一个对象是通过“引用”实现的。让我们来看下书中的一个实例:
String s = “asdf”
这句话“等号”(个人习惯引用数学上的概念,计算机中应该是赋值符号,下同)左边部分申明了一个指向string类型的对象的引用,该引用名为s,如果我们忽略“等号”右边内容的话,那么这个引用可以指向string类型的所有对象,“等号”右半部分是对这个引用进行初始化,即把s指向一个string类型并且内容为 “asdf” 的对象。引用也可以被赋值,如 上面的例子后面跟这句 String a = s ,那么就创建了一个名为 a 的新的引用。a 跟 s 指向同一个对象。

2.2 必须由你来创建所有对象
对象不会凭空产生,所有对象必须都由你自己来创建。除基本类型外的对象都用new关键字来创建。
        (1)String s = new String(“asdf”)
        “等号”左边申明的是一个引用。“等号”右边是对对象进行实例化和初始化,实例化是通过new关键字来实现的,它给对象在内存中分配了一个地址。String(“asdf”)是通过调用一个构造方法String()对这个对象进行初始化,使这个对象的内容为”asdf”。这个例子中,s指向的是对象所在的内存地址值,而不是指向对象本身(对象的内容)。看个例子:
        String s = new String(“asdf”)
        String a = new String(“asdf”)
     这里引用s和a所指向对象的内容是相同的,都为”asdf”,但是 a = = b 编译器返回false,因为s 和 a 分别指向内存中的两个地址,虽然对象内容是相同的,但是编译器返回false,(这也说明 = = 比较的是引用指向的地址的值,并非比较对象的内容)。这好比你去邮局邮寄两个包裹,这两个包裹装的都是同一件物品---书本,但是一个是邮到北京的,一个是邮到上海的,虽然这两个包裹里装的东西是一样的,但是你不能说北京等于上海吧?
(2)并不是所有的对象实例化跟初始化后都必须有引用指向它的,如果把对象实例化跟初始化看成一个整体,如 把 new String(“asdf”) 看成一个整体,也可以这样用:
System.out.print(new String(“asdf”))
     但是这样只能用一次,想再次用这个对象必须重新创建过了。
        (3)对象创建后不同类型的数据放在不同的地方:
             a. 寄存器:在存储器内部,速度最快,但是我们无法直接控制。
             b. 堆栈:在随机访问存储器中,速度快,但是大小和生命周期受限制。对象引用跟基本类型就存在堆栈中。
             c. 堆:也在随机访问存储器中,数据大小和生命周期较灵活,但是牺牲了效率,对象就是存在此的。
             d. 静态存储:也在随机访问存储器中,存储static成员元素。
             e. 常量存储:存储常量。(一般的时候常量是直接存在程序代码中的)。
             f. 非RAM存储:存储完全独立与程序之外的数据,如:流对象、持久化对象。
         (4)Java中有九种基本类型,即 boolean、char、byte、short、int、long、float、double、void ;它们对应的外覆类分别为:Boolean、Character、Byte、Short、Integer、Long、Float、Double、Void ;出于效率上考虑,java中的基本类型不用new关键字来创建。基本类型也存放在堆栈中,并且其大小是固定不变的(虽然boolean类型没有明确指定大小,但是其大小也是不随硬件架构的变化而变化)。如果你想用堆来存储基本数据类型的话,就要使用该类型的外覆类来实现了 例如Character C = new Character(‘x’);下面是基本类型默认初始化的值:
              boolean类型变量默认初始值为false
              char类型变量默认初始值为0(ASCII码)
              byte类型变量默认初始值为0
              short类型变量默认初始值为0
int类型变量默认初始值为0
float类型变量默认初始值为0.0f
double类型变量默认初始值为0.0d
long类型变量默认初始值为0L
          (5) Java中的数组本身也是对象,所以它跟所有对象一样,引用类型变量默认初始值为null,即不指向任何对象,创建数组对象产生的引用数组初始化时也是指向null,值为null的引用是不能被操作的,所以Java中的数组是安全的。

2.3 永远不需要销毁对象
         (1)基本类型变量只能在它的作用域(以一对花括号来分隔)范围生存,在作用域里定义的变量只可用于作用域结束之前。Java中同一作用域下的某个基本变量是不可以被重复定义的。
         (2)对象在离开作用域是不会消失的,出了作用域消失的只是指向对象的引用,java 中有一个“垃圾回收机制”,会定时扫描已建的对象,在确定哪些对象已经没有任何引用指向它的时候就自动把它销毁,从而释放内存空间,所以java中不需要你自己去销毁对象。

2.4 创建新的数据类型:类
          (1)Java是通过类来决定对象的属性(行为跟外观)的。Java类通过class关键字创建,如 class ATypeName创建了一个名为ATypeName的类。Java类包括字段跟方法两元素,字段可以为任何类型的对象,也可以为基本类型;对象的引用通过构造器(特殊的方法)进行初始化,基本类型用做类成员则可在定义的时候进行初始化。(如程序中未初始化,java编译器会自动给它个默认的初始值)但是非某个类的字段的基本类型则不会自动给初始化,编译时则会返回一个错误。

2.5 方法、参数和返回值
          (1)方法是由名称、参数、返回类型以及方法体组成的。名称+参数唯一标识一个方法,方法只有通过对象才能被调用,并且有对象引用指向其返回值的时候,对象引用的类型必须与返回值的类型一致,如:
            Int x = a.f();
     f()的返回值类型必须是int型的,否则会报错。
          (2)在向一个方法传递一个对象的时候,实际上传递的是该对象的引用(基本数据类型除外),而传递的对象类型一定要和方法中接受参数的参数类型相同。如你不想方法返回任何值,可以把该方法的返回类型设置为void,而此时方法中的return就是用来离开方法的,不需要等到它执行完毕,如果方法的返回类型不为void的时候,你可以使用return 返回一个和返回类型一样的值。

2.6 构建一个Java程序
           (1) 使用独一无二的名字空间,推荐使用Internet域名倒写
(2)使用公共类,用import命令导入公共包
          (3)*** static 是静态修饰符,被static修饰后的成员(变量或类),在编译时由内存分配一块内存空间,直到程序停止运行才会释放,也就是说无论该类建多少个对象,所有对象都会共享这块内存空间。所有指向这些对象的引用都相等的。另外,被static修饰后的成员(变量或类)可以通过一个对象去引用它,也可以用类名直接引用它。也就是说不一定要实例化对象才能引用被static修饰的成员。
               ***补充一下关于原始数据类型默认初始化的问题,大家知道,在类函数的外部声明的变量是全局变量,这些全局变量如果是原始数据类型的话,那么不论是否有在声明的时候显示初始化,在每次对象实例化的时候系统都会给其自动初始化的,而对于一个声明为static的原始数据类型的全局变量来说,这样的初始化只会进行一次,例如:
class time {
nt i = 5;
public static void main(String args[]){
time t = new time (); //第一次实例化,系统自动初始化
t.i = 6;
time tt = new time (); //第二次初始化

System.out.println(t.i);
System.out.println(tt.i);
}
}
     运行显示结果6,5,在这里实例化了两次对象,而全局变量就初始化了两次,而如果全局变量i声明为static的话,那么虽然实例化两次,实际上变量i只初始化了一次,在第二次实例化的时候不会对全局变量进行初始化了,此时输出的结果是3,3 。
2.7 你的第一个Java程序
        (1)写第一个Java程序的时候我个人感觉还是环境配置的问题比较头痛,这里就讲下环境配置;其他按书本一步步对即可!
        window2000/xp jdk1.5.0_05 配置方法:
1. JAVA_HOME 值:C:\Program Files\Java\jdk1.5.0_05
2. CLASSPATH 值:.;%JAVA_HOME%\lib
3. Path:%JAVA_HOME%\bin; (也许系统变量里面已经有了Path变量,那么就修改它好了,在原来的值的前面加上%JAVA_HOME%\bin;)
分享到:
评论

相关推荐

    详谈Java中net.sf.json包关于JSON与对象互转的坑

    尤其是它将Java对象中所有以“get”开头的公共方法转换为JSON对象的键(key),并将这些方法的返回值作为键对应的值(value)。这种转换规则可能会导致一些非预期的键值对出现在JSON对象中,因为按照这个规则,即使...

    详谈java中boolean和Boolean的区别

    Java 中 boolean 和 Boolean 的区别详解 作为一名 Java 开发者,了解 boolean 和 Boolean 的区别是非常重要的。本文将详细介绍 Java 中 boolean 和 Boolean 的区别,帮助读者更好地理解和使用这两种数据类型。 ...

    详谈Java中的事件监听机制

    在Java中,几乎所有的容器组件和元素组件都可以成为事件源对象,如按钮、文本框、窗口等。当动作(事件)发生在某个组件上时,该组件就成为了事件源对象。例如,在GUI中,当用户点击一个按钮,这个按钮组件就是事件...

    详谈java集合框架

    Java集合框架是Java语言中用于存储和操作对象集合的框架,它提供了一套性能优良、使用方便的接口和类,位于java.util包中。Java集合框架主要包含Collection接口、List接口、Set接口和Map接口四个主要部分。 ...

    详谈jvm--Java中init和clinit的区别

    其中,init 和 clinit 是两个重要的概念,它们分别是实例构造器和类构造器,在 Java 编程中扮演着重要角色。 init 方法 init 方法是实例构造器,也就是说在程序执行 new 一个对象时调用该对象类的 constructor ...

    详谈Java中instanceof和isInstance的区别

    在Java编程语言中,`instanceof` 和 `Class.isInstance()` 都是用来判断对象是否属于特定类型的工具,但它们之间存在一些微妙的区别。下面将详细解释这两种操作符的用法和差异。 首先,`instanceof` 关键字是Java...

    详谈Java中的Object、T(泛型)、?区别

    Java 中的 Object、T(泛型)和 ? 区别详解 Java 是一种面向对象的编程语言,它提供了多种数据类型来存储和操作数据,其中 Object、T(泛型)和 ? 是 Java 中三个重要的概念,它们之间的区别和联系是 Java 开发者...

    详谈Java中Object类中的方法以及finalize函数作用

    Java中的Object类是所有类的根,每个自定义类如果没有明确指定父类,都将默认继承Object。Object类中包含了一些基础且重要的方法,这些方法在Java编程中扮演着关键角色。接下来我们将详细讨论这些方法以及`finalize...

    经典之谈——Java内存分配

    4. **堆**:Java对象的主要存储区域,所有的实例对象和数组都在堆中分配内存。堆内存是所有线程共享的,通过垃圾收集器进行内存回收,以防止内存泄漏。 5. **方法区(元空间)**:存储类的元数据,如类名、字段信息...

    详谈Java泛型中T和问号(通配符)的区别

    Java泛型中T和问号(通配符)的区别 Java泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、...

    hibernate配置要点详谈

    - 对于`save`操作,如果对象已经与`Session`关联,则无需额外操作,因为`Session.flush`过程中,Hibernate会遍历实体容器中的对象,检测并执行相应的更新语句。 通过以上详细的解析,我们可以看到Hibernate提供了...

    详谈Java静态动态的问题

    在Java中,动态成员变量和动态方法是指在实例化对象后才存在的成员变量和方法。动态成员变量和动态方法是属于实例对象的,每个实例对象都有自己的动态成员变量和动态方法。 例如,下面是一个动态成员变量和动态方法...

    详谈Java8新特性泛型的类型推导

    在Java 7之前,当声明并初始化一个泛型对象时,如`Map, Integer> map = new HashMap, Integer>()`,需要在声明和实例化时都明确指定泛型类型。这使得代码显得较为冗长,特别是对于不熟悉泛型的开发者来说,可能会...

    详谈Java几种线程池类型介绍及使用方法

    Java 中的线程池是一种高效的并发编程机制,它可以将任务提交给线程池,并由线程池中的线程执行任务, Java 提供了四种线程池类型,分别是 newCachedThreadPool、newFixedThreadPool、newScheduledThreadPool 和 ...

    详谈java 堆区、方法区和栈区

    堆区是Java程序中最大的内存区域,所有通过`new`关键字创建的对象以及数组都会被分配到堆内存中。由于堆内存是线程共享的,因此多个线程可以同时访问同一个对象。堆内存的大小可以通过JVM启动参数进行调整,如`-Xms...

    详谈Java多线程的几个常用关键字

    在Java中,异步方法可以使用 Thread 对象的 start() 方法来启动一个新的线程,例如: ```java Thread t1 = new Thread(new Runnable() { @Override public void run() { mo.methodB(); } },"t1"); t1.start(); `...

    详谈锁和监视器之间的区别_Java并发

    在Java中,任何对象都有一个内部锁,如果一个方法用synchronized关键字声明,那么对象的锁将保护整个方法。内部锁的一般用法如下: public synchronized void transfer(int from, int to, double amount) throws ...

    详谈fastjson将对象格式化成json时的两个问题

    在使用Fastjson将Java对象转换成JSON格式时,可能会遇到两个常见的问题,这些问题与对象的继承结构和集合处理有关。本文将深入探讨这两个问题,并提供相应的解决方案。 首先,让我们来看第一个问题:关于对象继承的...

    详谈Java枚举、静态导入、自动拆装箱、增强for循环、可变参数

    在 Java 中,枚举是使用关键字 `enum` 定义的,例如: ```java enum Color { RED, GREEN, YELLOW; } ``` 枚举的构造方法是私有的,枚举类中可以有抽象方法,每个实例都需要重写这个抽象方法。 二、枚举的 API ...

    详谈java线程与线程、进程与进程间通信

    - **共享变量**:线程通过修改共享对象的变量来传递信号,如示例中的`MySignal`类,线程A设置标志,线程B读取并作出响应。 - **wait/notify机制**:基于`Object`类的`wait()`, `notify()`, `notifyAll()`方法,...

Global site tag (gtag.js) - Google Analytics