一、三级目录自动装箱在jdk1.5之前,如果你要定义一个value为100的Integer对象则需要如下定义:
Integer i = new Integer(100);
int intNum1=100;//普通变量
Integer intNum2 = intNum1;//自动装箱
int intNum3 = intNum2;//自动拆箱
Integer intNum4 = 100;//自动装箱
上面的代码中,intNum2为一个Integer类型的实例,intNum1为Java中的基础数据类型,将intNum1赋值给intNum2便是自动装箱;而将intNum2赋值给intNum3则是自动拆箱。
八中基本数据类型:boolean,byet,short,char,int,long,float,double,所生成的变量相当于常量。
基本类型包装类:Boolean,Byte,Character,Short,Integer,Long,Float,Double。
自动拆箱和自动装箱的定义:
自动装箱是将一个java定义的基本数据类型赋值给相对应封装类的变量。拆箱与装箱是相反的操作,自动拆箱则是将一个封装类的变量赋值给相应基本数据类型的变量。
二 、try catch finally,try里有return,finally还执行吗
肯定会执行,finally{}块的代码。只有在trt{}块中包含遇到System.exit(0)。之类的导致Java虚拟机直接退出的语句才会不执行。
当程序执行try{}遇到return时,程序会限制性return语句,但并不会立即返回,也就是把return语句要做的一切事情都准备好,也就是在将要返回,但并未返回的时候,程序吧执行流程转去执行finally块,当finally块执行完成后就直接返回刚才return语句已经准备好的结果
三、 JAVA多态的实现原理
多态的概念:同一操作作用于不同对象,可以有不同的解释,有不同的执行结果,这就是多态,简单来说就是:父类的引用指向子类对象
动态绑定具体的调用过程为:
1、首先会找到被调用方法所属类的全限定名
2、在此类的方法表中寻找被调用方法,如果找到,会将方法表中此方法的索引项记录到常量池中(这个过程叫常量池解析),如果没有,编译失败
3、根据具体实例化的对象找到方法区中此对象的方法表,再找到方法表中的被调用方法,最后通过直接地址找到字节码所在的内存空间
最后说明
域和静态方法都是不具有多态性的,任何的域访问操作都将由编译器解析,因此不是多态的。静态方法是跟类,而并非单个对象相关联的。
四、java反射的作用与原理
什么是java的反射
java反射是可以让我们在运行的时,通过一个类的Class对象来获取它获取类的方法、属性、父类、接口等类的内部信息的机制
这种动态获取信息以及动态调用对象的方法的功能称为java的反射
反射的作用
反射就是:在任意一个方法里
1.如果我知道一个类的名称/或者它的一个实例对象,我就能把这个类的所有方法和变量的信息找出来,方法名,变量名,方法,修饰符,类型,方法参数等所有信息
2.如果我还能明确知道这个类里某个变量的名称,我还能得到这个变量当前的值
3.当然,如果我明确知道这个类里的某个方法名+参数个数类型,我还能通过传递参数来运行那个类里的那个方法。
反射机制主要提供了以下功能
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
- 生成动态代理
反射的原理
java语言编译之后辉生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等
反射的实现API有哪些
反射的实现主要借助一下四个类
Class:类的对象
Constructor:类的构造方法
Field:类中的属性对象
Method:类中的方法对象
五、泛型常用特点
List< String >能否转为List< Object >
不可强转类型的
这个问题涉及到了,泛型向上转型和泛型向下转型问题,List向上转换至List会丢失String类的身份(String类型的特有接口)。当需要由List向下转型时,你的程序必须明确的知道将对象转换成何种具体类型,不然这将是不安全的操作
如果要强转类型,Json序列化转型
List<String> str = new ArrayList<String>();
List(Object) obj= JSONObject.parseArray(JSONObject.toJSONString(str));
或者遍历,或者克隆,但是取出来就是(Object)了,需要强转,String因为类型丢了