Java学习笔记三:基础知识——方法的定义/语法格式/调用/重载/递归/栈内存

一、方法 method

1、 方法是可以完成某个特定功能并且可以重复利用的代码片段。

方法的作用:提高代码的复用性,使代码更为规范、简洁。

代码遵循自上而下的顺序运行,main方法会被jvm自动调用,其他方法不被调用则不会执行。

2、方法的语法格式

[修饰符列表] 返回值类型 方法名 (形式参数列表){
	方法体;
}

注:[]里面的内容表示可选 不是必须的;
	方法体由java语句构成;

2.1 修饰符列表:
public static 可省略

2.2 返回值类型

返回值类型可以是任何合法的数据类型;

返回值一般指的是方法执行结束后的结果,通常是一个数据;

当一个方法执行结束不返回任何值时,返回值类型也不能省略,必须写上void关键字,所以void表示该方法执行结束不返回任何结果。

如果返回值类型不是void,再方法体执行结束时必须使用“return 值”来完成值的返回,否则编译会报错。

如果返回值类型是void,方法体中不能有“return 值”语句,但可以有“return;”

当return语句执行,当前方法必然结束。

2.3 方法名
要求首字母小写,后面每个单词首字母大写

2.4 形式参数列表
简称形参;
形式参数列表中的每一个参数都是“局部变量”,方法体结束之后内存释放;
形参的个数是0-N个;
形参有多个时,用逗号隔开。
public static void sumInt(){}
public static void sumInt(int x){}
public static void sumInt(int x, int y){}
public static void sumInt(int x, int y, double a, String s){}

2.5 方法体
由Java语句构成。
方法体中编写的时业务逻辑代码,完成某个特定功能。

3、方法的调用

方法必须调用之后才能执行。

调用的语法:
类名.方法名(实际参数列表);

实参和形参的类型和个数必须一一对应。

使用变量来接收方法的返回值,需要定义变量类型。

方法没有返回值时,不能用变量接收结果;方法有返回值时,也可以不接收。

在方法调用时,a()方法调用b()方法时,a和b都在同一个类中,“类名.”可以省略,如果不在同一个类中,“类名.”不能省略。

不是只有main方法才可以调用其他方法。

break;用来终止switch和离之最近的循环;
return;用来终止离之最近的一个方法。
在同一个域中,return下面不能再编写其他代码。

二、内存

1、 JVM中主要的三块内存空间:
栈、堆、方法区

方法区:
类加载器classloader,将硬盘上的xxx.class字节码文件装载到JVM时,
会将字节码文件存放到方法区中。方法区存储的是代码片段。
因为类需要加载,所以方法区中最先有数据。

栈内存 stack:
在方法被调用时,该方法需要的内存空间在栈中分配。
栈内存存储方法执行时的内存空间和局部变量。

方法调用:压栈,分配空间
方法结束:弹栈,释放空间

2、 栈数据结构

进栈、入栈、压栈、push
出栈、弹栈、pop

栈底元素、栈顶元素

栈帧永远指向栈顶元素;
处于栈顶部的元素具有活跃权;

栈数据结构的特点:
先进后出,后进先出。

三、方法重载

1、方法重载的优点:
代码整齐美观;
功能相似的代码方法名相同,易于代码编写和记忆。

2、方法的区分:
方法名相同时,编译器通过方法参数类型进行方法区分。

3、什么时候使用方法重载:
在同一个类中,两个方法的功能相似时,考虑方法名一致

什么时候代码会发生方法重载:
在同一个类中
方法名相同;
参数列表不同;(个数、类型、顺序)
同时满足以上三个条件

方法的重载与方法的返回值类型无关;
与修饰符列表无关。

四、方法的递归

1、 递归是指方法自己调用自己。

2、 当递归程序没有结束条件,会发生栈内存溢出错误:StackOverFlowError
因此递归必须要有结束条件

有结束条件也可能发生错误,是因为递归太深,栈内存不够。

当栈内存溢出错误发生:
先检查递归的结束条件是否正确;

若结束条件没问题,需手动调整JVM栈内存初始化大小。
java -Xss xxxGB xx.java

java -X 可以查看调整堆栈大小的参数

/*
计算1-n的和
 */


/*


// 使用for循环实现

public class RecursionSample01 {

    public static void main(String[] args) {
        int retValue1 = sum(3);
        System.out.println(retValue1);
        System.out.println(sum(10));
    }

    //计算1-n的方法
    public static int sum(int n){
        int result = 0;
        for(int i = 1; i <= n; i++){
            result += i;
        }
        return result;
    }
}

*/



// 使用递归方法实现

public class RecursionSample01 {

    public static void main(String[] args) {
        int retValue2 = sum(10);
        System.out.println(retValue2);
    }

    //递归方法
    public static int sum(int n){
        if (n == 1){
            return 1;
        }

        return n + sum(n-1);
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PL/0编译程序的语法分析程序主要是通过对输入的PL/0程序进行分析,判断其是否符合PL/0语言的语法规则。下面是一个基本的PL/0语法分析程序的框架: ```java public class Parser { private Lexer lexer; // 词法分析器 private Symbol symbol; // 当前读入的符号 public Parser(Lexer lexer) { this.lexer = lexer; this.symbol = lexer.getSym(); } // 语法分析程序的入口方法 public void parse() { // TODO: 在这里编写语法分析程序 } // 匹配当前符号并读入下一个符号 private void match(int sym) { if (symbol.getSym() == sym) { symbol = lexer.getSym(); } else { error("syntax error: unexpected symbol"); } } // 报告语法错误 private void error(String message) { System.err.println(message); System.exit(1); } } ``` 在上面的代码中,我们定义了一个Parser类,它包含一个Lexer类的实例和一个Symbol类的实例。在构造方法中,我们将传入的Lexer对象赋值给成员变量,并调用Lexer的getSym()方法获取第一个符号。 在parse()方法中,我们需要编写具体的语法分析程序。我们可以使用递归下降法来实现语法分析程序。具体来说,我们可以为每个语法结构定义一个独立的方法,比如expression()、statement()等等。在这些方法中,我们可以根据语法规则调用match()方法匹配当前符号,并递归调用其他的语法结构。 在match()方法中,我们首先判断当前符号是否与传入的符号相同,如果相同,则调用Lexer的getSym()方法获取下一个符号;否则,我们调用error()方法报告语法错误。 在error()方法中,我们输出错误信息并退出程序。 下面是一个简单的expression()方法的实现,用于解析PL/0中的表达式: ```java private void expression() { if (symbol.getSym() == Symbol.PLUS || symbol.getSym() == Symbol.MINUS) { match(symbol.getSym()); } term(); while (symbol.getSym() == Symbol.PLUS || symbol.getSym() == Symbol.MINUS) { match(symbol.getSym()); term(); } } private void term() { factor(); while (symbol.getSym() == Symbol.TIMES || symbol.getSym() == Symbol.SLASH) { match(symbol.getSym()); factor(); } } private void factor() { if (symbol.getSym() == Symbol.IDENT || symbol.getSym() == Symbol.NUMBER) { match(symbol.getSym()); } else if (symbol.getSym() == Symbol.LPAREN) { match(Symbol.LPAREN); expression(); match(Symbol.RPAREN); } else { error("syntax error: unexpected symbol"); } } ``` 在上面的代码中,我们实现了方法:expression()、term()和factor()。其中expression()方法用于解析表达式,它首先判断当前符号是否是加号或减号,如果是,则读入下一个符号;然后调用term()方法解析项;最后,如果当前符号仍然是加号或减号,则继续读入下一个符号并解析项。 term()方法用于解析项,它首先调用factor()方法解析因子,然后判断当前符号是否是乘号或除号,如果是,则读入下一个符号并解析因子,直到当前符号不是乘号或除号为止。 factor()方法用于解析因子,它首先判断当前符号是否是标识符或数字,如果是,则读入下一个符号;如果当前符号是左括号,则读入下一个符号并解析表达式,然后匹配右括号;否则,报告语法错误。 以上就是一个基本的PL/0语法分析程序的框架和示例代码。要完整地实现一个PL/0编译程序,还需要考虑很多其他的语法结构和语义规则,比如语句、过程、作用域等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值