答:8种。byte、short,int、long、char、float、double、boolean。
【自我总结】基本数据类型在内存中是怎么分布的?要视情况而定。如果基本数据类型定义在方法中做局部变量,就存放在栈中;如果基本数据类型做成员变量,就存放在堆中;如果基本数据类型做静态成员变量,就存放在方法区中。
方法内定义的基本数据类型放在帧栈里,而且栈里面的数据是线程独有的,不共享。 那么基本数据类型的全局变量,到底是放在栈里面 还是堆里面,或者方法区里?
java虚拟机栈是线程私有的,生命周期跟线程相同,每个方法调用的时候都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每个方法调用的过程,就代表了一个栈帧在虚拟机栈中入栈到出栈的过程,当进入一个方法时,这个方法在栈中需要分配多大的内存都是完全确定的,方法运行时不会改变局部变量表的大小——《深入理解java虚拟机第二版》
很多java程序员一开始就被网上的一些教程所误导:基本数据类型放在栈中,数组和类的实例放在堆中。这个说法不准确,事实上,如上面的全局变量i,他是存放在java堆中。因为它不是静态的变量,不会独立于类的实例而存在,而该类实例化之后,放在堆中,当然也包含了它的属性i。
如果在方法中定义了int i = 0;则在局部变量表创建了两个对象:引用i和0。 这两个对象都是线程私有(安全)的。 比如定义了int[] is = new int[10]. 定义了两个对象,一个是is引用,放在局部变量表中,一个是长度为10的数组,放在堆中,这个数组,只能通过is来访问,方法结束后出栈,is被销毁,根据java的根搜索算法,判断数组不可达,就将它销毁了。
答:接口不可被实例化,但是抽象类可以被实例化。
抽象类可以有自己的构造方法,但是不能直接通过new进行实例化。但是可以通过子类继承,实例化子类的时候抽象类也会被实例化。
(1)接口没有构造函数,抽象类有构造函数,接口不可被实例化,抽象类可以被实例化;
(2)接口用关键字interface修饰,抽象类用关键字abstract修饰;
(3)接口里的方法都是抽象方法(public abstract),抽象类中的方法可以有非抽象方法;
(4)接口可以被实现,抽象类可以被继承。一个类只能继承一个抽象类,但可以实现多个接口;
(5)接口里面都是抽象方法,必须都要重写,抽象类里面可以有抽象方法和非抽象方法,抽象方法必须重写,非抽象方法可以不重写。
答:隐藏对象的属性和实现细节,仅对外提供访问接口。
答:Aspect(切面):通知和切入点的结合。在SpringAOP中,切面通过带有@Aspect注解的类实现。
Joinpoint(连接点):目标对象中,所有可以增强的方法
Pointcut(切入点):目标对象中,已经增强的方法。
Advice(通知/增强):增强的代码
Target(目标对象):被代理对象
Weaving(织入):将通知应用到切入点的过程
Proxy(代理):将通知织入目标对象之后,形成代理对象
答:AOP,面向切面编程,是对OOP(面向对象编程)的补充和完善。简单来讲就是将纵向重复的代码,横向抽取出来。
很明显的一个体现就是在Filter过滤器中。在没有Filter之前,解决servlet的乱码问题是很复杂的,每次在接收请求之前,都要写句代码来解决乱码问题,即:request.setCharacterEncoding(“UTF-8”),只要写一个servlet,就是写这句代码来解决乱码问题。直到有一天,Filter出现了。我们把解决乱码的那句代码放到Filter中去,从此在servlet中,就再也不用重复写那句代码了。从架构上来说,Filter解决乱码的事架在了所有的servlet上,这样一来,切面就形成了。
面向切面编程的思想,还有一个直接的体现就是在拦截器中。(后面待补充)
8.Spring中的AOP思想靠什么来体现的呢?
答:Spring中的AOP思想体现在能够为容器中管理的对象生成动态代理对象。
以前我们要使用动态代理,我们需要自己调用下面的方法:
Proxy.newProxyInstance(xx,xx,xx);
生成代理对象。
Spring能帮助我们生成代理对象。
9.为什么叫springAOP呢?
答:Spring可以为所有service层的类生成动态代理对象,告诉spring,为每一个service层的类里面的方法添加管理事务的代码,spring一听,是!这样我们叫可以只写一遍管理事务的代码,就为所有的service就都加上了管理事务的代码。这样一来,aop思想就体现出来了。
SpringAOP的本质就是帮我们生成动态代理对象。
10.Spring实现AOP的原理?
答:JDK动态代理和cglib代理。
JDK动态代理有缺陷,就是被代理对象必须实现接口才能产生代理对象,如果没有接口,就不能使用动态代理技术。我们用spring容器来实现动态代理,假如要管理的对象没有实现接口,那么就不能产生代理对象了。为了让所有的对象都能产生动态代理对象,Spring又融入了第三方代理技术cglib代理。Cglib可以对任何类生成代理对象,它的原理是对目标对象进行继承代理,如果目标对象被final修饰,那么该类无法被cglib代理。
11.那么Spring到底使用的是JDK代理,还是cglib代理呢?
答:混合使用。如果被代理对象实现了接口,就优先使用JDK代理,如果没有实现接口,就用用cglib代理。
12.ofo面试题:aop机制,实现,具体怎样使用,具体到标签?
答: AOP,面向切面编程,是对OOP(面向对象编程)的补充和完善,简单来讲就是将纵向重复的代码,横向抽取出来。最明显的体现就是过滤器和拦截器的使用。
Spring实现AOP的本质是动态代理,Spring采用两种动态代理的方式,分别是JDK动态代理和cglib动态代理。JDK动态代理的被代理对象必须实现接口,而cglib动态代理的被代理对象原则上可以是任何类,cglib实现动态代理的原理是对被代理对象进行继承,重写被代理对象中所有的方法,所以被代理对象不能被final修饰。
Spring操作AOP,具体可分为4步。1.导包;2,准备目标对象;3.准备通知;4,将通知织入目标对象。其中2(准备目标对象)和3(准备通知)由java代码实现,4(将通知织入目标对象)有两种实现方式,一种是xml配置,一种是注解配置。其中,xml配置用的标签有
依赖注入问题
答:set方法注入、构造方法注入、属性注入。
构造方法注入:先实例化对象依赖的对象,再实例化这个对象。
优点:(1)构造方法注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入。(2)因为没有setter方法,所有的依赖关系全部在构造器中设定,因此,无须担心后续的代码对依赖关系产生破坏。
缺点:当依赖对象过多时,采用构造方法注入会使构造函数过于臃肿。
Set方法注入:先实例化对象,再实例化对象依赖的对象。
优点:(1)与传统的JavaBean写法相似,程序开发人员更加容易理解。(2)因为方法可以命名,所有setter方法注入在描述性上比构造方法注入更好一些
缺点:对象无法在构造完成之后马上进入就绪状态。
属性注入:在属性上加@Autowired注解。官方不推荐使用,但我在项目中经常使用,方便、简单。
答:不能。为什么?这里尚不清楚!
答:读未提交:设置值为1,说明当一个事务修改数据的时候,另一个事务可以读取数据,这样会导致脏读、不可重复读、幻读等并发问题,所以是最不安全的隔离级别,不太常用。
读已提交:设置值为2,说明当一个事务修改数据的时候,另一个事务必须等待修改完成,才能读取数据,这样可以防止脏读,但是不可重复读和幻读问题还会发生。
可重复读:设置值为4,比读已提交安全一些,因为限制一个事务修改数据时,另一个事务不能读取该数据,同时,限制一个事务读取数据时,其它事务不能修改该数据,从而防止脏读和不可重复读问题的发生,但是还是会发生幻读问题。
串行化:设置值为8,最安全的隔离级别,能同时预防脏读、不可重复读、幻读等问题。
答:不是。类的字节码对象存放的位置就不确定,可能在方法区。
答:标记-清除算法、复制回收算法、标记-整理算法、分代回收算法。
答:可达性分析算法。
答:虚拟机栈中引用的对象;
方法区中静态属性引用的对象;
方法区中常量引用的对象;
本地方法栈中JNI(即一般说的Native方法)引用的对象;
答:会。会在return之前执行。
答:不一定会被执行。(1)当程序在进入try语句块之前就出现异常时,会直接结束,不会执行finally块中的代码。(2)当程序在try块中强制退出时也不会去执行finally块中的代码。