前言:
近一年来,一直忙于项目。Java荒废了...
趁这段时间有空重新拿起《Java编程思想》
《Java编程思想》第二章 有一句话“Java语言假设我们只进行面向对象的程序设计。也就是说,在开始用Java进行设计之前,必须将思想转化到面向对象的世界中来”。
一 . 引用操作对象
Java语言是怎么操纵内存中的元素的?是直接操纵元素还是间接以某种方式操纵元素?
Java中有两个词 1:引用 2:对象,那么它们代表什么意思呢?
我们可以用鼠标(引用)来控制电脑(对象),也就是说电脑就是我们要操作的元素,而鼠标就是操作元素的某种方式。
我们知道没有电脑,鼠标可以独立存在,由此我们可以知道,你拥有一个引用,并一定需要有一个对象与它关联。
来看一个例子:
看到没它报错了,为什么会报错?
因为它创建的是一个引用,不是对象,它没有跟任何对象相关联。因此我们要让它与一个对象相关联。
现在引用有了对象,不报错了,打印输出123.
使引用指向对象的过程就是初始化,是不是很简单,不过我们通用的初始化不是这么做的,来看看代码
public class ElementOne {
public static void main(String[] args) {
// TODO Auto-generated method stub
/**
* 初始化方式1
*
* 这是Java为我们封装的现成类型
*/
String str="123";
System.out.println(str);
/**
* 初始化方式2
*
* 通用初始化方式
*/
Test1 test1 = new Test1();
test1.test();
}
}
class Test1 {
public void test() {
System.out.println("通用初始化!");
}
}
打印结果:通用初始化!
总结:
这里我们学到了两个知识:
1:引用与对象的关系
2:两种初始化方式:
java为我们封装的现成类型初始化
通用类型初始化
还有一点要说明:
当它设成全局时没有初始化对象引用也不会报错,那么它的打印结果是什么呢?是null,现在好理解了,系统已经为我们做了初始化。
三.数据存储到哪里
现实中我们的电脑存放在桌面上,那么java中的对象存放在哪里呢?下面来看看5种存储的地方?
1. 寄存器
位于存储器内部
优点:
速度最快
缺点:
数量极其有限,不能直接进行控制,只能根据需求进行配置
2. 堆栈
位于通用的RAM(随机访问存储器)中,由于灵活性原因Java对象并不存储在堆栈中,但是java引用等某些数据存储其中。
优点:
通过堆栈指针可以从处理器那里获得直接支持
堆栈指针向下移动,分配新的内存,向上移动,释放那些内存;分配快速有效,仅次与寄存器。
缺点:
创建程序时,Java必须知道存储在堆栈所有项的生命周期,以便上下移动堆栈指针,这个约束限制了程序的灵活性。
3.堆
一种通用内存池,用于存储所有JAVA对象,位于RAM中。
优点:
编译器不需要知道存储的数据在堆里存放多长时间,因此堆里分配存储灵活性大。上一节我们已经讲了堆里分配存储的方法。
两种初始化方式:
java为我们封装的现成类型初始化
通用类型初始化
缺点:
用堆进行分配和清理比栈经行分配清理速度慢。、
4.常量存储
分两种情况:
Java中存储于程序的内部
嵌入式程序中常量会和其他部分隔离开,这种情况下可以将其存放在ROM(只读寄存器)中。
5.非RAM存储
流对象和持久化对象,数据被存放于磁盘或其他媒介中,程序不运行,数据也存在。在需要是,恢复成常规的。
来思考一个问题 JAVA中的引用,对象,常量,流和持久化对象存放在哪里?
三. 基本数据类型
这一节将从Java基本类型特点、9种基本类型、确定存储空间大小、高精度数字几个方面讲述Java中的基本数据类型
1.Java基本类型特点
2.9种基本类型我们知道new对象储存在堆里,因此用new对象创建一些小的、简单的变量并不是很有效。在这种情况下,Java采用一种并非是引用的自动变量,这种变量直接存储值并置于堆栈中。
基本类型 大小 最小值 最大值 包装器类型 boolean Boolean char 16-bit Unicode o Unicode 2^16-1 Character byte 8-bit -128 +127 Byte short 16-bit -2^15 +2^15-1 Short int 32-bit -2^31 +2^31-1 Integer long 64-bit -2^63 +2^63-1 Long float 32-bit IEEE754 IEEE754 Flat double 64-bits IEEE754 IEEE754 Double void Void
来看看基本数据类型的默认值:
/** * 基本数据 * @author Administrator * */ public class ElementTwo { private static boolean bl; private static char cr; private static byte be; private static short st; private static int it; private static long lg; private static float ft; private static double de; public static void main(String[] args){ /* *数据默认值 */ dataDefault(); } /* *数据默认值 */ static void dataDefault(){ System.out.println("boolean:"+bl); System.out.println("char:"+bl); System.out.println("byte:"+be); System.out.println("short:"+st); System.out.println("int:"+it); System.out.println("long:"+lg); System.out.println("float:"+ft); System.out.println("double:"+de); } }
打印结果:boolean:null char:null byte:0 short:0 int:0 long:0 float:0.0 double:0.0
来看看几个需要注意的地方
1.所有的数值类型都有正负号
2.boolean的大小没有明确指定,它只有两个值,true和false.
3.包转器类型是什么?自动包装功能是什么?反向转化是什么?
来一个Demo
/* * 包装类型 */ private static void intitPackaging() { // TODO Auto-generated method stub Boolean bo=new Boolean(true); System.out.println("Boolean包装类型:"+bo); Character ch=new Character('a'); System.out.println("Character包装类型:"+ch); /** * Java SE5的自动包转功能将自动地将基本类型转化为包装器类型 */ Boolean b=true; System.out.println("Boolean自动包转功能:"+b); /** * 下面是反向转化 */ boolean mBo=bo; System.out.println("Boolean反向转化结果:"+mBo); char mCh=ch; System.out.println("Char反向转化结果:"+mCh); }
包转器类型是用new 将引用于对象关联
自动包装功能使得包装器类型像基本类型一样使用
反向转换是将包装器类型转换为基本类型
3.确定存储空间大小
Java基本类型存储空间大小会变吗?
Java基本类型的存储空间并不会像其他大多数语言随着机器的硬件架构而发生改变
那么这种方式有什么优点呢?
使得java比大多数语言更具有可移植性
4.高精度数字
/** * 高精度类型 */ private static void initPrecision() { // TODO Auto-generated method stub /** * BigInteger */ BigInteger big1=new BigInteger("111111111111111111111111111111111111111111111111"); BigInteger big2=new BigInteger("22222222222222222222222222222222222222222222222"); System.out.println("big1加上big2的结果是:"+big1.add(big2)); System.out.println("big1减去big2的结果是:"+big1.subtract(big2)); System.out.println("big1乘以big2的结果是:"+big1.multiply(big2)); System.out.println("big1除以big2的商是:"+big1.divide(big2)); System.out.println("big1除以big2的余数是:"+big1.mod(big2)); System.out.println("num1对2取余(也就是num1是否为双数)的结果是:"+ big1.mod(new BigInteger("2"))); /** * BigDecimal */ BigDecimal bigD1=new BigDecimal("1111111111111111.11111111111111111111111111111111"); BigDecimal bigD2=new BigDecimal("2.2"); System.out.println("bigD1加上bigD2的结果是:"+bigD1.add(bigD2)); System.out.println("bigD1减去bigD2的结果是:"+bigD1.subtract(bigD2)); System.out.println("bigD1乘以bigD2的结果是:"+bigD1.multiply(bigD2)); System.out.println("bigD1除以bigD2的商是:"+bigD1.divide(bigD2)); }