Java语言基础之数组

一、Java数组中toString()

问题描述:我定义了一个类,类名是Job,当我输出Job.toString()是可以按我重载的toString方法输出的,但是如果输出jobs[]这个数组时,只会输出[Lmodel.Job;@45e228。那么这是为什么呢?怎么输出数组内容呢?

解决方法:使用Arrays.toString(jobs)来输出。,

分析:java里,所有的类,不管是java库里面的类,或者是你自己创建的类,全部是从object这个类继承的。object里有一个方法就是toString(),那么所有的类创建的时候,都有一个toString的方法。这个方法是干什么的呢?

首先我们得了解,java输出用的函数print();是不接受对象直接输出的,只接受字符串或者数字之类的输出。

当print检测到输出的是一个对象而不是字符或者数字时,那么它会去调用这个对象类里面的toString 方法,输出结果为[类型@哈希值]。Object类中的toString()方法的源代码如下:

/** * Returns astringrepresentationoftheobject. In general,the* toString method returns astringthat*"textually represents"this object. Theresultshould  * be a concisebutinformative representationthatiseasyfora  * persontoread. * Itisrecommendedthatall subclasses override this method. *

* The toString methodforclassObject  * returns astringconsistingofthenameoftheclassofwhichthe* objectisan instance,theat-signcharacter`@',and*theunsigned hexadecimal representationofthehash codeofthe* object. In otherwords, this method returns astringequaltothe* valueof: *

*

 * getClass().getName() + '@' + Integer.toHexString(hashCode()) * 

* * @returnastringrepresentationoftheobject. */public String toString() {returngetClass().getName() +"@"+ Integer.toHexString(hashCode());}

而数组类中并没有对此方法重写(override),仅仅是重载(overload)为类的静态方法(参见java.util.Arrays)。所以,数组直接使用toString()的结果也是[类型@哈希值]。所以数组转为字符串应写成:Arrays.toString(a) 

这种方法的toString()是带格式的,也就是说输出的是[a, b, c],如果仅仅想输出abc则需用以下两种方法

方法1:直接在构造String时转换。

char[] data = {'a','b','c'};Stringstr =newString(data);

方法2:调用String类的方法转换。

String.valueOf(char[] ch)

二、Java中数组为null 和数组长度为0的区别

A、两者如果在一句代码中,则要先判断是否为空,否则可能会出现空指针异常。

eg:

if(array == null || 0 == array.length) {...}   // 这种写法正确,因为执行到 “0 == array.length”则说明数组不为空,不会产生空指针异常。

if (0 == array.length || array == null) {...} // 这种写法可能会产生空指针异常。

例:

int[] n; //只声明了一数组变量;                             

int[] nil = null; //声明一数组变量,并赋值 null,nil是一个数组类型的空引用,不指向任何对象;                            

int[] zero = new int[0]; //声明并创建一数组对象,长度是0;

B、Java语言支持两种数据类型,分别是基本数据类型和引用数据类型,而 null 是一种特殊的引用数据类型。

Student stu = new Student();    // 语句1

Student stu2;                            // 语句2

stu2 = new Student();                // 语句3

语句 1 先声明一个 Student 类型的变量 stu,然后利用 new 关键字为其创建实例。一步到位,定义了一个实例变量并同时赋值。

语句 2 是声明一个 Student 类型的变量 stu2,虽然从表述习惯上讲 stu2 是实例变量,但实际上此时 stu2 并未成为一个真正的实例,它仅仅只是一个变量名字。

语句 3 中的 stu2 才成为了一个 Student 实例,它指向了内存中的某块地址空间。

为了明确表示那些仅有名字而没有内存空间的变量的具体内容,Java 引入了关键字 null。 null 表示“空”的意思,是绝对意义上的空,这个空指的是不存在。

一个引用变量(当变量指向一个对象时,这个变量就被称为引用变量)没有通过 new 分配内存空间,这个对象就是空对象,Java 使用关键字 null 表示空对象。示例代码如下:

String str1= null;

str1 = "C语言中文网";

注意:null 是关键字,是大小写敏感的,不能将 null 写成 Null 或 NULL。

引用变量的默认值是 null。当试图调用一个空对象的属性或方法时,会抛出空指针异常(NullPointerException),如下代码所示:

String str1; // 相当于 String str1= null;

// 输出null字符串

System.out.println(str1);

// 调用length()方法

int len = str1.length();

第 5 行代码不会发生编译错误,但是当代码运行到第 5 行时,系统会抛出空指针异常。这是因为调用 length() 方法时,str1 是空对象。程序员应该避免调用空对象的属性和方法。

判断一个对象是否为 null,可以用if (obj == null) { }来判断。代码如下:

// 判断对象是否为null

if (str1 != null) {

int len = str1.length();

}

如果把上面代码改成如下代码:

String str2 = "";

int num = str2.length();

System.out.println(num); // 输出结果为0

运行以上代码时没有抛出异常,因为 str2 是一个值为""的字符串对象。""表示的是一个长度为 0 的空字符串,它在内存中会被分配一个空间,str2 是直接指向""内存空间的实例化对象。

产生空对象主要有以下两种可能性:

程序员自己忘记了实例化,所以程序员必须防止这种情况发生,应该仔细检查自己的代码,为自己创建的所有对象进行实例化并初始化。

空对象是其它地方传递过来的,需要通过判断对象是否为 null 进行避免。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352