Java面向对象的三个特征与含义 三大特征是:封装、继承和多态。
反射破坏的是Java的封装。
多态的三个必要条件
1.继承
2.重写
3.父类引用指向子类对象
Java 中的 final 关键字有哪些用法?
修饰类:表示该类不能被继承;
修饰方法:表示方法不能被重写;
修饰变量:表示变量只能一次赋值以后值不能被修改(常量)
接口及接口的成员变量和成员方法不能声明为 protected,子类才能访问protected类型成员。
main 方法是被 JVM 调用的,除此之外,main 方法和其它方法没什么区别。
方法区和堆内存是线程共享的。
程序计数器和虚拟机栈是线程隔离的。
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。
当子类对象调用重写的方法时,调用的是子类的方法,而不是父类中被重写的方法。 要想调用父类中被重写的方法,则必须使用关键字 super(构造方法要放在第一行)。
构造器的调用顺序是:先初始化静态成员,然后调用父类构造器,再初始化非静态成员,最后调用自身构造器。
创建对象时的调用顺序是:父类非静态初始化块,非静态属性 ,再是父类构造函数,然后是子类非静态初始化块,非静态属性 ,最后是子类构造函数。
NULL没有开辟内存地址 ‘ ’空串
Java中所有错误和异常的父类java.lang.Throwable
static代码块只执行一次原因:
static代码块只在类加载时执行,类是用类加载器来读取的,类加载器是带有一个缓存区的,它会把读取到的类缓存起来,所以在一次虚拟机运行期间,一个类只会被加载一次,这样的话静态代码块只会运行一次。
工具类中的方法都是静态方式访问的因此将构造器私有不允许创建对象 (绝对好习惯)
hashcode相同,对象不一定相等,hashcode不同,对象一定不相等。 对象相等,hashcode一定相等,对象不相等,hashcode有可能相等。
GC 是 JVM 内部的一个进程,回收无效对象的内存用于将来的分配。
如果一个对象引用被无意识的保留起来了,那么垃圾回收器不会处理这个对象,也不会处理该对象引用的其他对象
然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被 GC 回收,因此也会导致内存泄露的发生。
例如Hibernate 的 Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的
然而其中的 pop 方法却存在内存泄露的问题,当我们用 pop 方法弹出栈中的对象时,
该对象不会被当作垃圾回收,即使使用栈的程序不再引用这些对象,因为栈内部维护着对这些对象的过期引用(obsolete reference)。
在支持垃圾回收的语言中,内存泄露是很隐蔽的,这种内存泄露其实就是无意识的对象保持。
java垃圾回收机制
在Java中,程序员是不需要显示的去释放一个对象的内存的,而是由JVM虚拟机自行执行。
在JVM,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有当虚拟机空闲,
或者当前堆内存不足时,才会触发执行,扫描那些没有被引用的对象,并将它们添加到要回收的集合中,进行回收
什么是反射?
反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力
Java反射:
在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?
对于任意一个对象,能否调用它的任意一个方法
Java反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员
动态代理是什么?有哪些应用?
当想要给实现了某个接口的类中的方法,加一些额外的处理。比如说加日志,加事务等。
可以给这个类创建一个代理,故名思议就是创建一个新的类,这个类不仅包含原来类方法的功能,而且还在原来的基础上添加了额外处理的新类。这个代理类并不是定义好的,是动态生成的。具有解耦意义,灵活,扩展性强。
动态代理步骤:
- 创建接口,用于保存实际对象需要做的动作。
- 创建实际对象的类,继承上面创建的动作接口,并重写方法。
- 创建代理模式,继承invocationHandler接口,给定一个带参构造方法,重写invoke方法。
动态代理的应用:
Spring的AOP
加事务
加权限
加日志
try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
答:会执行,在 return 前执行。
有另一种说法:1.try 中的 return 语句调用的函数先于 finally 中调用的函数执行,也就是说 return 语句先执行,finally语句后执行,所以,返回的结果是 2.Return 并不是让函数马上返回,而是 return 语句执行后, 将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行 finally 语句后才真正开始返回(例如在finally修改变量的值,return的还是修改前的值)。
try-catch-finally 中哪个部分可以省略?
答:catch 可以省略
instanceof运算符用法
运算符是双目运算符,左面的操作元是一个对象实例,右面是一个类.当
左面的对象是右面的类创建的对象时,该运算符运算的结果是true,否则是false
局部对象优先于全局变量
小括号的优先级是最高的,任何字符与字符串相加都是字符串
去除JSON串key值的双引号
replaceAll(""(\w+)"(\s*:\s*)", “$1$2”)
isBlank()用于判断字符串是否为空或仅包含空白字符,空白字符判断为true.
isEmpty()用于判断字符串是否为空,不考虑空白字符,空白字符判断为false.