数组冷门用法
package com.ly.array;
public class VariableParam {
public static void main(String[] args) {
int a = add();
int b =add(1);
int c =add(2,1);
int d =add(new int[] {1,3,2});
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
public static int add(int... numbers){
int sum=0;
for(int num:numbers){
sum+=num;
}
return sum;
}
}
解:Integer是Int的包装类,定义变量之类的话,用Int。数组虽然不属于引用类型,但是定义他的话,也是不能用Integer的。
int属于八大基本数据类型 在常量池里边的字面量里头 不可以直接引用。
引用数据类型 在堆里有内存存放 而基本数据类型不会,这些只会放在栈上或者常量池。
a的基本数据类型 发生了改变 b不会因为他的改变而改变。
a的引用数据类型 发生了改变 b也会因为他的改变而改变。
经典面试题:为什么要拆、装箱?
把符号引用转换为直接引用。
符号引用:
符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可。例如,在Class文件中它以CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等类型的常量出现。符号引用与虚拟机的内存布局无关,引用的目标并不一定加载到内存中。在Java中,一个java类将会编译成一个class文件。在编译时,java类并不知道所引用的类的实际地址,因此只能使用符号引用来代替。比如org.simple.People类引用了org.simple.Language类,在编译时People类并不知道Language类的实际内存地址,因此只能使用符号org.simple.Language(实际中是由类似于CONSTANT_Class_info的常量来表示的)来表示Language类的地址。各种虚拟机实现的内存布局可能有所不同,但是它们能接受的符号引用都是一致的,因为符号引用的字面量形式明确定义在Java虚拟机规范的Class文件格式中。
直接引用:直接引用是和虚拟机的布局相关的,同一个符号引用在不同的虚拟机实例上翻译出来的直接引用一般不会相同。如果有了直接引用,那引用的目标必定已经被加载入内存中了。
直接引用可以有不同的实现方式:
直接指向目标的指针(比如,指向“类型”【Class对象】、类变量、类方法的直接引用可能是指向方法区的指针)
相对偏移量(比如,指向实例变量、实例方法的直接引用都是偏移量)
一个能间接定位到目标的句柄