Java笔试必考知识点合集五

1.Java代码的执行注意点

*Java类的加载顺序 :
  • (1) 父类静态代码块(包括静态初始化块,静态属性,但不包括静态方法) 
  • (2) 子类静态代码块(包括静态初始化块,静态属性,但不包括静态方法 ) 
  • (3) 父类非静态代码块( 包括非静态初始化块,非静态属性 ) 
  • (4) 父类构造函数 
  • (5) 子类非静态代码块 ( 包括非静态初始化块,非静态属性 ) 
  • (6) 子类构造函数 
其中:类中静态块按照声明顺序执行,并且(1)和(2)不需要调用new类实例的时候就执行了(意思就是在类加载到方法区的时候执行的) 
*方法重写实现多态问题:
Base b = new Sub();
它为多态的一种表现形式,声明是Base,实现是Sub类,理解为  b 编译时表现为Base类特性,运行时表现为Sub类特性。当子类覆盖了父类的方法后,意思是父类的方法已经被重写,所以父类初始化调用的方法为子类实现的方法,此时子类非静态代码块和初始化步骤还没有执行到,所以子类中的变量还没有被初始化,因此都为默认值。  

2.Spring事务管理

      Spring提供了 对编程式事务和声明式事务的支持,编程式事务是嵌在业务代码中的,而声明式事务是基于xml文件配置。
       声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
       声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中 。
       Spring本身并不直接管理事务,而是提供了事务管理器接口,对于不同的框架或者数据源则用不同的事务管理器;而对于事务,它把相关的属性都封装到一个实体里边去,有以下的属性:
  •     int propagationBehavior;    /*事务的传播行为*/   
  •     int isolationLevel;                /*事务隔离级别*/   
  •     int timeout;                         /*事务完成的最短时间*/   
  •     boolean readOnly;              /*是否只读*/readOnly -- 事务隔离级别,表示只读数据,不更新数据
  <!-- 配置事务管理器 -->  
      <property name="transactionManager"> 
  <!-- 配置事务属性 -->  
      <property name="transactionAttributes">        <props> 
Spring7中事务传播执行类型:
  • PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 
  • PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。  
  • PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。 
  • PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。  
  • PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。  
  • PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
  • PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

3.Java中关键字和保留字

*Java 关键字列表 (依字母排序 共50组):

abstract, assert, boolean, break, byte, case, catch, char, class, const(保留关键字), 
continue, default, do, double, else, enum, extends, final, finally, float, for, goto(保留关键字),
if, implements, import, instanceof, int, interface, long, native, new, package, private,
protected, public, return, short, static, strictfp, super, switch, synchronized, this, 
throw, throws, transient, try, void, volatile, while
*保留字列表 (依字母排序 共14组):
Java保留字是指现有Java版本尚未使用,但以后版本可能会作为关键字使用:
byValue, cast, false, future, generic, inner, operator, 
outer, rest, true, var, goto (保留关键字) , const (保留关键字) , null

4.Java异常与错误

 异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。 
 Java的异常(包括Exception和Error)分为:
  • 可查的异常(checked exceptions)
  • 和不可查的异常(unchecked exceptions) 
    可查异常(编译器要求必须处置的异常):
       正确的程序在运行中,很容易出现的、情理可容的异常状况 。可查异常虽然是异常状况,但在一定程度上它的发生是可以预计的,而且一旦发生这种异常状况,就必须采取某种方式进行处理。 除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。 
    不可查异常(编译器不要求强制处置的异常):
       包括运行时异常(RuntimeException与其子类)和错误(Error)。
  Exception 这种异常分两大类:
  • 运行时异常
  • 非运行时异常(编译异常)。程序中应当尽可能去处理这些异常。 
  运行时异常:
      都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不可查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。运行时异常的特点是 Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。 
  非运行时异常 (编译异常): 
      是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。 

5.Java中的null

 一、null是代表不确定的对象 
      Java中,null是一个保留字,用来标识一个不确定的对象。因此 可以将null赋给引用类型变量,但不可以将null赋给基本类型变量。 
      比如:
                 int a = null;是错误的。Ojbect o = null是正确的。 
      Java中,变量的适用都遵循一个原则,先定义,并且初始化后,才可以使用。我们不能int a后,不给a指定值,就去打印a的值。(当然这种情况只出现在成员变量,因为成员变量是有初始值的)这条对于引用类型变量也是适用的。 
       有时候,我们定义一个引用类型变量,在刚开始的时候,无法给出一个确定的值,但是不指定值,程序可能会在try语句块中初始化值。这时候,我们下面使用变量的时候就会报错。这时候,可以先给变量指定一个null值,问题就解决了。例如: 
        Connection conn = null; 
        try { 
            conn = DriverManager.getConnection("url", "user", "password"); 
        } catch (SQLException e) { 
            e.printStackTrace(); 
        }   
        String catalog = conn.getCatalog(); 
如果刚开始的时候不指定conn = null,则最后一句就会报错。   
二、null本身不是对象,也不是Objcet的实例 
      null本身虽然能代表一个不确定的对象,但就null本身来说,它不是对象,也不知道什么类型,也不是java.lang.Object的实例。 
      可以做一个简单的例子: 
        //null是对象吗? 属于Object类型吗? 
        if (null instanceof java.lang.Object) { //instanceof关键字可以判断前者是否属于后边的类型
            System.out.println("null属于java.lang.Object类型"); 
        } else { 
            System.out.println("null不属于java.lang.Object类型"); 
        }  
        //结果会输出:null不属于java.lang.Object类型 
三、Java默认给变量赋值 
     在定义变量(类的成员变量)的时候,如果定义后没有给变量赋值,则Java在运行时会自动给变量赋值。赋值原则是整数类型int、byte、short、long的自动赋值为0,带小数点的float、double自动赋值为0.0,boolean的自动赋值为false,其他各供引用类型变量自动赋值为null,这个具体可以通过调试来看。 
四、容器类型与null 
  • List:允许重复元素,可以加入任意多个null。 
  • Set:不允许重复元素,最多可以加入一个null。 
  • Map:Map的key最多可以加入一个null,value字段没有限制。 
  • 数组:基本类型数组,定义后,如果不给定初始值,则java运行时会自动给定值。引用类型数组,不给定初始值,则所有的元素值为null。 
五、null的其他作用   
1、判断一个引用类型数据是否null。 用==来判断。 
2、释放内存,让一个非null的引用类型变量指向null。这样这个对象就不再被任何对象应用了。等待JVM垃圾回收机制去回收。 

6.方法重写原则

方法的重写(override)两同两小一大原则: 

  • 方法名相同,参数类型相同 
  • 子类返回类型小于等于父类方法返回类型, 
  • 子类抛出异常小于等于父类方法抛出异常, 
  • 子类访问权限大于等于父类方法访问权限。

补充:

Java中的byte,short,char进行计算时都会提升为int类型。 





猜你喜欢

转载自blog.csdn.net/goodli199309/article/details/80957672