1创建对象
String s ;创建引用,并未初始化,即引用未关联任何东西
String s2="asda"; 初始化
System.out.println(s2);
System.out.println(s);//报错
用new 来初始化
String s = new String("sgjadfjaf");
1.1如何存储
程序运行时,对象时怎么放置安排的呢?内存怎么分配的呢?
(1)寄存器
--处理器内部,外部程序感觉不到其存在
(2)堆栈
--位于RAM(随机访问存储器中),通过堆栈指针可以从处理器那里获得直接支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。java系统必须知道存放在堆栈上所有对象的确切生命周期,以便上下移动堆栈指针,但这一约束限制了程序的灵活性,所以最燃某些java数据存储在堆栈中--特别是对象引用,但是java对象并不存在其中。
(3)堆
一种通用的内存池(也位于RAM中),用于存放所有的java对象。堆不同与堆栈的好处是:编译器不需要知道存储的数据在堆栈里存活多长时间。因此在堆里分配时有很大的灵活性。当需要一个对象时,只要new一下,当执行到new时,会自动在堆里进行存储分配。当然,这种灵活性也要付出相应的代价;用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多的时间。
(4)常量对象
常量值通常直接存放在程序代码内部,这样做是安全的,因为他们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分割离开,这种情况下可以存放在只读存储器ROM中。
(5)非RAM存储
如果数据完全存活在程序之外,那么它可以完全不受程序的任何控制,在程序没有运行时也可以存在。其中两个基本的例子是 流对象和持久化对象。在流对象中,对象转化成字节流,通常被发送给另一台机器。在“持久化对象”中,对象被存放于磁盘上,因此即使程序被终止,他们仍能保持自己的状态。这种存储的技巧在于:把对象转化成可以存放在其他媒介上的事物,在需要时,可以恢复成常规的、基于RAM的对象。java提供了对轻量级持久化的支持,而存储JDBC和hibernate这样的机制提供了更加复杂的对在数据数据库中存储和读取对象信息的支持。
1.2 特例:基本类型
在程序设计时经常使用到一系列基本类型,他们需要特殊对待,因为new将对象存储在“堆”里,故用new创建一个对象--特别是小的、简单的变量,往往不是很有效。java对于这种类型不用new 来创建变量,而是创建一个并非是引用的“自动”变量、这个变量是直接存储“值”,并置于堆栈中,因此更加高效。
序号 |
数据类型 |
位数 |
默认值 |
取值范围 |
包装器类型 |
1 | byte(位) | 8 | 0 | -2^7 - 2^7-1 | Byte |
2 | short(短整数) | 16 | 0 | -2^15 - 2^15-1 | Short |
3 | int(整数) | 32 | 0 | -2^31 - 2^31-1 | Integer |
4 | long(长整数) | 64 | 0 | -2^63 - 2^63-1 | Long |
5 | float(单精度) | 32 | 0.0 | -2^31 - 2^31-1 | Float |
6 | double(双精度) | 64 | 0.0 | -2^63 - 2^63-1 | Double |
7 | char(字符) | 16 | 空 | 0 - 2^16-1 | Character |
8 | boolean(布尔值) | 8 | false | true、false |
Boolean |
9 void Void
JAVA提供 了自动拆装箱的功能
高精度数字
java提供了两个高精度计算的类:BigInteger 和 BigDecimal,它们大体属于包装器的范畴,但是却没对应的基本类型。
这两个类以方法调用的方式取代运算符方式来实现运算,所以速度会比较慢,但是以速度换取了精度
BigInteger 支持任意精度的整数,可以表示任意大小的整数值,而不损失精度。
BigDecimal 支持任意精度的定点数,可以进行精确地货币计算
1.3java中的数组
java会确保数组被初始化,而且不能被他的范围之外访问。这种范围检查是以每个数组上少量的内存开销及运行时的下标检查为代价的,因此换来了安全性和效率的提升。
当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化一个特定值,该值拥有自己的关键字null.一旦java看见null,就知道这个引用还未指向某个对象,运行时就会报错。
2.永远不需要销毁对象
2.1 作用域
{
}
2.2对象的作用域
java对象的作用域不具备和基本类型一样的生命周期。new一个java对象时,它可以存活作用域之外。
{
String s = new String(" a String");
}//end of Scope
引用s在作用域终点就消失了。然而s指向的String对象继续占用着内存空间。java通过垃圾回收器完成对不在引用的对象的回收,释放内存空间。
2.3创建类
class
字段和方法
方法、参数和返回值、参数列表
2.4 static关键字
static关键字解决了,一种情形是,只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至不需要创建对象。另一种情形是,希望某个方法不与包含它的类的任何对象关联在一起,即使没有创建对象,也能够调用这个方法。
当声明一个事务是static时,就意味着这个域或者方法不会与包含它的那个类的任何对象实例关联在一起。所以,即使从未创建某个类对象,也可以调用它。
尽管当static作用于某个字段时,肯定会改变数据创建的方式(因为一个static字段对每个类来说都只有一份存储空间,而非static字段则是对每个对象有一个存储空间),但是如果static作用域某个方法,差别却没有那么大。static方法的一个重要用法就是在不创建任何对象的前提下就可以调用它,正如我们所看到的那样,这一点对main()方法很重要,这个方法是运行一个应用的入口点。
和其他任何方法一样,static方法可以创建或使用与其类型相同的被命名对象,因此,static方法常常拿来做“牧羊人”的角色,负责看护与其隶属同一类型的实例群。
原文地址:https://www.cnblogs.com/flgb/p/10633064.html