1.java 判断对象是否是某个类的类型方法?
instanceof :判定这个对象属于这个类,不会区分是子类还是父类
getClass: a.getClass().equals(ClassA.class)
2.java 中的引用类型
1)强引用:普通的java引用 A a=new A()
2)软引用:描述一些还有用但并非必需的对象,系统要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。SoftReference 类实现
3)弱应用:描述非必须对象,强度比软引用更弱一些,被弱引用关联的对象只能到下一次垃圾收集发生之前。在JDK1.2 之后,提供 WeakReference 类来实现弱引用
4)虚引用:最弱的一种引用。为一个对象设置虚引用关联的唯一目的能在这个对象被回收时收到一个系统通知。PhantomReference 类实现。
3.final 作用
1)修饰类:类不可以被继承
2)修饰方法:方法锁定,以防任何继承类修改它的含义;效率。在早期的 Java 实现版本中,会将 final 方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的 Java 版本中,不需要使用 final 方法进行这些优化了。
3)修饰变量:基本数据类型,表示该基本数据类型的值一旦在初始化后便不能发生变化;引用类型,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的;final a=3 表示常量,只能被赋值一次,赋值后值不再改变
4.如何实现克隆
1) 实现 Cloneable 接口并重写 Object 类中的 clone()方法;
2) 实现 Serializable 接口:通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。
注意:基于序列化和反序列化实现的克隆不仅仅是深度克隆,更重要的是通过泛型限定,可以检查出要克隆的对象是否支持序列化。这项检查是编译器完成的,不是在运行时抛出异常,这种方案是明显优于使用Object 类的 clone 方法克隆对象。让问题在编译的时候暴露出来总是优于把问题留到运行时。
3) 反射方式,利用反射拷贝对象的数据。
6.时间与日期
1)Java 8 中可以使用 java.time.LocalDateTimel 来获取
2) Calendar 日历
:
3)SimpleDataFormat 类:
7.打印昨天的当前时刻
import java.util.Calendar; public class YersterdayTime { public static void main(String[] args) { Calendar c = Calendar.getInstance(); c.add(Calendar.DATE, -1); System.out.println(c); } }
import java.time.LocalDateTime; public class YersterdayTime { //Java8 public static void main(String[] args) { LocalDateTime today=LocalDateTime.now(); LocalDateTime yesterday=today.minusDays(1); System.out.println(yesterday); } }
8.error和exception
error:系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况
exception:需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况
9.try-with-resource
try语句中声明一个或者多个资源;实现了 java.lang.AutoCloseable/java.io.Closeable 的类对象
使用前:
public class ReadFile { public static void main(String[] args) { BufferedReader reader = null; String buffer = null; try { reader = new BufferedReader(new FileReader("src/testRead.txt")); do { buffer = reader.readLine(); System.out.println(buffer); } while (reader.read() != -1); } catch (IOException e) { e.printStackTrace(); } finally { try { // 问题一:需要显示的调用close,也要对close再加一层try catch 还有个问题是 // 问题二:close函数也有可能抛异常,如果这里抛出异常,try块里面的异常信息就会被丢弃 reader.close(); } catch (IOException e) { e.printStackTrace(); } } } }
使用后:
public class ReadFile { public static void main(String[] args) { String bufferSugar = null; try (BufferedReader readerSugar = new BufferedReader(new FileReader("src/testRead.txt"))) { bufferSugar = readerSugar.readLine(); System.out.println(bufferSugar); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
10.throw与throws
1)throws:用于声明异常,不做任何动作,谁调用就传给谁;表示出现异常的可能性,并不一定会发生;可以声明多个
2)throw:抛出具体的异常;执行throw,一定会抛出异常;只可抛出一个