class Cat {
// 成员变量=属性=field(字段)
String name;
int age;
String color;
double weight;
}
Person p = new Person();
p.name = “jack”;
p.age = 10
Java 创建对象的流程简单分析:
先加载 Person 类信息(属性和方法信息, 只会加载一次)
在堆中分配空间, 进行默认初始化(看规则)
把地址赋给 p,p 就指向对象
进行指定初始化,比如 p.name =“jack” p.age = 10
Java 内存的结构分析
Java内存结构 中写道:
这里 p1,p2 是局部变量(放在栈中),它指向 new 出来的对象(放在堆中)。
在某些情况下,我们要需要定义成员方法(简称方法)。比如人类:除了有一些属性外( 年龄,姓名…),我们人类还有一些行为比如:可以说话、跑步…,通过学习,还可以做算术题。这时就要用成员方法才能完成。
成员方法的好处
成员方法的定义
访问修饰符 返回数据类型 方法名(形参列表..) {
//方法体
语句;
return 返回值;
}
方法体里面不能再定义方法!即:方法不能嵌套定义。
基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参!
引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参!
例如改变了
p.name = "1"
那么外面的 p 的 name 也会被改变。
但是
p = null
并不会使外面的 p 也变成 null。因为它只是让 p 不指向原来的堆了。
public Person copyPerson(Person p) {
Person p2 = new Person();
p2.name = p.name;
p2.age = p.age;
}
简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂问题,同时可以让代码变得简洁。
汉诺塔
public class HanoiTower {
public static void main(String[] args) {
Tower tower = new Tower();
tower.move(3, 'A', 'B', 'C');
}
}
class Tower {
//方法
//num 表示要移动的个数, a, b, c 分别表示 A 塔, B 塔, C 塔
public void move(int num , char a, char b ,char c) {
//如果只有一个盘 num = 1
if(num == 1) {
System.out.println(a + "->" + c);
} else {
//如果有多个盘, 可以看成两个 , 最下面的和上面的所有盘(num-1)
//(1)先移动上面所有的盘到 b, 借助 c
move(num - 1 , a, c, b);
//(2)把最下面的这个盘, 移动到 c
System.out.println(a + "->" + c);
//(3)再把 b 塔的所有盘, 移动到 c ,借助 a
move(num - 1, b, a, c);
}
}
}
输出结果为:
A->C
A->B
C->B
A->C
B->A
B->C
A->C
八皇后
面试题 08.12. 八皇后
51. N 皇后
52. N 皇后 II
java 中允许同一个类中,多个同名方法的存在,但要求 形参列表不一致!
重载的好处:
java 允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。
就可以通过可变参数实现。
基本语法
访问修饰符 返回类型 方法名(数据类型... 形参名) {
}
一个案例
public class VarParameter01 {
public static void main(String[] args) {
int[] a = new int[2];
System.out.println(a.getClass()); // class [I
HspMethod m = new HspMethod();
System.out.println(m.sum(1,2,3));
}
}
class HspMethod {
public int sum (int... nums) {
System.out.println(nums.getClass()); // class [I
int res = 0;
for (int i=0; i<nums.length; i++) {
res += nums[i];
}
return res;
}
}
打印了一下 int… nums 的类型,发现是 class [I ,和 int[] 的数据类型一样。
java 可变参数 (写的超级好的而一篇关于 java 可变参数的文章!)
构造方法又叫构造器(constructor),是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。它有几个特点:
基本语法:
[修饰符] 方法名(形参列表){
方法体;
}
Dog () {
}
class Person {
int age = 90;
String name;
Person (String n, int a) {
name = n;
age = a;
}
}
Person p = new Person("小威", 23);
java 虚拟机会给每个对象分配 this,表示当前对象。
简单的说,哪个对象调用,this 就表代表哪个对象。
this(name, gender, age);
this 不能在类定义的外部使用, 只能在类定义的方法中使用。
匿名对象
:只能使用一次
new Test().count1();
创建好之后就调用。