尽管java是基于c++的,但是相比之下,java是一种更“纯粹”的面向对象程序设计语言。
一、必须由你创建所有对象
一、存储到什么地方
java 中有五个不同的地方存储数据:
1. 寄存器:最快的存储区—处理器内部,数量有限,根据需求分配,不能直接控制
2. 堆栈:位于通用RAM(随口访问存储器)中,虽然某些java数据存储在里面,但是对象不存储在这里
3. 堆:一种通用的内存池(位于RAM区),用于存放所有的java对象,灵活性高但是消耗的时间比堆栈多
4. 常量存储:常量值通常直接存放在程序代码内部,这样做是安全的,因为他们永远不会被改变
5. 非RAM存储:数据完全存活在程序之外,它可以不受程序的任何控制,就算程序没有运行也一样可以存在,最基本的例子就是“流对象”和“持久化对象”。
二,特例,基本类型
基本类型 | 大小 | 最大值 | 最小值 | 包装器的类型 |
---|---|---|---|---|
boolean | —— | —— | —— | Boolean |
char | 16-bit | Unicode 0 | Unicode 216-1 | Character |
byte | 8 bits | -128 | +127 | Byte |
short | 16 bits | -215 | +215-1 | Short |
int | 32 bits | -231 | +231-1 | Integer |
long | 64 bits | -263 | +263-1 | Long |
float | 32 bits | IEEE754 | IEEE754 | Float |
double | 64 bits | IEEE754 | IEEE754 | Double |
void | —— | —— | —— | Void |
所有的数字类型都有正负号,所以不要去寻找无符号的数值类型、
是否有碰到这种情况:数值运算出来的值不是正确的值?
这种情况很常见,说明在运算过程中丢失了一部分信息,但不能因为数值运算就挡了java的路
所以java提供了两种高精度计算的类:
- BigInteger:任意精度的整数的计算,而且不会丢失任何信息
- BigDecimal:任意精度的定点数,例如,可以用它进行精确的货币计算
二、永远不需要销毁对象
在大多数程序设计语言里,变量生命周期的概念,占据了非常重要的部分,但是java将替我们完成所有的清理工作,从而大大简化这一问题,
java定义的基本类型的变量,在创建这个变量的这个作用域结束时就销毁(在这个作用域结束之前,你能再重新定义这个变量,要不会报编译错误)。
java的对象在在new出来后就会一直存在,就算创建此对象的作用域结束,对象也不会销毁,但也带来了有趣的现象,如果一直new对象,内存会不会满呢,从而阻塞你的程序,这就是java的一个神奇之处,它有一个垃圾回收器,监视所有用new创建的对象,并辨别那些不会再引用的对象,释放空间,给其他新的对象使用,所以,你根本不需要担心内存回收的问题
基本成员默认值
上面表格里除了最后一个void,其他的俗称八大基本类型
若类的某些成员是基本数据类型,即使没有初始化,java也会确保它会有一个默认的值,但是此方法不是不适合局部变量(即不是类的成员变量,而是类中方法的局部变量)。为了方便起见,在用这个基本变量时要进行初始化,要不可能会引起两个结果:
- 引起编译错误
- 你自己都不知道这个数是多少(这才是可怕的)
顺便说一下void,用的最多的地方是方法没有返回值才用void,在没有返回值的方法里,return只用来结束方法也就是退出方法,后面不跟东西。
在有返回值的方法里就很有趣了,首先它返回的类型要符合方法让它返回的类型。还能当结束循环,不过只能结束当前的循环,外层的循环需要标签,所以后面再整理。
三、static关键字
用new来创建对象时,数据存储空间才被分配,其方法才能被外界调用,才能让别人知道你这个对象里有这个方法可以被调用。但是有两种情况是上述方法无法解决的:
- 只想为某特定域分配单一存储空间,而不去考虑要创建多少对象,甚至不创建任何对象,
- 希望某个方法不与包含它的类的任何对象关联在一起,也就是说,即使没有创建这个对象,也能调用这个方法、
比如java里有很多包,包里有很多方法,但是你不可能这些对象都创建,要不对内存低的电脑就是灾难。
通过static关键字可以满足上述情况。所以这就是为什么java包里的方法基本上都用static来声明了。
用static修饰的方法在存储空间只有一份,看下面的例子
Class StaticTest{
static int i = 7;
}
现在你创建两个StaticTest对象
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
st1.i;
st2.i;
上面的st1.i和st2.i其实指向的是同一个存储空间,因此他们具有相同的值;
如果st1.i++了,那st2.i也会改变成48。
也可以表示为
StaticTest.i;
这就把上面4行代码代替了,如果想改变i的值直接
StaticTest.i++;
使用类名引用static是首选方式,不仅强调变量的static结构,还编译器的优化提供更好的机会。
尽管static作用于某个字段,但肯定改变了数据创建的方式:
因为一个static字段对每个对象来说都只有一份存储空间,而非static字段对每一个对象都有单独的存储空间。
非static字段又被称为非静态,static字段成为静态,记住一句话:
静态只能访问静态,非静态都能访问,但是静态可以在内部创建非静态的对象来访问非静态的方法和内部属性。
四、注释和嵌入式文档
java里有两种注释风格,一种源于c语言多行注释,一种源于c++单行注释。
/*这就是多行注释
*但是要注意的是在编译时这里面的内容会被忽略
*/
//这种是单行注释
共有三种类型的注释文档,分别对应注释位置后面的三种元素:类,域和方法
例子:
//类注释
public class Documentation1{
//域注释
public int i = 0;
//方法注释
public void f(){}
}
javadoc只能对public 和protected成员进行文档注释,private 和包访问权限的不能进行文档注释,不过可以用-private进行标记,以便private的成员的注释也在其中,
具体的有个别人的注释规范,大家可以去看一下
五、 编码风格
在“java编程语言编码规定”中,代码风格是这样规定的:类名的首字母大写,多个单词合并在一起,不能用下划线来分隔开。这又叫“驼峰风格”。只有标识符的第一个字母小写(变量名和方法名)