学习笔记(三)

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         关于floatdouble基本类型之间的区别,及应用场合

float是单精度的,拥有7位的精度

double是双精度的,拥有16位的精度

double因为其精度高,所以占用空间要大,对double变量的运算速度也要慢很多,所以建议条件允许的时候尽量用float来声明变量。

l         关于StringStringBuffer的区别

String类是不可变的,所以像:

String s = “abc”;

s = s+”a”+”b”//系统会重新创建对象,这里创建了4String对象

StringBuffer类则是可以改变对象的内容的。如:

StringBuffer sb = new StringBuffer(“abc”)

sb.append(“a”);//这里没有重新创建一个新的String对象,只是将sb指向的对象的内容改为了“abca

所以当需要经常改变字符串内容时建议使用StringBuffer,这样消耗内存小,速度快

l         BigIntegerBigDecimal的使用

java中像floatdouble这些基本浮点类型,不能用于精确度高的计算,虽然大多数情况下,都是准确的,但有时候也会出现一个精度的偏差。所以引入了BigIntegerBigDecimal类来进行高精度的计算,它们的计算是通过调用方法来实现的,虽然速度有影响,但是换来了精度是值得的。(在商业计算用途中就要这种方式来计算)

如何使用这两个类来实现运算,可以参考网页,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

缺省条件下,产生的是publicprotected修饰的内容所对应的文档

 

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,这样不能更好体现面向对象的思想

   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值