方法
语法机制:[修饰符列表] 返回值类型 方法名(形参列表){
方法体;
}
修饰符列表先统一写成:public static
返回值类型 :1.基本数据类型
2.引用数据类型
什么叫返回值:方法结束后的结果,一般会是一个数据。
方法就是为了完成某个特定的结果。
1.3 当一个方法结束 不返回任何类型时,也不能为空,用void。
1.4 方法必须调用才能执行。
类名.方法名(实参列表);
计算两个int类型的 商。
public static int Shang(int a,int b){
int jieguo = a/b;
return jieguo;//或者直接 return a/b;
}
无需返回值可以这样写
public static void divided(int x,int y){
System.out.println(x/y);
}
main 方法中调用。
类名.divided(10,20);
实参和形参 类型和个数 一一对应。
1.5 接收返回值
当一个方法有返回值时,也可以不接收,但是没有意义。
返回后内存马上释放,因为没有接收。
public class PrintTest{
public static void main(String[] args){
print();
}
public static void print(){
System.out.println("输出一个语句");
}
}
方法位于同一个类下,调用时 类名可以省略。
但是 不同的类,
注意:调用程序 不一定得在main 方法中,其他方法也可以调用。
public class Test{
public static void main(String[] args){
m();
}
public static void m(){
n();
}
public static void n(){
m();
}
public static void l(){
m();
n();
l();
return;
}
}
方法体中 代码执行顺序 依次执行,自上而下。main方法其实也只是一种普通的方法。
只不过main 方法是jvm中的,作为程序的入口。
2.break 和 return 的区别。
public class ForTest{
public static void main(String[] args){
for(int i = 1;i <= 10;i++){
if(i == 3){
break;//终止for循环
return ;// 终止的是方法,执行了的话程序结束,不会输出“cao”。
}
System.out.println(i);
}
System.out.println("cao");
}
}
break 语句 只能使用在 switch 分支 还有循环中。
3.public static int m(){
boolean flag = true;
if(flag){
return 1;
}
}
编译器只负责编译,编译器只知道 flag 是boolean 类型,不能确定flag
是真是假,故而认为缺少返回语句。编译器不负责运行。
可以修改为 :if(flag){
return 1 ;
}else{
return 0;
}
因为带有else 分支的一定会保证 有个·语句执行。
也可以修改为:if(flag){
return 1;
}
return 0;
也可以使用三目运算符
return flag ? 1:0 ;
return 语句一旦执行 方法结束。
所以在同一个作用域下 return 语句下方 不可以写代码。
****4、
public class MethodTest{
public static void main(String[] args){
int f = m(true);
System.out.println(f);
}
public static int m(boolean flag){
return flag ? 1 : 0;
}
}
5、jvm 三块主要内存区:堆 栈 方法区
1.方法区:类加载器(classloader)将硬盘中的xxx.class字节码文件装载到jvm
当中的时候,会将字节码文件存放到方法区中。
也就是方法区存放的是 代码片段。
因为类 需要加载,所以方法区最先有数据。
2.方法:在调用时会在 栈(stack)内存中分配空间。
数据结构 通常 是指存储数据的容器。
一种非常经典的数据结构(stack)。
压栈(push)
出栈(pop)
栈顶元素(栈帧 永远指向栈顶元素):处于栈顶部元素 具有活跃权。
先进后出
内存变化:
程序:
public class StackTest{
public static void main(String[] args){
int a = 1;
m1(a);
m2(a);
m3(a);
}
public static void m1(int a){
System.out.println();
m2(a);
System.out.println();
}
public static void m2(int a){
System.out.println();
m3a(a);
System.out.println();
}
public static void m3(int a){
System.out.println(1);
System.out.println(2);
}
}
局部变量只在方法体中 有效。方法结束后 局部变量的内存就释放了。也就是弹栈。
注意:方法不调用是不会在栈内存中开辟空间的,调用就是压栈。
栈存储了方法运行所需要的空间,还会存储方法的局部变量。
复习:
方法是为了完成某个特定功能并且可以重复利用的代码块。
方法出现让代码有了很强的复用性。
一个方法就是一个独立的功能。
栈:栈帧 永远指向栈顶元素(具有活跃权)
编写一个方法,求整数n 的阶乘。
int a = jiecjeng(5);
public static int jieCheng(int n){
int jieguo = 1;
for(i = 1;i <= n;i++){
jieguo = jieguo*i;
}
return jieguo;
}
public static int jieCheng(int n){
int result = 1;
for(i=n;i>1;i--){
result*=n;
}
return result;
}
编写一个方法,输出大于某个正整数n的最小质数。
思路:给正整数n 从1 开始往上加,如果刚好加到那个数 是除了1 和 他本身
都么有其他 因子的数字,则 return 返回。
public static int max(int n){
if(n==1){
return 2;
}else if(n!=1){
for(i = 1;i<n;i++){
for(j=2;j<n;j++){
if((i+n)%j!=0){
return (i+n);
}
}
}
}
}
}
定义一个方法,判断他是否为质数。
public static boolean isZhiShu(int num){
for(i = 2;i < num;i++){
if(num%i==0){
return false;
}
}
return true;
}
public static void printMinZhiShu(int n){
while(true){
n++;
boolean flag = isZhiShu(n);
if(flag){
System.out.println(n);
break;
}
}
}
6、调用一个求和方法
public class Sum{
public static void main(String[] args){
System.out.println(sum(10,20));
}
public static int sum(int a,int b){
return a+b;
}
}
boolean flag = m();
if(flag){
System.out.println("真的");
}
if(m()){
System.out.println("真的");
}
这两种方法其实是一样的。