黑马程序员技术交流社区

标题: JAVA类是什么时候加载到在方法区。 [打印本页]

作者: 钱金磊    时间: 2016-4-20 23:11
标题: JAVA类是什么时候加载到在方法区。
最近学了面向对象!对于面向对象有几个疑惑,解决了疑惑我把我说想的分享给大家!
对象是类的一种具体体现形式!
类是加载到在方法区!
可是什么时候加载进去呢?又或者什么时候程序会开始使用类呢!
假设1:java直接编译到class文件中!
假设2:测试类开始运行时加载到方法区内
假设3:当调用类时类才是加载到方法区内
就让我们做个测试吧!
首先敲个代码!
import java.util.*;
class math{
public static void main(String[] args){
        Scanner sc=new Scanner(System.in); //定义输入口       
        int x;                          //定义变量
        while(true) {                                        //判断是否输入的数在0~100以内!不在的话重新输入
                System.out.println("输入0~100");
                x=sc.nextInt();        //变量x接手键盘数
                if(x<=100&&x>=0){
                break;
                }
        System.out.println("输入有误,重新输入0~100");
           }
        Phone phone=new Phone();  //定义一个phong这个对象!
        int i=0;                //一个累加数
        while(true){
                i++;
                if ((int)(Math.random()*101)==x){        //产生0~100的随机数并判断是否等于输入的数,成立就退出循环
                        break;
                }
        }
        System.out.println(i);                //输出共匹配了多少次!
    }
}
class Phone{
}
编译一下
结果出来两个class文件!math.classPhone.class
假设1不成立!
继续实验:
我把Phone.class 给删掉看看什么情况!
C:\Users\QianJinLei\Desktop\新建文件夹>java math
输入0~100
132
输入有误,重新输入0~100
输入0~100
哟,可以运行诶!
继续:
C:\Users\QianJinLei\Desktop\新建文件夹>java math
输入0~100
132
输入有误,重新输入0~100
输入0~100
12
Exception in thread "main" java.lang.NoClassDefFoundError: Phone
        at math.main(math.java:16)
Caused by: java.lang.ClassNotFoundException: Phone
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        ... 1 more
C:\Users\QianJinLei\Desktop\新建文件夹>
直接报错了!
让我们往回看下代码!
我是执行了录入判断语句后出错的!
import java.util.*;
class math{
        Scanner sc=new Scanner(System.in); //定义输入口       
        int x;                          //定义变量
        while(true) {                                        //判断是否输入的数在0~100以内!不在的话重新输入
                System.out.println("输入0~100");
                x=sc.nextInt();        //变量x接手键盘数
                if(x<=100&&x>=0){
                break;
                }
System.out.println("输入有误,重新输入0~100");
           }
        Phone phone=new Phone();  //定义一个phone这个对象!
这是判断语句没有问题的因为都可以运行了!
而Phone phone=new Phone();  //定义一个phone这个对象!
而这句话是开始建立个对象的!
执行这句话后就直接报错了
还有一个小实验
我们把Phone phone=new Phone();  //定义一个phone这个对象!
这句话注释掉看看出现什么情况
编译后只有math.class文件!
这明明地下有个类啊!怎么不编译!
查了下百度!原来是编译器从主类中开始编译的在主类中没有出现使用类的现象就自动忽略其余的类!
所以我在此得出以结论!
1.在编译的时候java会生成java程序的最小单位类也就是。Class文件
2.在主函数加载的时候不会加载类!
3.在创建对象或者使用类的时候才会加载我们所需要的类到方法区!
4.在源代码中不调用类,它是不会编译这个Phone类!
我也是零基础来学习这个java基础的,以上都是本人对于类什么时候加载到方法区的看法!若有什么说的错误之处或其他看法我们可以继续研究研究!


作者: 钱金磊    时间: 2016-4-20 23:14
其实我是自己把我所想的分享给大家!全程无百度!所以会有点疏漏!望大家指正!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2