1、常量用final
定义,final
修饰的类不能被继承,final
修饰的方法不能被重写,final
修饰的变量初始化以后不能被更改,且在定义final变量
时一定要赋值,即初始化。
2、if-if
和if-else if
的区别: 前者两个if判断都会进行,后者第一个判断为false才会进行第二个判断。
3、反射:Class
类保存着Java中的类型所有的信息,Class
也是Java中的一个类,也需要实例化对象才可以调用里面的方法(静态方法除外)
1.获取Class
类型的实例(对象)方法:
2.Class类常用方法:
4、Java父类引用指向子类对象:
现象:
对象是在Java程序运行时才确定的(非编译阶段)
上面例子中,a可以调用Man类中覆盖父类的同名方法,而Man类中自己独有的方法,a是不能去调用的。(编译会报错,因为编译器认为a是一个Person对象,而Person类中找不到Man类独自定义的方法),当然,a也可以获取Person类中的属性和方法。而当Person类和Man类中有同名属性时,a.该属性获取到的是Person类(即父类)中的属性,而非Man类(即子类)中的属性。
因而可以得出结论:
1.属性是绑定类型的,而方法是绑定对象的。
2.或者说属性是在编译器就确认的,而方法是动态绑定(多态)。
在继承多态中:
1.对于方法的覆盖,new的谁就调谁,这就是多态。
2.对于成员变量的覆盖,this在哪个类就指向哪个类的成员变量,没有多态。
3.意思即是Java中public方法才有多态性,而属性是没有多态的。
4.对象调用编译时类型的属性和运行时类型的方法,即所谓的动态连接。
参考文档:
http://www.tuicool.com/articles/ZziiIjJ
http://blog.csdn.net/rockpk008/article/details/52374203
http://blog.csdn.net/kaiwii/article/details/8042488
http://blog.csdn.net/qq_23419401/article/details/52064871
5、Java方法的重载
Overloaded的方法是可以改变返回值的类型。
这句话是正确的,唯一区分方法重载的是方法的参数列表不同,当参数列表不同时就可改变其返回类型
结论:
1.当参数列表不同时,能达到区分重载时,就可以改变方法的返回类型,即重载主要表现在参数上面,当能够区分重载时才能去改变返回值类型.。
2.若只是返回值类型不一样是算不上重载的。重载的判断条件还是根据参数来看,只不过是说重载的函数可以返回值不一样,就是说重载可以决定返回值类型,但是返回值类型不能决定重载。
6、java source folder
source folder下面的Java文件都会被编译,编译后的文件会被放在我们设置的某个文件夹下面(一般我们设置成WEB-INF/classes),source folder下面的非java文件会被copy一份放在我们的设置的文件夹下面。
7、Mybatis
核心: sqlSessionFactoryBuilder(构造器) -> sqlSessionFactory(工厂接口) -> sqlSession(会话)
8、操作符重载
定义:就是把已经定义的、有一定功能的操作符进行重新定义,来完成更为细致具体的运算等功能。操作符重载可以将概括性的抽象操作符具体化,便于外部调用而无需知晓内部具体运算过程。
String类是个特殊的类,对它的一些操作符是重载的,如:
结论:
1.String对象和基本类型一样(但是StringBuffer类则不是),一般情况下作为参数传递,在方法内改变了值,而原对象是不会被改变的。在Java中对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数。
2.Java都是通过引用来操作对象的,对象一般存储在堆(heap)中,而引用存储在速度更快的堆栈(stack)中。
9、static变量、static代码块
1.Class
(即类)中的static
变量在类被加载的时候static
成员变量即被初始化,与类关联,只要类存在,static
变量就存在。
2.当声明一个对象时,并不产生static
变量的拷贝,而是该类所有的实例变量共用同一个static
变量。
3.被static
修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static
对象可以在它的任何对象创建之前访问,无需引用任何对象。
4.static方法
中不能直接调用非static的变量,比如main
方法中,不能直接调用该类的其他非static变量,而需要通过对象调用。
10、枚举类enum用法
1.常量:
2.遍历、switch
3.给enum自定义属性和方法
4.原理分析
可以把enum
看成是一个普通的class
,它们都可以定义一些属性和方法,不同之处是:enum
不能使用extends
关键字继承其他类,因为enum
已经继承了java.lang.Enum
(java是单一继承)。
11、关于Session
1.Session
是另一种记录客户状态的机制,不同的是Cookie
保存在客户端浏览器中,而Session
保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session
。客户端浏览器再次访问时只需要从该Session
中查找该客户的状态就可以了。
2、如果说Cookie
机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session
机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session
相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
3、Session
对应的类为javax.servlet.http.HttpSession
类。每个来访者对应一个Session
对象,所有该客户的状态信息都保存在这个Session
对象里。Session
对象是在客户端第一次请求服务器的时候创建的。Session
也是一种key-value
的属性对,通过getAttribute(String key)
和setAttribute(String key, Object value)
方法读写客户状态信息。
4、当多个客户端执行程序时,服务器会保存多个客户端的Session
。获取Session
的时候也不需要声明获取谁的Session
。Session
机制决定了当前客户只会获取到自己的Session
,而不会获取到别人的Session。各客户的Session
也彼此独立,互不可见。
提示:Session
的使用比Cookie
方便,但是过多的Session
存储在服务器内存中,会对服务器造成压力。
5、由于会有越来越多的用户访问服务器,因此Session
也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的Session
从内存删除。这个时间就是Session
的超时时间。如果超过了超时时间没访问过服务器,Session
就自动失效了。
6、虽然Session
保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session
需要使用Cookie
作为识别标志。HTTP协议是无状态的,Session
不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID
的Cookie
,它的值为该Session
的id(也就是HttpSession.getId()
的返回值)。Session
依据该Cookie
来识别是否为同一用户。该Cookie
为服务器自动生成的,它的maxAge
属性一般为–1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session
。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie
,因此会共享一个Session
。
7、如果客户端浏览器将Cookie
功能禁用,或者不支持Cookie
怎么办?例如,绝大多数的手机浏览器都不支持Cookie
。Java Web提供了另一种解决方案:URL地址重写
。URL地址重写
的原理是将该用户Session
的id
信息重写到URL地址中。服务器能够解析重写后的URL获取Session
的id
。这样即使客户端不支持Cookie
,也可以使用Session
来记录用户状态。HttpServletResponse
类提供了encodeURL(String url)
实现URL地址重写,该方法会自动判断客户端是否支持Cookie
。如果客户端支持Cookie
,会将URL原封不动地输出来。如果客户端不支持Cookie
,则会将用户Session
的id
重写到URL中。
12、Java异常
1.设计异常处理 本来就是为了不可控制的异常 不去影响程序的流程
2.能捕捉到的异常,将之处理了,就不进行抛出了.处理不了,继续往该异常的上一层异常调用的地方抛出,直到解决.
3.try{}
里面包含可能会出错的代码,如果里面出错了,它会交给catch{}
处理,catch
可能把这个错误给屏蔽掉(就比如说你牙疼不能吃饭,来个止疼的药片,不影响你做其他的事情了)。不影响你之后的代码运行。但是如果你try{}
里面有多行代码第一行,第二行,第三行,如果第二行出错了,第三行是不执行的。如果有finally{}
这里面代码是处理后事的。比如说,你try
里面有操作工作流的,那么如果出错了fianlly
可以用力处理,关闭工作流对象,避免浪费资源。`finally{}是必须执行的,不管是出错了,还是不出错。