方法
方法
方法的作用
- 方法,也称函数,如果想要重复一段或者多段代码块的使用,可以将这些代码封装成一个方法,方法具体表现为某种行为,使用方法可以提高代码的复用性。
方法的定义
访问权限符 返回值 方法名(参数列表){
方法体
}
public viod method(){
System.out.println(“Hello World!!!”);
}
静态方法(类的方法)
- 关键字static修饰的方法称为静态方法,也叫类方法,静态方法不属于对象,而是属于类,随着类的加载而加载,优先于构造方法执行。
- 静态方法可以直接使用类名.方法直接调用,如果静态方法位于本类中可以直接省略类名直接调用
- 在静态方法中,可以访问静态方法,可以引用类变量(被static修饰的变量),不能访问非静态方法与变量,不能使用super和this关键字
成员方法(对象的方法)
-
是不含有static关键字修饰的普通方法,又称为实例方法,成员方法。属于对象的,不属于类的。(成员属性,成员方法是属于对象的,必须通过new关键字创建对象后,再通过对象调用)。
-
在非静态方法中,即可以调用非静态方法,也可以调用静态方法,可以引用类变量和成员变量,可以使用关键字super和this。
public class Text3 {
int age = 26;//成员变量
static String name = "蔡徐坤";//类变量public static void main(String[] args) { Text3 t1 = new Text3(); method();//本类中调用静态方法,直接省略类名 t1.method1();//调用成员方法}
//静态方法 static void method() { System.out.println("静态方法"); //访问属性 System.out.println(name); //System.out.println(age);//报错,静态不能访问非静态 //t1.method();//报错}
//非静态方法,也叫成员方法 void method1() { System.out.println("非静态方法1"); method();//既可以调用静态方法 new Text3().method2();//又可以调用非静态方法 System.out.println(name);//既可以访问静态属性 System.out.println(age);//又可以访问非静态属性 } void method2() { System.out.println("非静态方法2"); } }
方法的实参与形参
- 实参也叫形式参数,方法声明时候的参数称为形参,如add(int a)
- 形参也叫实际参数,方法调用时传入的参数,如add(1)
public class Text {
public static void main(String[] args) {
method("字符参数");//括号中为实参
}
private static void method(String str) {//括号中为形参
System.out.println(str);//将传入的参数打印输出
}
}
JVM内存结果划分
堆(Heap)
- 作用:堆是JVM中最大的一块内存区域,用于存放所有创建的对象实例和数组。无论是哪个线程创建的对象,都会存储在堆内存中,因此堆内存是线程共享的。
- 特点:堆内存由垃圾收集器(Garbage Collector)管理,负责回收不再使用的对象所占用的内存。堆内存可以细分为年轻代(Young Generation)和老年代(Old Generation)。年轻代又分为Eden区和两个Survivor区(S0和S1),用于存放新创建的对象;老年代则存放从年轻代晋升过来的长期存活对象。
方法区(Method Area)
- 作用:方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器(JIT)编译后的代码等数据。这些信息是全局共享的,对JVM中的每一个类都是可见的。
- 特点:在HotSpot虚拟机中,方法区的一部分实现为永久代(Permanent Generation),但在Java 8之后被元空间(Metaspace)取代。元空间使用本地内存,因此不会受到JVM堆内存大小的限制。
虚拟机栈(Java Virtual Machine Stack)
- 作用:虚拟机栈是线程私有的,它的生命周期与线程相同。每个线程在创建时都会创建一个虚拟机栈,用于存储局部变量、操作数栈、动态链接、方法出口等信息。每调用一个方法都会创建一个栈帧(Stack Frame),方法执行完成后,栈帧会被销毁。
- 特点:由于虚拟机栈是线程私有的,因此不存在线程间的数据共享问题。但是,如果线程请求的栈深度超过了虚拟机所允许的最大深度,就会出现StackOverflowError异常。此外,如果栈的扩展时无法申请到足够的内存,还会出现OutOfMemoryError异常。
本地方法栈(Native Method Stack)
- 作用:本地方法栈与虚拟机栈的作用非常相似,不过它是为执行本地(Native)方法服务的。本地方法栈也是线程私有的。
程序计数器(Program Counter Register)
- 作用:程序计数器是一块较小的内存空间,用于记录当前线程执行的字节码指令的地址。它是线程私有的,每条线程都有一个独立的程序计数器。
- 特点:由于程序计数器是线程私有的,因此不存在数据共享的问题。当线程执行一个Java方法时,程序计数器记录的是正在执行的虚拟机字节码指令的地址;如果线程执行的是一个Native方法,则程序计数器的值为空。
直接内存(Direct Memory)
- 作用:直接内存并不是JVM运行时数据区的一部分,但它也被频繁使用。直接内存是通过java.nio包提供的ByteBuffer类来直接访问系统内存的。
- 特点:直接内存的分配不会受到JVM堆大小的限制,但它仍然受到本机总内存(包括RAM和SWAP区)大小以及处理器寻址空间的限制。如果系统内存不足,可能会出现OutOfMemoryError异常。
方法的重载
- 方法重载是指方法名相同,参数列表不同(无关返回值类型)的方法造成了方法的重载,通常发生在类的成员方法中,方法的重载提高了程序的强壮性
重载规则:
- 被重载的方法必须改变参数列表(参数个数或类型不一样);
- 被重载的方法可以改变返回类型;
- 被重载的方法可以改变访问修饰符;
- 方法能够在同一个类中或者在一个子类中被重载
- 无法以返回值类型作为重载函数的区分标准
public class Text {
public static void main(String[] args) {
add(1,2);//两个数的相加
add(1,2,3);//三个数的相加
add(1,2,3,4);//四个数的相加
add(1,2,3,4,5);//五个数的相加
}
//方法名相同,参数列表不同造成重载
private static void add(int a,int b) {
int sum = a + b;
System.out.println("两个数的相加和为"+sum);
}
private static void add(int a,int b,int c) {
int sum = a + b + c;
System.out.println("三个数的相加和为"+sum);
}
private static void add(int a,int b,int c,int d) {
int sum = a + b + c +d;
System.out.println("四个数的相加和为"+sum);
}
private static void add(int a,int b,int c,int d,int e) {
int sum = a + b + c + d +e;
System.out.println("五个数的相加和为"+sum);
}
}

浙公网安备 33010602011771号