定义构造方法和默认构造方法的有什么区别??

时间:2021-09-14 19:29:42
第一个类文件


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虚拟机。

#2


Prime(int n)是构造方法
Prime prime = new Prime(n);创建了一个Prime实例
prime.isPrime()调用这个实例的isPrime()方法

你也可以通过Prime()构造一个实例,同样可以调用该实例的isPrime()方法

#3


一楼说的不错

#4


引用 2 楼 alexandertech 的回复:
Prime(int n)是构造方法
Prime prime = new Prime(n);创建了一个Prime实例
prime.isPrime()调用这个实例的isPrime()方法

你也可以通过Prime()构造一个实例,同样可以调用该实例的isPrime()方法

嘻嘻

#5


如果这两个类文件放在同一个包中的话是可见的,不需要导入便可以直接实例化,这就是呢可以写
Prime prime = new Prime(n);
的原因,如果在两个包中,需要导入,只要在一个包中的都可以直接引用,如果要底层的执行过程,看一楼就是

#6


楼上嘻撒

#7


引用 1 楼 zhao251021539 的回复:
看你都不结贴的 ,不过还是给你回答吧。


你应该没读过虚拟机规范吧, 可以看下我的博客。下面的我不确定你可以看懂
首先两个类被编译为class文件 ,运行main方法 首先加载类Test_Prime ,Test_Primeclass文件中保存有常量池,常量池就包括编译时确定的类字段方法等常量。所以prime 也被放在常量池中 ,经过类初始化过程,进入解析阶段,当然此阶段可以在类初始化之前……
不好意思我也是第一次来这里发帖  还不知道有结贴。   不过谢谢你的回答。

#8


引用 2 楼 alexandertech 的回复:
Prime(int n)是构造方法
Prime prime = new Prime(n);创建了一个Prime实例
prime.isPrime()调用这个实例的isPrime()方法

你也可以通过Prime()构造一个实例,同样可以调用该实例的isPrime()方法



怎么用Prime() 构造一个实例

#9


引用 8 楼 sychenghai 的回复:
引用 2 楼 alexandertech 的回复:
Prime(int n)是构造方法
Prime prime = new Prime(n);创建了一个Prime实例
prime.isPrime()调用这个实例的isPrime()方法

你也可以通过Prime()构造一个实例,同样可以调用该实例的isPrime()方法



怎么用Prime() 构造一个实例

Prime prime = new Prime();

#10


不解楼主为什么不把分给一楼?

#11


引用 10 楼 yaganblw 的回复:
不解楼主为什么不把分给一楼?


不好意思   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虚拟机。

#2


Prime(int n)是构造方法
Prime prime = new Prime(n);创建了一个Prime实例
prime.isPrime()调用这个实例的isPrime()方法

你也可以通过Prime()构造一个实例,同样可以调用该实例的isPrime()方法

#3


一楼说的不错

#4


引用 2 楼 alexandertech 的回复:
Prime(int n)是构造方法
Prime prime = new Prime(n);创建了一个Prime实例
prime.isPrime()调用这个实例的isPrime()方法

你也可以通过Prime()构造一个实例,同样可以调用该实例的isPrime()方法

嘻嘻

#5


如果这两个类文件放在同一个包中的话是可见的,不需要导入便可以直接实例化,这就是呢可以写
Prime prime = new Prime(n);
的原因,如果在两个包中,需要导入,只要在一个包中的都可以直接引用,如果要底层的执行过程,看一楼就是

#6


楼上嘻撒

#7


引用 1 楼 zhao251021539 的回复:
看你都不结贴的 ,不过还是给你回答吧。


你应该没读过虚拟机规范吧, 可以看下我的博客。下面的我不确定你可以看懂
首先两个类被编译为class文件 ,运行main方法 首先加载类Test_Prime ,Test_Primeclass文件中保存有常量池,常量池就包括编译时确定的类字段方法等常量。所以prime 也被放在常量池中 ,经过类初始化过程,进入解析阶段,当然此阶段可以在类初始化之前……
不好意思我也是第一次来这里发帖  还不知道有结贴。   不过谢谢你的回答。

#8


引用 2 楼 alexandertech 的回复:
Prime(int n)是构造方法
Prime prime = new Prime(n);创建了一个Prime实例
prime.isPrime()调用这个实例的isPrime()方法

你也可以通过Prime()构造一个实例,同样可以调用该实例的isPrime()方法



怎么用Prime() 构造一个实例

#9


引用 8 楼 sychenghai 的回复:
引用 2 楼 alexandertech 的回复:
Prime(int n)是构造方法
Prime prime = new Prime(n);创建了一个Prime实例
prime.isPrime()调用这个实例的isPrime()方法

你也可以通过Prime()构造一个实例,同样可以调用该实例的isPrime()方法



怎么用Prime() 构造一个实例

Prime prime = new Prime();

#10


不解楼主为什么不把分给一楼?

#11


引用 10 楼 yaganblw 的回复:
不解楼主为什么不把分给一楼?


不好意思   3 楼那个分我其实是想给1 楼的  点差


3楼全平运气 才得到分的