第一个类文件
public class Prime {
int n;
Prime(int n) {
this.n = n;
} boolean isPrime() {
boolean b = true;
return b;
}
}第二个类文件
import java.util.Scanner;public class Test_Prime {
public static void main(String[] args) {
System.out.println("input a integer plz: ");
int n = new Scanner(System.in).nextInt(); Prime prime = new Prime(n);
if (prime.isPrime()) {
System.out.println(n + "是一个素数");
} else {
System.out.println(n + "不是一个素数");
}
}}
其中第二个类中的 if(prime.isPrime) {} 中的prime, isPrime是怎么和第一个类中的isPrime联系起来的 中间的执行过程是什么 谢谢
public class Prime {
int n;
Prime(int n) {
this.n = n;
} boolean isPrime() {
boolean b = true;
return b;
}
}第二个类文件
import java.util.Scanner;public class Test_Prime {
public static void main(String[] args) {
System.out.println("input a integer plz: ");
int n = new Scanner(System.in).nextInt(); Prime prime = new Prime(n);
if (prime.isPrime()) {
System.out.println(n + "是一个素数");
} else {
System.out.println(n + "不是一个素数");
}
}}
其中第二个类中的 if(prime.isPrime) {} 中的prime, isPrime是怎么和第一个类中的isPrime联系起来的 中间的执行过程是什么 谢谢
你应该没读过虚拟机规范吧, 可以看下我的博客。下面的我不确定你可以看懂
首先两个类被编译为class文件 ,运行main方法 首先加载类Test_Prime ,Test_Primeclass文件中保存有常量池,常量池就包括编译时确定的类字段方法等常量。所以prime 也被放在常量池中 ,经过类初始化过程,进入解析阶段,当然此阶段可以在类初始化之前。 解析阶段把字段引用解析为直接引用,
这个时候 prime在常量池中指向的是一个Prime 类型的类实例,其实指向的是Prime class文件的常量池。
类加载到初始化这一阶段结束进入对象初始化阶段 java虚拟机 为每一个方法都分配一个栈帧 ,执行main 方法 到
Prime prime = new Prime(n);
这一句的时候, 首先在堆上 创建prime 对象,然后在栈帧中保存一个对prime对象的引用,prime.isPrime()执行时,虚拟机为 isPrime()方法再生成一个栈帧,用于执行此方法 。就是这个过程想深入了解的话去读下 深入java虚拟机。
Prime prime = new Prime(n);创建了一个Prime实例
prime.isPrime()调用这个实例的isPrime()方法你也可以通过Prime()构造一个实例,同样可以调用该实例的isPrime()方法
Prime prime = new Prime(n);
的原因,如果在两个包中,需要导入,只要在一个包中的都可以直接引用,如果要底层的执行过程,看一楼就是