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)