标签:-o 执行 覆盖 编译器 引用 签名 不同的 ati sys
Java方法是语句的集合,他们在一起执行一个功能
方法是解决一类问题的所需步骤的有序集合
方法包含于类或对象中
方法在程序中被创建,在其他地方被引用
设计方法时,要尽量保证方法的原子性,就是一个方法只完成一个功能,有益于后续扩展
//语法
修饰符 返回值类型 方法名(参数类型 参数名){
方法体
return 返回值;
}
?
//示例1
public int add(int a,int b){
int c = a + b;
return c;
}
//示例2
public void test(){
System.out.println("这个方法没有返回值");
}
修饰符:定义了该方法的访问类型,告诉编译器如何调用该方法,可选
返回值类型:方法可能存在返回值,像示例1,返回一个数据类型为int整形的数据,方法也可能不存在返回值,在这种情况下,返回值类型的关键字为void,如示例2所示
方法名:方法的实际名称,和参数列表共同构成方法签名
参数类型和参数名:两者共同构成参数列表,参数列表是指方法的参数类型,参数先后顺序,参数的个数
参数相当于是一个占位符,可选,当方法被调用时,传递具体的值(实参,参数实际的值)给参数
形参:当该方法被调用时用于接受外界输入的数据
//这里的a和b就是方法的形参,提前定义好的当该方法被调用时,一个接受外界输入数据的盒子
public int add(int a,int b)
实参:调用方法时,实际传给该方法的数据
//该方法被调用时,1传递给了a,2传递给了b
add(1,2);
方法体:方法体包含具体的语句,定义该方法的功能
//语法
对象名.方法名(实参列表)
Java支持两种调用方法的方式,根据是否有返回值来选择
当方法返回一个值的时候,方法调用通常被当作一个值
public class Test {
?
public static void main(String[] args) {
//add方法被调用方法调用,结果为一个整型数据
int add = add(1, 2);
System.out.println(add);
}
?
public static int add(int a,int b) {
int c = a + b;
return c;
}
}
如果方法的返回值是void,方法调用的结果一定是一条语句
public class Test {
?
public static void main(String[] args) {
//noReturn方法被调用,方法没有返回值,所有不用定义变量来接收返回值
noReturn();
}
?
public static void noReturn() {
System.out.println("这个方法没有返回值");
}
}
值传递和引用传递
基本数据类型作为参数的方法调用
public class Test02 {
/*
这里的change方法中,形参是a,实参是b
实参给形参传递数据的方式为:实参b将值20复制一份给形参a
实参和形参是两个方法中的相互独立的局部变量,所以修改形参a不会影响实参b的值
*/
?
public static void change(int a){
a = 10;
System.out.println("a = " + a);//输出结果为:a = 10
}
?
public static void main(String[] args) {
int b = 20;
change(b);
System.out.println("b = " + b);//输出结果为:b = 10
}
}
引用类型作为参数的方法调用
//定义一个Point类
class Point{
int x;
int y;
?
public Point(int x,int y){
this.x = x;
this.y = y;
}
?
public void show(){
System.out.println("(x = " + x + ",y = " + y + ")");
}
}
?
public class TestReferencePassing {
?
/*
这里的change方法中,形参是point对象中的两个属性 x 和 y,实参是change方法中实际赋值给 x 和 y的值。实参给形参传递数据的方式为:实参将直接覆盖修改原先形参的值
*/
?
public static void change(Point p1){
p1.x = 5;
p1.y = 5;
}
?
public static void main(String[] args) {
?
Point point = new Point(1,1);
//调用change方法前,show()方法的输出结果为(x = 1,y = 1)
point.show();
change(point);
//调用change方法前,show()方法的输出结果为(x = 5,y = 5)
//说明Point对象中x和y的值已经发生改变
point.show();
}
?
}
内存分配过程如下图所示:
基本数据类型的参数传递是值传递,引用类型的参数传递是引用地址,本质上也是值传递,所以Java参数传递的方式是值传递
重载就是在一个类中,有相同的函数名称,但形参不同的函数
方法重载的规则
方法名称必须相同
参数列表不同
参数类型不同
public void add(int a) {}
?
public void add(String a) {}
参数的个数不同
public void add(int a) {}
?
public void add(int a,int b) {}
有两个或者之上的不同参数类型的参数的先后顺序不同
public void add(int a,String b) {}
?
public void add(String b,int a) {}
方法的返回类型可以相同也可以不相同
仅仅返回类型不同不足以构成方法重载
实现理论
方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法
//语法
修饰符 返回值类型 方法名(参数类型... 参数名){}
?
//示例
public void vlParams(int x,int... i){}
定义可变长参数后参数的数量不定,根据调用方法时传递的参数数量而定
一个方法中只能指定一个可变长参数,它必须是方法的最后一个参数
方法调用自身
递归结构
边界条件:判断什么时候不再调用自身的条件
前阶段:调用自身
返回阶段:得到最终的一个值,返回给程序
public class testRecursion {
public static void main(String[] args) {
System.out.println(recursion(5));
}
//计算 n!(n的阶乘)
public static int recursion(int n){
?
//边界条件
if (n == 1){
return n;
}else{
//前阶段,调用自身n * recursion(n-1);
//返回阶段:把值返回给程序
return n * recursion(n-1);
}
}
}
栈溢出
递归没有边界条件就会引起栈溢出错误
public class testRecursion {
public static void main(String[] args) {
//栈溢出错误:Exception in thread "main" java.lang.StackOverflowError
System.out.println(recursion(5));
}
public static int recursion(int n){
return n * recursion(n-1);
}
}
标签:-o 执行 覆盖 编译器 引用 签名 不同的 ati sys
原文地址:https://www.cnblogs.com/LittleSkinny/p/12766684.html