父类的静态方法能否被子类重写,为什么?
静态方法只与类相关,不与具体实现相关。并且static方法不是后期绑定的,它在编译期就绑定了。所有引用到该方法的对象(父类的对象也好子类的对象也好)所指向的都是同一块内存中的数据,也就是该静态方法。父类的静态方法不能被子类继承,更谈不上重写;
接口回调实现过程:
定义一个回调函数;
给事件发送方传入接口,在需要的地方调用未实现方法;在事件接收方实例化接口并处理结果。
当事件发生时,会通知回调函数进行处理。
泛型原理:
Java的泛型是伪泛型。使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉。这个过程就称为类型擦除。泛型只在编译期有效。
创建对象方式:
1.采用new 2.通过反射 3.采用clone 4.通过序列化机制
Object中有哪些公共方法?
equals()
clone()
getClass()
wait()
notify(),notifyAll()
toString()
finalize()
反射中,Class.forName和classloader的区别
class.forName()前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。
classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容
throw与throws的比较
1、throws出现在方法函数头;而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
throw new NumberFormatException();
void function() throws NumberFormatException{}
为什么Java被称作是“平台无关的编程语言”?
Java虚拟机有自己完善的硬体架构,如 处理器 、 堆栈 、 寄存器 等,还具有相应的 指令 系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码( 字节码 ),就可以在多种平台上不加修改地运行。
JDK和JRE的区别是什么?
JRE(java运行环境)包括java虚拟机和applet;
Jdk(java开发工具包)包括JRE和编译器等。可以开发、编译执行java程序。
static修饰方法能否被覆盖?
static方法不能被覆盖,因为方法覆盖是运行时动态绑定的,而static方法是编译时静态绑定的。static变量在Java中是属于类的,它在所有的实例中的值是一样的。
为什么Static方法用非static变量会报错?
Static编译时加载,此时非static变量还没有被创建。
finalize() 方法
finalize是Object类的一个方法。GC回收对象前调用finalize()方法。
为什么内部类调用的外部变量必须是final修饰的?
方法中的局部变量,方法结束后这个变量就要释放掉。然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到了。如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中。为了解决:局部变量的生命周期与局部内部类的对象的生命周期的不一致性问题
迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的
remove(Object Obj)删除,可以通过迭代器的remove()方法删除。
Array可以包含基本类型和对象类型,ArrayList只能包含对象类型,如果要存基本数据类型,也要用它们的包装类才能通过。
Compareble和comparetor接口:
Comparetor:需实现compare(o1,o2)和equals
Compareble:需实现compareto(o)方法
返回int值,负数,0,正数 表示小于,等于大于
System.gc()和Runtime.gc() 这两个方法用来提示JVM要进行垃圾回收。但是,立即开始还是延迟进行垃圾回收是取决于JVM的。
异常处理完成以后,Exception对象会发生什么变化?
答:Exception对象会在下一个垃圾回收过程中被回收掉。
内部类的产生依赖于外部类,持有外部类的引用是类名.this
Vector会将它的容量翻倍,ArrayList只增加50%的大小
浅拷贝和深拷贝
引用的拷贝
private static void copyReferenceObject(){
Person p = new Person(23, "zhang");
Person p1 = p;
System.out.println(p);
System.out.println(p1);
}
这里打印的结果:
com.yaolong.clone.Person@3654919e
com.yaolong.clone.Person@3654919e
可以看到,打印的结果是一样的,也就是说,二者的引用是同一个对象,并没有创建出一个新的对象。
浅拷贝
浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址
深拷贝
深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。
Session与Cookie分别是什么
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
Session与Cookie的区别与联系
1、Cookie和Session都是会话技术,Cookie是运行在客户端,Session是运行在服务器端。
2、Cookie有大小限制以及浏览器在存cookie的个数也有限制,Session是没有大小限制和服务器的内存大小有关。
3、Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击。
4、Session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力。
Java对象的生命周期
1.创建阶段(Created)
为对象分配内存空间,属性初始化
2.应用阶段(In Use)
对象至少被一个强引用持有着。
3.不可见阶段(Invisible)
当一个对象处于不可见阶段时,说明程序本身不再持有该对象的任何强引用,虽然该这些引用仍然是存在着的。
简单说就是程序的执行已经超出了该对象的作用域了。
4.不可达阶段(Unreachable)
指该对象不再被任何强引用所持有。
5.收集阶段(Collected)
当垃圾回收器发现该对象已经处于“不可达阶段”并且垃圾回收器已经对该对象的内存空间重新分配做好准备时,则对象进入了“收集阶段”。
6.终结阶段
当对象执行完finalize()方法后,则该对象进入终结阶段。
7.对象空间重新分配阶段
垃圾回收器对该对象的所占用的内存空间进行回收或者再分配了,则该对象彻底消失了
静态类的主要特性:
1:仅包含静态成员。
2:无法实例化。
3:是密封的。
4:不能包含实例构造函数。
非静态内部类能访问外部类的一切属性;静态内部类只能访问外部类的静态属性。
foreach与正常for循环效率对比
for循环在遍历集合时使用下标来定位集合中的元素,foreach来遍历集合时,集合必须实现Iterator接口,foreach就是使用Iterator接口来实现对集合的遍历的。foreach遍历集合是根据一个元素获取下一个元素遍历的。
所以for循环遍历ArrayList,底层是数组,地址下标是连续的,效率比foreach高。
for循环遍历LinkedList,地址下标不连续,效率比foreach低。
Java1.7与1.8新特性
1.7
1.switch中可以使用字串
2.运用List<String> tempList = new ArrayList<>(); 即泛型实例化类型自动推断
3.数据运算安全性加强;
1.8
引入Lambda 表达式
IPC通信的几种方式:
管道、信号、信号量、共享内存、消息队列、套接字。
静态变量在什么时候加载?编译期还是运行期?静态代码块加载的时机呢?
答案:当类加载器将类加载到JVM中的时候就会创建静态变量,这跟对象是否创建无关。静态变量加载的时候就会分配内存空间。静态代码块的代码只会在类第一次初始化的时候执行一次。一个类可以有多个静态代码块,它并不是类的成员,也没有返回值,并且不能直接调用。它们通常被用初始化静态变量。
如果原地,不使用第三个变量交换两个变量的值
例如:int a=5,b=10;
第一种:两数的和减去b得到a的值,赋给b;两数的和再减b(此时实际是a的值),赋给a;
a=a+b; b=a-b; a=a-b;
第二种,用异或
a^=b;
b^=a;
a^=b;
java i+1<i怎么出现
当用一个char、int、long等表示了一个该类型范围内的最大数,再增加1就会越界。比如:
int a = Integer.MAX_VALUE;
System.out.println(a);
int b = a+1;
System.out.println(b);
打印出来分别是 2147483647和-2147483648,即为2的31次方-1到-2的31次方。
i - 1 > i同理,-2^31 - 1 = 2^31 - 1。
堆是什么样的结构?
堆的存储是靠数组来存储。结构是二叉树一样的结构。
image.png
将不使用的引用对象置于null会加速回收吗?
不会。JVM会智能地判断对象是否应该被回收,置于null对其没有影响。
HashMap和Hashtable的区别
1.两者最主要的区别在于Hashtable是线程安全,而HashMap则非线程安全
2.HashMap可以使用null作为key,而Hashtable则不允许null作为key
3.两者计算hash的方法不同
实例化数组后,能不能改变数组长度呢
不能,数组一旦实例化,它的长度就是固定的
String str=”aaa”,与String str=new String(“aaa”)一样吗?
不一样的。因为内存分配的方式不一样。
第一种,创建的”aaa”是常量,jvm都将其分配在常量池中。
第二种创建的是一个对象,jvm将其值分配在堆内存中。
抽象类必须要有抽象方法吗
不是必须。抽象类可以没有抽象方法。
HashSet和TreeSet有什么区别?
HashSet是由一个hash表来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是O(1)。
另一方面,TreeSet是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(),remove(),contains()方法的时间复杂度是O(logn)。
泛型有什么作用?
能够进行编译期间类型检查,避免不必要的类型错误,加强安全性验证。
什么是乐观锁和悲观锁
乐观锁:乐观锁认为竞争不总是会发生,因此它不需要持有锁
悲观锁:悲观锁认为竞争总是会发生,因此每次对某资源进行操作时,都会持有一个独占的锁,就像synchronized
网友评论