注意:String 是引用类型,所以堆中的name和color存放的是地址,指向常量池中的常量
1、先声明再创建
Cat cat;//声明了一个对象,在栈中,指向null
cat = new Cat();// 在堆中开辟了一个空间,同时把栈中的引用变量cat指向堆中地址
2、直接创建
Cat cat = new Cat();
当程序执行到方法的时候会开辟一个独处的栈空间
如:
结论: 基本数据类型传递的是值传递(值拷贝),形参的任何改变不影响实参
结论: 引用类型传递的是地址(地址拷贝),可以通过形参影响实参
补充:引用数据类型分3种:类,接口,数组
类:Object,String,Date,Void
public class test {
public static void main(String[] args) {
Person p = new Person();
p.name = "aaa";
p.age = 26;
Mytools tools = new Mytools();
Person p2 = tools.copy(p);
}
}
class Person {
String name;
int age;
}
class Mytools {
public Person copy(Person p) {
Person p2 = new Person();
//如果是 Person p2 = p;则不是拷贝一个新对象了,而是拷贝了地址
p2.name = p.name;
p2.age = p.age;
return p2;
}
}
第一步,定义函数功能
第二步,寻找递归终止条件
第二步,递推函数的等价关系式
public class test {
public static void main(String[] args) {
//定义迷宫,0代表无障碍,1代表有障碍,2代表能走,3代表走过走不通
int[][] arr = new int[8][7];
for (int i = 0; i < 7; i++) {
arr[0][i] = 1;
arr[7][i] = 1;
}
for (int i = 1; i < 7; i++) {
arr[i][0] = 1;
arr[i][6] = 1;
}
arr[2][1] = 1;
arr[2][2] = 1;
arr[3][2] = 1;
arr[3][3] = 1;
// arr[1][2] = 1;
Mouse mouse = new Mouse();
mouse.findWay(arr, 1, 1);
for (int[] i : arr) {
for (int j : i) {
System.out.print(j + " ");
}
System.out.println("");
}
}
}
class Mouse {
//定义规则,下右上左
Boolean findWay(int[][] arr, int i, int j) {
//递归终止条件:能走出,出口标志位为2或者四个方向都不能走标志位为3
if (arr[6][5] == 2) {
return true;
} else {
if (arr[i][j] == 0) {
//假定可以走通
arr[i][j] = 2;
if (findWay(arr, i + 1, j)) {
return true;
} else if (findWay(arr, i, j + 1)) {
return true;
} else if (findWay(arr, i - 1, j)) {
return true;
} else if (findWay(arr, i, j - 1)) {
return true;
} else {
//上下左右都不能走,则假定失败,标志位为3
arr[i][j] = 3;
return false;
}
} else {
return false;
}
}
}
}
/*上述可以看出,每次都会有将最大的一个从A移动到C的步骤。假如有n(n>1)个需要移动的盘子,我们可以将这些步骤分为3步:
1、将1到n-1的盘子通过C的辅助从A移动到B
2、将第n个盘子移动到C
3、将1到n-1个盘子通过A辅助从B移动到C*/
class HanoiTower {
void move(int num, char a, char b, char c) {
if (num == 1) {
System.out.println(a + "==>" + c);
} else {
move(num - 1, a, c, b);
System.out.println(a + "==>" + c);
move(num - 1, b, a, c);
}
}
}
方法名相同,形参列表不同,和形参名,返回的数据类型无关,包括:
注意: 全局变量可以没有初始值,但是局部变量必须要有初始值
注意:在方法的形参中如果传的是基本数据类型或者String则不会改变实参的值,如果传的是对象集合或数组会改变实参的值
注意:构造器也不能写void,每个构造器都有一个默认的super()
细节:
this指向当前对象
注意:不是name=this.name而是this.name = name
访问成员方法,调用当前对象的某个方法
在构造器中访问另一个构造器,可以实现构造器的复用
注意:只能在构造器中使用,this必须在第一行,
this访问本类属性