类与方法

类就是自定义的数据类型,包括属性和方法,由类创建的变量称作实例;

我不知道我的比喻对不对,欢迎大家指正;

感觉这个类像是我们用的那些基础数据类型一样,创建的时候要符合该数据类型的创建规则,比如int,int[]等,使用的时候也只能使用其中规定的方法;只不过这里是我们自设置的规则和相关的方法

举例:

定义一个猫类,包括名字,年龄,喜好,行为(方法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// class.java
public class class01{
public static void main(String[] args){
//创建一个实例
Cat cat1 = new Cat();
cat1.name = "white";
cat1.age = 3;
cat1.hobby = "fishes";
// cat2是对象的变量名,只是一个填充真正实例地址的变量
// 真正的实例是new Cat()创建的空间
Cat cat2 = new Cat();
cat2.name = "black";
cat2.age = 5;
cat2.hobby = "noodles";

System.out.println("cat1 " + cat1.name + " "+cat1.age + " " + cat1.hobby);
System.out.println("cat2 " + cat2.name + " "+cat2.age + " " + cat2.hobby);
}
}

class Cat{
String name;
int age;
String hobby;
};
  • 基本介绍

    • 成员变量 = field字段 = 属性
    • 属性是类的一个组成部分,一般是基本数据类型,也可以是引用类型
  • 注意

    • 访问修饰符

      • public, proctected, 默认, private
    • 属性如果不赋值,会有默认值,具体默认值上一次有记录

创建方式

  1. 先声明再创建
1
2
Cat cat;
cat = new Cat();
  1. 直接创建
1
Cat cat = new Cat();

成员方法

类除了属性之外,还有动作(方法)

举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// class02.java
public class class02{
public static void main(String[] args){
Person p1 = new Person();

p1.speak("Jack"); // Hello Jack
System.out.println(p1.sum(1, 2));//3
}
}

class Person{
String name;
int age;

// public表示方法公开
// void表示方法没有返回值
// speak是方法名,()是形参列表
// {}是方法体,写需要执行的代码
public void speak(String name_other){
System.out.println("Hello " + name_other);
}

public int sum(int n1, int n2){
return n1 + n2;
}
}

递归

有些问题比较复杂,而且思路都一样,可以使用自己调用自己的方法来解决相关的问题,例如:

1
2
3
4
5
6
public int sum(int n) {
if (n <= 1) {
return 1;
}
return sum(n - 1) + n;
}

==经典案例:==汉诺塔,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。 并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//Hano.java
import java.util.Scanner;
public class Hano{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.print("n = ?");
int n = scan.nextInt();
T t1 = new T();
t1.move(n, 'a', 'b', 'c');
}
}
class T{
public void move(int num, char a, char b, char c){
if (num == 1) System.out.println("1:" + a + "->" + c);

else {
move(num - 1, a, c, b);
System.out.println(num + ": " + a + "->" + c);
move(num - 1, b, a, c);
}
}
}

作业:

  • 利用程序输出斐波那契数列,其数值为:1、1、2、3、5、8、13、21、34……在数学上,这一数列以如下递归方法的定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)。

  • n皇后问题:在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。

重载

构成重载的要求:

  • 方法名字必须一致
  • 方法的参数数量可以不一样
  • 方法的形参和返回类型不影响
  • 参数类型一样,但是传入的顺序不一样也可以
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public int test(){
System.out.println("test1");
return 1;
}

public void test(int a){
System.out.println("test2");
}

//以下两个参数类型顺序不同
public String test(int a,String s){
System.out.println("test3");
return "returntest3";
}

public String test(String s,int a){
System.out.println("test4");
return "returntest4";
}

可变参数

将方法名称相同,功能相同,传入的参数的数据类型一样,返回数据类型一致,但是传入的参数不同的方法可以封装成一个方法。用法与数组差不多,举例:

1
2
3
4
5
6
7
public int Sum(int...nums){
int res = 0;
for(int i=0; i < nums.length; i++){
res += nums[i];
}
return res;
}

要求:

  • 可变参数的实参可以为0或者多个
  • 可变参数的实参可以为数组
  • 可变参数的本质是数组
  • 可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后
  • 一个形参列表只能出现一个可变参数