怎么描述下面的java代码,对象和接收对象的关系,以及方法的关系?
首先接口是不能实例化的,只能说,Collection变量指向ArrayList的实例。
其次ArrayList实现了Collection接口,对于Collection中定义的方法进行实现,当你调用Collection变量的add方法,实际上因为该变量指向ArrayList的原因,实际走的是ArrayList的add方法。
最后Collection中的方法可以理解为抽象方法
JAVA虚拟机中是如何加载JAVA类的?
我们平时都知道通过javac命令将
.java
文件编译成.class
文件,之后这个class文件就可以“被运行”了,但是我们需要搞清楚的是这个class文件在虚拟机中究竟是怎么玩的。要想具体搞清楚java类是如何加载的Java虚拟机中,我们需要搞清楚以下几个问题:
一个Java类什么时候开始被加载?
加载Java类的过程是怎样的?
一个Java类从被加载到JVM内存中到这个类被卸载,主要包含以下七个步骤的生命周期。
一个Java类什么时候开始被加载?
Java虚拟机并没有规定在什么时候需要加载Java类,但是对于Java类的初始化却有明确的规定,有且只有以下5中情况时候便会立即触发类的“初始化”动作:
遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果类没有初始化,则需要先触发其初始化,代码示例如下:
使用
java.lang.reflect
包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化,代码示例如下:当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。这个很好理解,就是当一个子类遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果父类还没有初始化,则先初始化父类。
当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。
当使用JDK1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则需要先触发其初始化。这块属于动态加载的范畴,本质上还是需要需要new、getstatic、putstatic或invokestatic这4条字节码指令。
加载Java类的过程是怎样的?
知道了类被加载的条件后,我们需要知道一个Java类通过怎样的过程被加载到Java虚拟机中去了。
这个过程其实就是把一个
.class
文件中的java类相关信息加载到内存中,通过验证、准备、解析等阶段,最终生成一个存在于Java虚拟机内存中的java.lang.Class
对象。这里面涉及到的知识点比较多:
如何验证一个
.class
文件是符合Java虚拟机规范的?准备阶段都做哪些事情?
类加载机制是怎样的?
什么是双亲委派模型?
加载完的类存储在Java虚拟机的什么内存区域?
加载的类GC可以回收吗?如果可以回收需要满足什么样的条件才可以回收一个类?
推荐大家一定要阅读《深入理解Java虚拟机》这本Java程序员必读书籍!并且不只是读一遍,要不停的读,不停的品!
以上就是我个人对“JAVA虚拟机中是如何加载JAVA类的?”这个问题的一些解答,这里只是给大家开个一个头,需要大家再继续深耕下去。
我是【java架构设计】,关注我,持续为您提供Java领域优质内容!
JAVA中类名、接口名、方法名、参数名、属性、包名都是什么?
关于java中类名、接口名、方法名、参数名、属性、包名是什么的问题,我们用月饼制作器和月饼的例子来说明。月饼制作器相当于类,月饼就是月饼制作器生成的对象。一个类可以生成多个对象。
类名
类名就相当于月饼制作器的名称。
接口名
假设这种月饼有好多形状,那么就需要好多种月饼制作器。但是月饼制作器太多了,既占地方、清洗起来又麻烦。怎么办呢?有人想出了换头的方法,就和多功能螺丝刀换头的方式一样。需要生产那种形状月饼,就装上相应的头。
可是月饼制作器和月饼模的头一个是方的,一个是圆的,月饼模的头就和月饼制作器不配套了,怎么办?又有人想了一个办法,定个标准,所有生产月饼模头的工厂,都按标准接口生产。定的这个标准的名,就是java里面的接口名。
方法名
这个月饼制作器要挤压才能产生月饼,我们把挤压这个动作的名称“挤压”,就叫方法名。方法名是定义类行为的名字。
参数名
月饼制作器要挤压才能产生月饼,如果挤压用力大月饼就薄,用力小就厚。这薄厚不一,影响美观呀。怎么办?我们规定挤压用多大力,这个“力”就是方法挤压的参数名。注意不是力的大小。
属性
我们生产的月饼虽然形状不同,但是直径是一样大的,不然包装成本太贵,没法卖了。所以,就要告诉生产厂家,生产的月饼模头的内径是多大。我们把月饼制作器相应对应的这个直径,就叫属性。
包名
假设要生产多种形状的月饼,我们太懒不想换头了,就直接找很多月饼制作器。每种制作器生产一个形状的。但是这些制作器由于不是一个厂生产的,制作器长短不同,我们在保存的时候,需要根据长短放进不同尺寸的抽屉里,这个抽屉的名字,就叫包名。包名是用来分类存放类文件的。
在Java中,各种名称(类名、接口名、方法名、参数名、属性名和包名等)都需要遵循一定的命名规则,以保证代码的可读性和一致性。以下是Java中常见的各种名称及其命名规则:
- 类名:类名是指用来描述一类对象的名称,通常采用首字母大写的驼峰命名法,如MyClass。
- 接口名:接口名是指用来描述一类接口的名称,通常采用首字母大写的驼峰命名法,如MyInterface。
- 方法名:方法名是指用来描述一个方法的名称,通常采用首字母小写的驼峰命名法,如myMethod。
- 参数名:参数名是指在定义方法时用来接收传入参数的名称,通常采用首字母小写的驼峰命名法,如myParameter。
- 属性名:属性名是指用来描述类的属性的名称,通常采用首字母小写的驼峰命名法,如myProperty。
- 包名:包名是指用来组织类和接口的名称空间的名称,通常采用小写字母和点号(.)分隔的方式,如com.example.myproject。
需要注意的是,Java中还有一些保留字,如int、float、double等,不能作为类名、方法名等的命名。此外,在命名时也应该避免使用过于简单或者过于复杂的名称,以便于提高代码的可读性和可维护性。