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联系起来的 中间的执行过程是什么
谢谢
11 个解决方案
#1
看你都不结贴的 ,不过还是给你回答吧。
你应该没读过虚拟机规范吧, 可以看下我的博客。下面的我不确定你可以看懂
首先两个类被编译为class文件 ,运行main方法 首先加载类Test_Prime ,Test_Primeclass文件中保存有常量池,常量池就包括编译时确定的类字段方法等常量。所以prime 也被放在常量池中 ,经过类初始化过程,进入解析阶段,当然此阶段可以在类初始化之前。 解析阶段把字段引用解析为直接引用,
这个时候 prime在常量池中指向的是一个Prime 类型的类实例,其实指向的是Prime class文件的常量池。
类加载到初始化这一阶段结束
进入对象初始化阶段 java虚拟机 为每一个方法都分配一个栈帧 ,执行main 方法 到
Prime prime = new Prime(n);
这一句的时候, 首先在堆上 创建prime 对象,然后在栈帧中保存一个对prime对象的引用,prime.isPrime()执行时,虚拟机为 isPrime()方法再生成一个栈帧,用于执行此方法 。就是这个过程。。。
想深入了解的话去读下 深入java虚拟机。
你应该没读过虚拟机规范吧, 可以看下我的博客。下面的我不确定你可以看懂
首先两个类被编译为class文件 ,运行main方法 首先加载类Test_Prime ,Test_Primeclass文件中保存有常量池,常量池就包括编译时确定的类字段方法等常量。所以prime 也被放在常量池中 ,经过类初始化过程,进入解析阶段,当然此阶段可以在类初始化之前。 解析阶段把字段引用解析为直接引用,
这个时候 prime在常量池中指向的是一个Prime 类型的类实例,其实指向的是Prime class文件的常量池。
类加载到初始化这一阶段结束
进入对象初始化阶段 java虚拟机 为每一个方法都分配一个栈帧 ,执行main 方法 到
Prime prime = new Prime(n);
这一句的时候, 首先在堆上 创建prime 对象,然后在栈帧中保存一个对prime对象的引用,prime.isPrime()执行时,虚拟机为 isPrime()方法再生成一个栈帧,用于执行此方法 。就是这个过程。。。
想深入了解的话去读下 深入java虚拟机。
#2
Prime(int n)是构造方法
Prime prime = new Prime(n);创建了一个Prime实例
prime.isPrime()调用这个实例的isPrime()方法
你也可以通过Prime()构造一个实例,同样可以调用该实例的isPrime()方法
Prime prime = new Prime(n);创建了一个Prime实例
prime.isPrime()调用这个实例的isPrime()方法
你也可以通过Prime()构造一个实例,同样可以调用该实例的isPrime()方法
#3
一楼说的不错
#4
嘻嘻
#5
如果这两个类文件放在同一个包中的话是可见的,不需要导入便可以直接实例化,这就是呢可以写
Prime prime = new Prime(n);
的原因,如果在两个包中,需要导入,只要在一个包中的都可以直接引用,如果要底层的执行过程,看一楼就是
Prime prime = new Prime(n);
的原因,如果在两个包中,需要导入,只要在一个包中的都可以直接引用,如果要底层的执行过程,看一楼就是
#6
楼上嘻撒
#7
不好意思我也是第一次来这里发帖 还不知道有结贴。 不过谢谢你的回答。
#8
怎么用Prime() 构造一个实例
#9
Prime prime = new Prime();
#10
不解楼主为什么不把分给一楼?
#11
不好意思 3 楼那个分我其实是想给1 楼的 点差
3楼全平运气 才得到分的
#1
看你都不结贴的 ,不过还是给你回答吧。
你应该没读过虚拟机规范吧, 可以看下我的博客。下面的我不确定你可以看懂
首先两个类被编译为class文件 ,运行main方法 首先加载类Test_Prime ,Test_Primeclass文件中保存有常量池,常量池就包括编译时确定的类字段方法等常量。所以prime 也被放在常量池中 ,经过类初始化过程,进入解析阶段,当然此阶段可以在类初始化之前。 解析阶段把字段引用解析为直接引用,
这个时候 prime在常量池中指向的是一个Prime 类型的类实例,其实指向的是Prime class文件的常量池。
类加载到初始化这一阶段结束
进入对象初始化阶段 java虚拟机 为每一个方法都分配一个栈帧 ,执行main 方法 到
Prime prime = new Prime(n);
这一句的时候, 首先在堆上 创建prime 对象,然后在栈帧中保存一个对prime对象的引用,prime.isPrime()执行时,虚拟机为 isPrime()方法再生成一个栈帧,用于执行此方法 。就是这个过程。。。
想深入了解的话去读下 深入java虚拟机。
你应该没读过虚拟机规范吧, 可以看下我的博客。下面的我不确定你可以看懂
首先两个类被编译为class文件 ,运行main方法 首先加载类Test_Prime ,Test_Primeclass文件中保存有常量池,常量池就包括编译时确定的类字段方法等常量。所以prime 也被放在常量池中 ,经过类初始化过程,进入解析阶段,当然此阶段可以在类初始化之前。 解析阶段把字段引用解析为直接引用,
这个时候 prime在常量池中指向的是一个Prime 类型的类实例,其实指向的是Prime class文件的常量池。
类加载到初始化这一阶段结束
进入对象初始化阶段 java虚拟机 为每一个方法都分配一个栈帧 ,执行main 方法 到
Prime prime = new Prime(n);
这一句的时候, 首先在堆上 创建prime 对象,然后在栈帧中保存一个对prime对象的引用,prime.isPrime()执行时,虚拟机为 isPrime()方法再生成一个栈帧,用于执行此方法 。就是这个过程。。。
想深入了解的话去读下 深入java虚拟机。
#2
Prime(int n)是构造方法
Prime prime = new Prime(n);创建了一个Prime实例
prime.isPrime()调用这个实例的isPrime()方法
你也可以通过Prime()构造一个实例,同样可以调用该实例的isPrime()方法
Prime prime = new Prime(n);创建了一个Prime实例
prime.isPrime()调用这个实例的isPrime()方法
你也可以通过Prime()构造一个实例,同样可以调用该实例的isPrime()方法
#3
一楼说的不错
#4
嘻嘻
#5
如果这两个类文件放在同一个包中的话是可见的,不需要导入便可以直接实例化,这就是呢可以写
Prime prime = new Prime(n);
的原因,如果在两个包中,需要导入,只要在一个包中的都可以直接引用,如果要底层的执行过程,看一楼就是
Prime prime = new Prime(n);
的原因,如果在两个包中,需要导入,只要在一个包中的都可以直接引用,如果要底层的执行过程,看一楼就是
#6
楼上嘻撒
#7
不好意思我也是第一次来这里发帖 还不知道有结贴。 不过谢谢你的回答。
#8
怎么用Prime() 构造一个实例
#9
Prime prime = new Prime();
#10
不解楼主为什么不把分给一楼?
#11
不好意思 3 楼那个分我其实是想给1 楼的 点差
3楼全平运气 才得到分的