您的位置:首页 > 编程语言 > Java开发

Java Notes: Loops and Arrays & Methods and Class

2017-02-04 06:39 381 查看
Java的数组在内存中是怎么样的?

例如:int[] grades = new int][]{70,50,66,43,99,85,73,};



grades是一个具有“自动存储(automatic storage)”的变量。所谓“自动存储”,意思是这个对象的存储位置取决于其声明所在的上下文。如果这个语句出现在函数内部,那么它就在栈上创建对象。如果这个语句不是在函数内部,而是作为一个类的成员变量,则取决于这个类的对象是如何分配的。(多数在堆上,少数在静态区)。【参考另一个篇链接:http://blog.csdn.net/firehotest/article/details/52044794】

而指向的实际内容则永远存在堆上。首先是指向一个数组的描述(description)。接着,就是数组的实际内容。

两种内容类型的Java数组:

当Java存储的是基本类型(primitive types),存储的是实际的内容。而当是自定义类型时,是reference type。这时候,当发生swap时,前者交换的是实际的内容,而当时reference type时,只是reference type改变了,指向的内容不变。

当你用到浮点数都需要Keep in mind的一点:所有的浮点数只是approximation,如果有判断条件是double x1 == 0.0,即使计算结果正确是等于0,但也不一定成立。因为x1可能是0.00000000000000...01

关于String和StringBuilder应该知道的:

String永远是不能被改变的。当你使用substring方法时候,返回是一个新的String。调用方法的本身String内容不会被改变。

但是StringBuilder不一样,是可以改变调用方法的StringBuilder对象的。(Quiz3当中有一题阴了大家一道:StringBuilder的constructor只有参数是: char[], int capacity和String)三种。没有把char当做参数的。所以,如果你输入一个char作为参数,其会被理解成Int。

String sort by ascii code. Capitalized one is in front of lower case one. (默认的排序)

Java中的identity 和 equality:


首先需要区分两者的区别。identical 的两个reference类型的变量,指的是两个reference指向的对象是同一个对象。而如果两个reference变量是equal只需要两个reference指向的对象的state相同。state有很多的含义,像String的state是其内容。

所以,一般你自定义一个新的类的时候,都需要重写其从Object处继承的equals函数。默认equals函数检查的是hashCode(),其实就是identity. 因为Java的Object使用的hashCode就是返回其指向的内存地址的16进制表示。

但这里通常人们会犯的错误是只是重载了函数(Overload)而不是重写 (Override)。譬如,我创建了Person类,对比两个Person是否equal是判断其名字是否一样:

public boolean equals(Person obj) {
//this is a overload
}

but

@Override
public boolean equals(Object obj) {
//this is a override
}

这是为什么呢?这涉及到另一个知识点。

Java中methods' signature 只包含:参数列表和函数名。注意,返回类型不属于函数签名。

所以,一般重载会使用同样的函数名但不同的参数类型实现。

不同权限描述符的可见性:



注意,protected其实是比default要大的。因为default只能包内可见,而protected对于包外的子类都可见。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java
相关文章推荐