最近学了面向对象!对于面向对象有几个疑惑,解决了疑惑我把我说想的分享给大家! 对象是类的一种具体体现形式! 类是加载到在方法区! 可是什么时候加载进去呢?又或者什么时候程序会开始使用类呢! 假设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.class和Phone.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基础的,以上都是本人对于类什么时候加载到方法区的看法!若有什么说的错误之处或其他看法我们可以继续研究研究!
|