l 关于对象以及存储方式的理解
Java中的所有场合都是通过引用来操纵对象的。Java中有6中内存分配方式,分别如下:
(1) 寄存器存储,该情况是通过编译器来自动决定的,空间小
(2) 堆栈(在RAM中),对象的引用,基本类型变量等都是存储这里的,这种方式在前面一个笔记中讨论过
(3) 堆(在RAM中),对象都是存储在这里的。这种方式前面笔记中也讨论过。
(4) 静态存储(在RAM中),“位置固定”,程序的整个运行期间都存在,static的变量和引用是这样存储的,对象不会
(5) 常量存储,常量存储在程序代码内部
(6) 非RAM存储,比如流对象和对象持久化,这些就是存储在磁盘内的。
l Java中的基本类型
这是特殊的一些类型,因为这些类型的变量占据空间很小,如果也像对象那样在堆里分配有点浪费空间,所以将它们存储在堆栈中。基本类型是变量,不是对象。创建了基本类型变量后可以给它们赋值。因为它们存储在堆栈中,所以大小是确定的,又因为java的跨平台性,所以它们的大小不会因为系统的不同而发生变化,是固定的。记住,int类型32位,char类型16位,byte类型8位。
基本类型有对应的包装器类,是用来把它们封装成对象的,好在堆中进行分配。
包装类经常用到的构造函数和方法有:
parseXXX(String)—将String对象转换为XXX基本类型值
new Integer(String)-- 将String对象转换为Integer对象
new Integer(int) -- 将int变量转换为Integer对象
l Java中的数组
Java中的数组会对其未初始化的元素进行默认的初始化,并且进行越界检查,虽然会耗费时间,但是带来了很高的安全性,非常值得。而C/C++中却不会这样,所以安全性低.
Java中创建的对象数组,实际是引用数组,存放的是引用.默认情况下,引用初始化为null
l 关于==和equals()方法的区别及应用场合
要判断两个基本类型的变量是否相等时使用==来判断,此时==判断的是变量的值是否相等。
要判断两个对象的内容是否相等时使用equals方法来判断,不要使用==,因为我们是通过引用来操作对象,==判断的是引用的值是否相等,因为引用的值实际上是所指对象的地址,所以==判断的是两个引用是否指向了同一个对象,这与我们要判断内容是否相等的目的不相符,编程时应该使用equals方法来判断对象是否相等。
而当用到我们自己定义的类时,需要覆盖基类Object中的equals()方法,因为Object类中的equals方法实现原理也是用==来判断对象是否相等的,即判断的是引用是否指向了同一个对象。
String类有个特例:
String s1 = “abc”;
String s2 = “abc”;
s1==s2 为true;(因为此时“abc”是存储在堆栈中的,系统会根据其值来判断是否要重新创建一个对象。如果已有就不用了。所以s1,s2指向了同一个对象)
String s1 = new String(“abc”);
String s2 = new String(“abc”);
s1==s2 为false;(因为此时是通过new来创建对象,不管其内容是否相同,new都会在堆中重新创建一个新的对象,所以s1,s2指向了不同的对象)
l 关于float和double基本类型之间的区别,及应用场合
float是单精度的,拥有7位的精度
double是双精度的,拥有16位的精度
double因为其精度高,所以占用空间要大,对double变量的运算速度也要慢很多,所以建议条件允许的时候尽量用float来声明变量。
l 关于String和StringBuffer的区别
String类是不可变的,所以像:
String s = “abc”;
s = s+”a”+”b”//系统会重新创建对象,这里创建了4个String对象
而StringBuffer类则是可以改变对象的内容的。如:
StringBuffer sb = new StringBuffer(“abc”);
sb.append(“a”);//这里没有重新创建一个新的String对象,只是将sb指向的对象的内容改为了“abca”
所以当需要经常改变字符串内容时建议使用StringBuffer类,这样消耗内存小,速度快
l BigInteger和BigDecimal的使用
在java中像float和double这些基本浮点类型,不能用于精确度高的计算,虽然大多数情况下,都是准确的,但有时候也会出现一个精度的偏差。所以引入了BigInteger和BigDecimal类来进行高精度的计算,它们的计算是通过调用方法来实现的,虽然速度有影响,但是换来了精度是值得的。(在商业计算用途中就要这种方式来计算)
如何使用这两个类来实现运算,可以参考网页,http://www.javadby.com/yuyanjichu/20071005/1075.html
一般是将double变量转换为String对象,然后再转换为BigDecimal对象,这样精度才准确,如果直接用构造方法new BigDecimal(double val),参数val也会带来精度问题的。而且首选是调用BigDecimal.valueOf(double val);而new BigDecimal(Double.toString(double val))比较麻烦;
一般用BigDecimal来实现一个专门用于高精度计算的类。
而BigInteger是用来表示大整数的及大整数计算的,因为当整数太大时,会超出基本类型所能表示的范围。其运算方法和BigDecimal相似。
l 关于作用域和生命周期的理解
{}表示作用域范围。
{
String s = “a”;
{
String s = “b”;
}
}
这段代码在java中会抛错,因为在java中不允许重复定义同名的引用变量和基本类型变量的,即使是在不同的作用域内。而C/C++中是允许这么做的。
Java中的引用变量和基本类型变量在超出作用域范围后,自动消失。而对象的不会消失的(如果还有其他的引用指向它的话),其生命周期是由“垃圾回收器”来决定的。当垃圾回收器检测到该对象不再被引用时,会自动释放其所占的内存空间。无需手动操作,这样就避免了C++中的内存泄露问题。
l 关于java中全局变量(即类的属性)和局部变量的默认初始化
Java中对其属性,如果是基本类型变量则默认初始化为特殊值,其对应表可以在《java编程思想》P33中查到。而如果是引用变量,则将其指向为null。这和C++不一样的。
而对于局部变量,则初始化为任意值,并且当你使用没有自己初始化的局部变量时会抛错,比C++的警告要更安全。所以建议的方法是声明局部变量的时候就进行初始化
l Java中同一个类中不可以重写方法,继承类的时候可以重写方法。Java中也是通过方法名和参数列表来唯一标示一个方法的。
l 关于javadoc文档的形成
文档有三种,类,变量,方法文档
/**…*/中的注释可以产生javadoc文档
在注释中可以嵌入HTML标记
同时也可以通过@来加入独立标签,如(@version,@arthor,@apram,@return等,详细描述看《java编程思想》P41-42)
缺省条件下,产生的是public和protected修饰的内容所对应的文档
Javadoc命令的使用方法,上网搜,可以参考网页:http://tanzek.blog.51cto.com/95629/15808
l 命令行参数的获取
public class TestCmd
{
public static void main(String[] args){
for(int i = 0;i<args.length;i++){
System.out.println(args[i]);
}
}
}
示例:运行java TestCmd a b c时
则打印出 a
b
c
即在类名后面的字符串开始填入args数组中,而且是以空格来分隔字符串的
l final到底修饰的是什么
final用来修饰基本类型变量时,要求其值不能被修改
final用来修饰引用变量的时候,要求该引用只能指向初始化的那个对象,即引用变量的值不能改变,也就是对象所占的内存地址
l 对于instanceof的理解
instanceof是用来判断左边对象是否属于右边类的,返回boolean值。
用到instanceof的地方都可以用方法重载和多态的办法来替代,建议不要用instanceof,这样不能更好体现面向对象的思想