数组
一种数据结构/类型,是“数据组”的简称,也就是“一组数据”的意思。这组数据可以有多种排列方式。比如可以排成一排;也可以排成一个矩阵,成为一个平面;当然也可以从二维拓展到三维。
总而言之,把一坨同属一个类别的数据放在一起,就是“数组”。而P图,P的就是像素的数组。
旋转图片的像素对应
/************************************************
* 旋转前,旧图片的信息
************************************************/
int[][] oldPixelArray = source.getPixelArray(); // 旧图片数组
int oldHeight = oldPixelArray.length; // 旧图片高度
int oldWidth = oldPixelArray[0].length; // 旧图片宽度
/************************************************
* 旋转前,旧图片的信息
************************************************/
int newHeight = oldWidth; // 新图片高度等于旧图片宽度
int newWidth = oldHeight; // 新图片宽度等于旧图片高度
int[][] newPixelArray = new int[newHeight][newWidth]; // 为新图片新建一个数组,行数是newHeight,列数是newWidth
/************************************************
* 新旧数组的像素对应关系
************************************************/
for (int yNew = 0; yNew < newHeight; yNew++) {
for (int xNew = 0; xNew < newWidth; xNew++) {
int yOld = xNew;
int xOld = oldWidth - yNew - 1;
newPixelArray[yNew][xNew] = oldPixelArray[yOld][xOld];
}
}
return new GImage(newPixelArray);
}
图片在电脑上是由一个个像素点组成的,旋转图片也就是把这些像素点按照旋转后的样子重新排列了一遍。
值类型和引用类型
public class Array {
static void incArray(int[] a) { a[0]++; }
//incArray(int[] a),(括号里的代表参数,包括数据类型和变量名)
static void incInt(int a) { a++; }
static void rebindArray(int[] a) { a = new int[]{9,9,9}; }
public static void main(String[] args) {
/* Code snippet 1 */
int foo = 5; // now foo=5
//这是一个值类型
incInt(foo);
/*函数参数所传进去的,是一个值,5 。然后在函数里,a++自加,这个过程中,函数新建了一
个内存地址,并在这个内存地址中运算,这和函数外面的内存地址无关。且随着函数的出栈,这个变量会
销毁。*/
System.out.println("foo=" + foo);
//所以这里打印的是5。
/* Code snippet 2 */
int[] bar = new int[]{1,2,3}; // now bar[0]=1
//这是一个引用类型,指向一个内存地址
incArray(bar);
/*函数参数所传进去的,是一个内存地址。然后在函数中a[0]++,这个过程中,函数操作的还是外面那
块内存地址,所以即使函数出栈,但外面那块内存地址中的东西已经被改变了*/
System.out.println("bar[0]=" + bar[0]);
//所以这里是2
/* Code snippet 3 */
rebindArray(bar);
/*函数参数所传进去的,是一个数组型的内存地址。但在函数中, a = new int[]{9,9,9};这个过
程中,a重新绑定了一个新的内存地址,所以和外面那个内存地址已经无关了。随着函数的出栈,a也被
销毁*/
System.out.println("bar[0]=" + bar[0]);
//所以这里还是2
/* Code snippet 4 */
int baz = bar[1]; // now baz=bar[1]=2
/*现在把bar[1]这个值赋值给int baz,是新建了一个内存地址,且是一个值类型,已经和bar[1]的
内存地址无关了*/
baz++;
/*baz++,这种值类型的运算,并不是在原来的内存地址中修改,而是新建一个内存地址,或者说新绑
定一个内存地址,然后销毁原来内存地址。*/
System.out.println("bar[1]=" + bar[1]);
//所以这里bar[1]还是原来那个,是2
}
}
java中数据在使用的时候分为两种类型,一种是值类型,一种是引用类型。应该可以认为8种基本类型为值类型。上面讲的是函数参数两种类型的结果,如果是在函数外面已经定义了的变量,不作为参数传给函数,而是在函数中直接使用的话。也就是没有声明,在函数里不会给他分配一个新的内存地址,变量所作的修改会覆盖原声明变量的赋值。
类和对象,我可以简单理解为,类就是概括了一类对象属性和行为的模板,对象就是类的实例化。
变量是程序中基本的存储单元,是内存中的一块存储区域,用来存放数据。
创建一个对象会用到new关键字,但是给一个基本类型变量赋值却不是用new. 因为基本类型是Java语言里的一种内置的特殊数据类型,并不是某个类的对象。
给基本类型的变量赋值的方式叫做 字面值