第八章 方法
1.作业回顾
1,使用for循环求1-100的和。
public class Day081 {
public static void main(String[] args) {
//1,使用for循环求1-100的和。
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum = sum + i;
}
System.out.println(sum); //5050
}
}
2,使用for循环打印1-100的偶数。
public class Day082 {
public static void main(String[] args) {
//2,使用for循环打印1-100的偶数。
for (int i = 1; i <= 100; i++) {
if(i % 2 == 0) {
System.out.println(i);
}
}
}
}
3,使用嵌套的for循环打印99乘法表。
public class Day083 {
public static void main(String[] args) {
//3,使用嵌套的for循环打印99乘法表。
/*1×1=1
1×2=2 2×2=4
1×3=3 2×3=6 3×3=9
1×4=4 2×4=8 3×4=12 4×4=16
1×5=5 2×5=10 3×5=15 4×5=20 5×5=25
1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36
1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49
1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64
1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81*/
//m代表行数,n代表列数
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "*" + i + "=" + (i*j) + " ");
}
System.out.println();
}
}
}
2.方法的定义
下面是打印直角三角形的例子
public class Day084 {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
方法是一段可以重复执行的代码 。
方法总是预先设计好,并且在被调用的时候执行。
package aaa;
public class Day084 {
public static void main(String[] args) {
//调用Day084类的print方法
//当方法被调用时,执行方法中的代码
//当print方法中的代码块执行结束后,才会继续执行main方法中后续的代码
// Day084.print();
//由于print方法和main方法在同一个类中,因此可以忽略掉类名直接调用
print();
System.out.println("第一个方法结束调用");
Day084.print();
System.out.println("第二个方法结束调用");
Day084.print();
System.out.println("第三个方法结束调用");
}
//public指示这个方法是公有的,可以在其他类中调用
//static指示这个方法是静态的,可以不创建对象通过类名调用
//void指示这个方法是没有返回值的
//这是方法声明,方法声明不必在main方法之前
//{}之间的代码是方法体
//方法的名字是print
//每个方法都提供一个功能
//这个方法的功能是打印一个5行的直角形
public static void print() {
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
package abc;
import aaa.Day084;
public class Day085 {
public static void main(String[] args) {
//调用Day084的print方法
Day084.print();
}
}
3.向方法传递参数
public class Day806 {
public static void printX(int num) {
for (int i = 1; i <= num; i++) {
for (int j = 1; j <= i ; j++) {
System.out.print("*");
}
System.out.println();
}
}
public static void main(String[] args) {
// 7是实际参数
// 调用printX时,7将被拷贝给形式参数num
printX(7);
// 10是实际参数
// 调用printX时,10将被拷贝给形式参数num
printX(10);
int n = 5;
printX(n);
// printX("5"); //编译错误,实际参数的类型,必须要和形式参数匹配
}
}
方法参数可以有多个
public class Day807 {
//动态控制三角形的行数num和图案str
//调用这个方法时必须传递两个参数,int和str
public static void printX(int num, String str) {
for (int i = 1; i <= num; i++) {
for (int j = 1; j <= i ; j++) {
System.out.print(str);
}
System.out.println();
}
}
public static void main(String[] args) {
//打印7行的,使用.组成的直角三角形
//7传递给了num,.传递给了str
printX(7, ".");
//打印10行的,使用o组成的直角三角形
//n和str是实际参数,它们的值将被拷贝给对应的形式参数
int n = 10;
String str = "o";
printX(n, str);
}
}
4.方法返回值
public class Day0881 {
public static void main(String[] args) {
System.out.println(f1());
System.out.println(f2());
System.out.println(f3());
f4(-1);
}
//如果方法声明了返回值,那么就必须要返回一个值
// public static int f() {
//
// }
//实际返回的数据类型必须和声明的返回值的类型相匹配
// public static int f() {
// return "你好";
// }
public static int f1() {
return 'A'; //65
}
public static int f2() {
return (int)10L; //10
}
public static long f3() {
//int可以自动转换成long
return 1; //1
}
//void方法也可以使用return
public static void f4(int num) {
if(num <= 0) {
System.out.println("数据非法");
//return;表示终止方法执行
return;
}
//动态控制三角形的行数num
for (int i = 1; i <= num; i++) {
for (int j = 1; j <= i ; j++) {
System.out.print("*");
}
System.out.println();
}
}
//return语句后面不能再有其他代码
public static int f() {
return 0;
// System.out.println("Hello"); //编译错误
}
}
5.方法重载
在同一个类中,一个方法可以和另外一个方法有相同的方法名,但是必须有不同的参数列表,这种情况叫做方法重载。
方法重载,可以为一组方法使用相同的名字,增加可读性。
public class Day089 {
//同一个类中不能有重复的方法签名,方法签名由 方法名+(参数列表)组成
//参数列表为空
//方法签名为f()
public static void f() {
System.out.println("f()");
}
//参数列表为int
//方法签名为f(int)
//变量名不属于参数列表
public static void f(int number) {
System.out.println("f(int number)");
}
//参数列表为int
//方法签名为f(int)
//编译错误,参数名不属于参数列表,因此方法重复定义
// public static void f(int n) {
//
// }
//方法签名f(int , String)
public static void f(int number, String str) {
}
//方法签名f(String, int)
public static void f(String str, int number) {
}
public static void main(String[] args) {
f(); //f()
f(1); //f(int number)
}
}
public class Day0810 {
public static int max(int a, int b) {
return a > b ? a : b;
}
public static double max(double a, double b) {
return a > b ? a : b;
}
public static void main(String[] args) {
//在调用方法时,编译器会根据实际参数的类型查找匹配的方法
System.out.println(max(1, 2)); //2
System.out.println(max(1.0, 2.0)); //2.0
//调用max(double a, double b),因为float可以自动转换为double
System.out.println(max(1.0f, 2.0f)); //2.0
//以println方法演示方法重载
System.out.println(1); //1
System.out.println("a"); //a
System.out.println(2L); //2
}
}
6.变量的作用域
变量的作用域决定了变量可以在什么地方被访问到。
变量的作用域决定了变量什么时候产生,什么时候销毁。
public class Day0811 {
//声明了一个类变量,是全局变量,只要能访问到它,都可以直接使用
//可以在本类的所有方法中使用
//也可以在其他类的方法中使用
//前提是这个类变量使用了public修饰符
//如果使用private修饰符,只能在本类中访问
public static int count = 0;
public static void f1() {
//n在方法中声明的,它的作用域是从声明的地方开始,一直到方法结束
int n = 2;
if(n >= 2) {
//a在if块中声明的,它的作用域是从声明的地方开始,一直到块结束
int a = 5;
System.out.println(a);
}
System.out.println(n);
// System.out.println(a); //编译错误,a已经销毁
System.out.println(count);
}
public static void f2() {
// System.out.println(n); //编译错误,n是在f1方法中声明的
// System.out.println(a); //编译错误,a是在f1方法中声明的
System.out.println(count);
}
public static void f3(int n) {
System.out.println(n);
System.out.println(count);
}
public static void main(String[] args) {
}
}
7.使用类常量和类方法
在类中使用static修饰的变量叫做类变量 。
public static int count = 0;
如果使用final修饰类变量,就成为了类常量 。
public static final int count = 0;
在类中使用static修饰的方法叫做类方法 。
public class Day0813 {
//类变量
public static int x = 0;
//类常量
public static final int count = 0;
//类方法
public static void f() {
}
public static void main(String[] args) {
//访问Math类的类常量PI
//public static final double PI = 3.14159265358979323846;
System.out.println(Math.PI);
}
}
8.练习
1,定义一个方法,功能是打印m行n列的指定符号的矩形,在主方法中调用此方法。
2,定义一个方法,功能是计算长为x,宽为y的矩形的面积,在主方法中调用此方法,在主方法中打印结果。
3,定义一个方法,实现找出三个数的最大值,并在主方法中调用此方法,在主方法中打印结果。