1.Java代码的执行注意点


*Java类的加载顺序 :


  • (1) 父类静态代码块(包括静态初始化块,静态属性,但不包括静态方法) 
  • (2) 子类静态代码块(包括静态初始化块,静态属性,但不包括静态方法 ) 
  • (3) 父类非静态代码块( 包括非静态初始化块,非静态属性 ) 
  • (4) 父类构造函数 
  • (5) 子类非静态代码块 ( 包括非静态初始化块,非静态属性 ) 
  • (6) 子类构造函数 

其中:类中静态块按照声明顺序执行,并且(1)和(2)不需要调用new类实例的时候就执行了(意思就是在类加载到方法区的时候执行的) 


*方法重写实现多态问题:


Base b = new Sub();


 b 编译时表现为Base类特性,运行时表现为Sub类特性。当子类覆盖了父类的方法后,意思是父类的方法已经被重写,所以父类初始化调用的方法为子类实现的方法,此时子类非静态代码块和初始化步骤还没有执行到,所以子类中的变量还没有被初始化,因此都为默认值。  


2.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组):




java笔试题难易程度 java笔试知识点_Spring事务管理



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 这种异常分两大类:


  • 运行时异常
  • 非运行时异常(编译异常)。程序中应当尽可能去处理这些异常。 


  运行时异常:


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类型。