1.Java中抽象类和接口中均不能定义静态的抽象方法
static修饰符修饰的方法和变量属于类方法和类变量,在JVM类加载过程的准备过程会为其赋值,值为对应类型的0值,比如对象就是null,int就是0,而抽象类不能被实例化,所以就不能分配内存,二者矛盾,接口同理。
2.抽象类不一定有抽象方法
静态static是属于字节码的。一个抽象类可以没有抽象方法,使用abstract只是为了不被实例化。以上两点可以说明,静态方法只要有字节码存在就可以运行,所以抽象类中可以有静态方法。
3.两个对象值相同(x.equals(y) == true),但却可有不同的hash code,该说法是否正确,为什么?
不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。Java对于eqauls方法和hashCode方法是这样规定的:
- 如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同
- 如果两个对象的hashCode相同,它们并不一定相同
你可以不按照规定这么做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set集合中,同时增加新元素的效率会大大下降
4.final,finally,finalize有什么区别?
-
final:
- final修饰类,表示该类不可以被继承
- final修饰变量,表示该变量不可以被修改,只允许赋值一次
- final修饰方法,表示该方法不可以被重写
-
finally:
- finally是java保证某些代码一定要被执行的一种机制。
-
finalize:
- finalize是Object的一个方法,它的目的是保证对象在被垃圾收集前完成特定资源的回收。不过finalize已经不推荐使用,JDK9已经标记为过时。
5.内存泄漏和内存溢出
内存泄漏:其实就是当我们在创建对象或者是变量之后,并且该对象或者变量在程序中都不再使用了,但是又没有办法回收这些没用的对象和变量。而且还一直占用着系统的内存空间,此时的现象就是内存泄漏
解决:
- 我们在使用静态变量的时候尽量减少对静态变量的使用,因为静态变量是存储在方法区(也就是永久代),不会被回收
- 如果在程序中有不用的对象,应该及时进行释放。
内存溢出:其实就是当我要申请一块内存的时候,但是此时虚拟机不能够给我提供这么大的内存,就说明内存溢出了,比如出现OutOfMemoryError,StackOverflowError 这种错误信息的时候
解决:
- 修改 JVM 启动参数, 直接增加内存。 (-Xms, -Xmx 参数一定不要忘记加。一般要将-Xms 和-Xmx 选项设置为相同, 以避免在每次 GC 后调整堆的大小; 建议堆的最大值设置为可用内存的最大值的 80%)
- 根据日志进行分析哪里的问题所在,进行排查