如果我们说另一种不同的语言,我们会发现另一个不同的世界
2.1 用引用来操作对象
每个语言都有自己操纵内存元素的方式
在c c++中程序猿使用指针来来操作内存中的对象
而java中使用引用来操作对象 但是引用并不是对象 而是指向对象
对象是电视 那么 引用就是遥控器 我们可以通过遥控器来控制电视 同样java中我们可以通过引用来控制对象
电视 和 遥控器 都可以独立存在 所以你拥有一个引用并不代表 要有一个对象与之管理
例如 String A ; 我们只创建了一个引用 由于他没有对象无法通过 向A发送消息执任何行为 如果我们这么做就会收到错误提示
2.2 必须由你来创建对象
java 中使用 new 字来创建新对象
String a = new String(“sdfsdf”); //这种状态下引用和对象进行了关联 事实上 java 创建了引用就应该让引用于对象关联,即初始化引用
对象在内存中的存储
1.寄存器:最快的存储区域 位于CPU内部,空间有限,按照需求进行存储,我们无法控制,在程序运行时无法感知到它的存在。
2.堆栈:位于RAM(随机访问存储器)中,通过堆栈指针可以从处理器那里获得直接支持。堆栈指针向下移动则分配新的内存,向上移动则释放这些内存。这是一种快速有效的分配存储,效率仅次于寄存器。但是在程序执行时,必须严格的知堆栈站内所有对象的生命周期,以来控制堆栈指针的移动,以便维护堆栈控制对象资源的释放(c c++ 使用该策略执行进行资源的控制).... java为了程序的灵活性,放弃了该做法,在java中堆栈用来存储对象的引用 并不存放对象
3.堆:位于RAM中,一种通用的内存池,用于存放所有的java对象。堆的好处在于:编译器不需要知道存储的数据在堆里的生命周期,因此,在堆分配存储具有很强的灵活性。需要创建对象只需要new 关键字就能在堆里面进行存储分配 缺点:存储和分配,清理的速度较慢相对于堆栈存储(GC负责清理对象资源)
4.常量存储:常量值直接放在程序代码内部。 因为他永远不会改变...有时在嵌入式系统中,常量本身会与其他部分分离,所以在这种情况下,可以选择存放在ROM中(比如常量池)
5.非RAM存储: 流对象 持久化 数据库啥的
2.2.2 基本类型
bit 位 byte 字节(B) 1请记住好吗 java中的基本标量的 位数对于基本类型 java使用的不是new出对象放在堆里 而是 学习c c++相同的方法 创建一个非引用的"自动常量",这个常量直接存储“值”,并置于堆栈中,因此更加高效
基本类型具有包装类 使得可以在堆中创建一个非基本对象 ,来表示基本类型
char c = “x”;
Character ch = new Character(“x”);
ch = “x” //自动装箱
c = ch //自动拆箱
高精度数字
Java提过两个用于计算高精度的了: BigInteger 和 BigDecimal 类似包装类 但没有对应的基本类型
BigInteger : 支持任意精度的整数
BigDecimal:支持任意精度的定点数
2.2.3 Java中的数组
java中创建一个数组就相当于创建了一个引用数组,并且每个引用都指向了null
2.3永远不需要销毁对象
2.3.1 作用域
在作用域里定义的对象只可作用于作用域结束之前 { <-----scope-----> }
2.3.2对象的作用域
对象的作用域与基本类型不同
{
String s = new String(“123”);
}//End of scope
引用s在作用域终点就消失了,然而 对象 String(“123”)任然在堆中占据空间,我们无法在作用域之后访问该对象,因为它已经超出了作用域的范围。
2.4 创建新的数据类型:类
关键字 class + 类名 { }
2.4.1字段和方法
这里注意 在类中 定义的 字段中如果是 基本类型 java会默认为基本类型赋值
基本类型赋值但是在方法中 int x 是不会被默认赋值的
2.5 方法 参数和返回值
java的方法决定了一个对象可以接收什么样的信息
方法基本包括 名称 参数 返回值 方法体
void main(String[ ] arg){ 修饰符 + 返回值 + 名字 + ()+参数 +{ }
A a = new A();
a.f(); // 调用方法的行为我们一般称为 发消失给对象
}
2.5.1 参数列表
int getLength (String s ){
return s.length() ;
}
事实上在传递对象参数时 我们传递的是 对象的引用 因为 引用指向对象 所以可以控制对象
在java中对象的传递其实 就是对象引用的传递
这里 我想强调的是 基本类型(除String外) 传递的不是引用 而是指
2.6 构建一个java程序
2.6.1 名字空间 又名 命名空间
标识类的位置 同时也起到区分的作用 所以即使是同类名在java中只要包名不同 就无所谓了
使用import 来准确的表示导入那个包,即类库
如果我们在 在 import 后面加* 则表示我们导入改包下的所有类资源
2.6.2 static
当创建类时 就是在描述这个类的外观与行为 java中使用 new 来创建对象,数据空间才会被分配
这样有两个问题需要解决:1. 我只想在的定区域分配一个存储空间,而不想要创建多少对象
2.我不想使用对象就调用某些类的行为,我希望这个行为和对象没有关系
static 出现就是解决这类问题
static 方法或域 不予对象关联 而是与包含他的类相关联
使用 : 直接将static放在 类前面做修饰即可
例如 class Test {
static int k =0;
}
这个情况下 及时你创建了 连个 Test 对象
Test.i 也独享一份存储空间
两个对象共享一个 i
同样的静态方法也适用 :
class Incrementable{
static void increment (){
xxxx;
}
}
Incrementable.increment() 类名.方法名
当使用static 修饰某个字段时 , 那么这个字段的创建方式就发生了改变,
static字段对于每个对象都是只有一份存储空间,而非static字段 每个对象都有各自不同的存储空间
但是 static 修饰的方法 差异性却没有那么大
2.7 你的第一个java程序
java.lang 是默认导入在每个类中的
暂时结束
网友评论