4.5
1.类指外部类,最大的类,修饰符有public(表示该类在项目所有类中可以被导入),default(该类只能在同一个package中使用),abstract,final
2.内部类指位于类内部但不包括位于块、构造器、方法内,且有名称的类,修饰符有public,private,protected访问控制符,也可以用static,final关键字修饰,public和private比较简单,一个表示所有可以被所有类访问,一个表示只能被自身访问,protected修饰的成员类可以被同一个包中的类和子类访问。而default修饰的成员类只能被同一个包中的类访问。
3.局部内部类指位于块、构造器、方法内的有名称类,最多只能有final修饰
4.6
9. finally里的代码在try或catch中的return语句前执行;
10. Thread的start()才能真正启动线程,此时线程会处于就绪状态,一旦得到时间片,则会调用线程的run方法进入运行状态;
而run()只是普通方法,如果直接调用,相当于函数调用,直接执行;
11. LinkedHashSet按添加顺序排序,TreeSet自然排序;
4.一个源文件中有几个类和接口,经javac编译后就会有几个class文件;
5.String对象两种创建方式:
第一种:String s1 = “aaa”是在常量池中获取对象
第二种:String s2 = new String(“aaa”)一共会创建两个字符串对象,一个在堆中,一个在常量池中(前提是常量池中没有“aaa”对象)
6.String无decode、encode方法
能实现GBK编码字节流到UTF-8字节流的转换:dst = new String(src,“GBK”).getBytes(“UTF-8”)
7.java数据库连接JDBC用到的 桥接模式
桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化
8.Struts通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller(MVC)设计模式的应用框架,是MVC经典设计模式中的一个经典产品。
Struts1要求Action类继承一个抽象基类;Struts2 Action类可以实现一个Action接口;
Struts1 Action依赖于Servlet API,Struts2 Action不依赖于容器,允许Action脱离容器单独被测试;
Struts1整合了JSTL,Struts2可以使用JSTL,但是也支持OGNL
9.引导类加载器:用来加载Java核心库,使用原生代码实现的
拓展类加载器:用来加载Java的拓展库
系统类加载库:根据Java应用的类路径(CLASSPATH)来加载Java类
tomcat为每个App创建一个Loader,里面保存着此WebApp的ClassLoader;需要加载WebApp下的类时,就取出ClassLoader来使用;
10.final修饰类、方法、属性; 不能修饰抽象类,应为抽象类还要被继承;
修饰的方法不能被重写,而不是重载;
修饰属性,不能被再次赋值
4.7
12. 不考虑反射机制,一个子类显式调用父类的构造器必须用Super关键字
super代表子类的直接父类特征,可以访问父类的成员变量、成员方法、构造方法
在子类中,存在与父类相同的属性和方法,由于访问子类中属性和方法的优先级高于父类,可以通过super关键字来访问父类中的属性和方法
13. 装箱拆箱操作:即基本数据类型与包装类之间的转换,如int—装箱—>Integer、Integer—拆箱–>int,发生在引用类型和值类型之间,包装类即引用数据类型、基本数据类型即值类型;
14. 被static修饰的变量称为静态变量,静态变量属于整个类,而局部变量属于方法,只有在方法内有效,所以static不能修饰局部变量
15.当try和catch中有return时,finally仍然会执行,但finally后语句不会执行
一旦在finally块中使用了return或throw语句,将会使try块、catch块中return、throw语句失效
16.没有<<<符号,因为<<后右边总是补0
<<表示左移、>>表示带符号右移、 >>>表示无符号右移
17.Java基本数据类型包括Boolean和数值类型,数值类型有整数类型和浮点类型。整数类型有byte、short、int、long、char;浮点类型包括float、double
引用类型包括 类、接口、数组类型以及特殊的null类型
18.Java运行时“线程私有”:java虚拟机栈、程序计数器、本地方法栈
“线程共享”:java堆、方法区
19、根据作用于规则,在函数中定义的变量只能在函数中引用、不能与其所在参数的形参重名、存储单元在内存中的栈区(堆主要用于存放对象,栈主要用来执行程序)
20、定义一维数组,必须显式指明数组的长度
定义多维数组时,其一维数组的长度必须首先指明,其他维数组的长度可以稍后指定;
采用给定值初始化数组时,不必指明长度;
“[]”为数组运算符,在声明一个数组时,数组运算符可以放在数据类型与变量之间,也可以放在变量之后
4.8
1.HttpServlet容器响应Web客户请求流程如下:
1)Web客户向Servlet容器发出Http请求;
2)Servlet容器解析Web客户的Http请求;
3)Servlet容器创建一个HttpRequest对象,在这个对象中封装Http请求信息;
4)Servlet容器创建一个HttpResponse对象;
5)Servlet容器调用HttpServlet的service方法,这个方法中会根据request的Method来判断具体是执行doGet还是doPost,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet对象;
6)HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息;
7)HttpServlet调用HttpResponse的有关方法,生成响应数据;
8)Servlet容器把HttpServlet的响应结果传给Web客户。
doGet()或doPost()是创建HttpServlet时需要覆盖的方法.
List、Set、Map都继承自Collection接口
1)List 是一个有序集合,可以存放重复的数据 (有序:存进是什么顺序,取出时还是什么顺序)
(1).ArrayList 底层是数组适合查询,不适合增删元素。
(2).LinkedList 底层是双向链表适合增删元素,不适合查询操作。
(3).Vector 底层和ArrayList相同,但是Vector是线程安全的,效率较低很少使用
2) Set 是一个无序集合,不允许放重复的数据 (无序不可重复,存进和取出的顺序不一样)
(1).HashSet 底层是哈希表/散列表
(2).TreeSet 继承sartedSet接口(无序不可重复,但存进去的元素可以按照元素的大小自动排序)
3)Map 是一个无序集合,以键值对的方式存放数据,键对象不允许重复,值对象可以重复。
(1).HashMap实现不同步,线程不安全。 HashTable线程安全
(2).HashMap中的key-value都是存储在Entry中的。
(3).HashMap可以存null键和null值,不保证元素的顺序恒久不变,它的底层使用的是数组和链表,通过hashCode()方法和equals方法保证键的唯一性
instanceof用来判断左边对象是不是右边(类、抽象类、父类、接口)的实例
JAVA 子类重写继承的方法时,不可以降低方法的访问权限,子类继承父类的访问修饰符要比父类的更大,也就是更加开放,假如我父类是protected修饰的,其子类只能是protected或者public,绝对不能是friendly(默认的访问范围)或者private,当然使用private就不是继承了。还要注意的是,继承当中子类抛出的异常必须是父类抛出的异常的子异常,或者子类抛出的异常要比父类抛出的异常要少。
java提供了一个系统级的线程,即垃圾回收器线程。用来对每一个分配出去的内存空间进行跟踪。当JVM空闲时,自动回收每块可能被回收的内存,GC是完全自动的,不能被强制执行。程序员最多只能用System.gc()来建议执行垃圾回收器回收内存,但是具体的回收时间,是不可知的。当对象的引用变量被赋值为null,可能被当成垃圾。
类方法是指用static修饰的方法,普通方法叫对象方法。
this指的是当前对象,类方法依附于类而不是对象,用this调用类方法会编译错误
类方法中也可以调用其他类的类方法。同时可以通过创建对象来调用普通方法
类方法中可以创建对象,所以可以调用实例方法
就像main方法就是一个类方法(静态方法),然后下面写两个方法,一个静态方法,一个普通方法;想要调用静态方法可以直接类名.方法,想要调用普通方法需要实例化对象,用类对象去调用普通方法;所以说类方法中可以有实例方法,可以调用实例化对象,看main方法就明白了
off-heap叫做堆外内存,将你的对象从堆中脱离出来序列化,然后存储在一大块内存中,这就像它存储到磁盘上一样,但它仍然在RAM中。对象在这种状态下不能直接使用,它们必须首先反序列化,也不受垃圾收集。序列化和反序列化将会影响部分性能(所以可以考虑使用FST-serialization)使用堆外内存能够降低GC导致的暂停。堆外内存不受垃圾收集器管理,也不属于老年代,新生代。
JVM GC回收堆和方法区
4.9
10. Applet类是浏览器类库中最为重要的类,同时也是所有
JAVA小应用程序的基本类。
一个Applet应用程序从开始运行到结束时所经历的过程被称为
Applet的生命周期。
Applet的生命周期涉及init()、start()、stop()和destroy()四种方法,这4种方法都是Applet类的成员,可以继承这些方法,也可以重写这些方法,覆盖原来定义的这些方法。除此之外,为了在Applet程序中实现输出功能,每个Applet程序中还需要重载paint()方法:
1、
public void init()
init()方法是Applet运行的起点。当启动Applet
程序时,系统首先调用此方法,以执行初始化任务。
2、
public void start()
start()方法是表明Applet程序开始执行的方法。当含有此Applet程序的Web页被再次访问时调用此方法。因此,如果每次访问Web页都需要执行一些操作的话,就需要在Applet程序中重载该方法。在Applet程序中,系统总是先调用init()方法,后调用start()方法。
3、
public void stop()
stop()方法使Applet停止执行,当含有该Applet的Web页被其他页代替时也要调用该方法。
4、
public void destroy()
destroy()方法收回Applet程序的所有资源,即释放已分配给它的所有资源。在Applet程序中,系统总是先调用stop()方法,后调用destroy()方法。
5、
paint(Graphics g)
paint(Graphics g)方法可以使Applet程序在屏幕上显示某些信息,如文字、色彩、背景或图像等。参数g是Graphics类的一个对象实例,实际上可以把g理解为一个画笔。对象g中包含了许多绘制方法,如drawstring()方法就是输出字符串。
抽象类
可以实现接口,而且抽象类可以继承自抽象类
必须有“abstract class”修饰,可以包含抽象方法也可以不包含
抽象类和接口都不能被实例化,只有具体的类才能实例化
接口和抽象类的区别:
1.接口的方法默认为public abstract ,接口中的变量默认为public static final,在java8之前所有的方法不能有实现
抽象类中可以有非抽象方法
2.一个类可以实现多个接口,但只能继承一个抽象类
3.一个类实现接口,要实现该接口的所有抽象方法。
4.接口不能被实例化,但可以声明,但是必须引用一个实现该接口的对象。
抽象类可以有构造方法,但是不能被直接通过new进行实例化。但可以通过子类继承,实例化子类的时候抽象类也会被实例化。
这其实用到了多态,向上转型。父类引用指向子类对象。
5.从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
类与类之间关系为继承,只能是单继承,可以多层继承; 类与接口之间关系为实现,既可以单实现,也可以多实现; 接口与接口之间关系为继承,既可以单继承,也可以多继承
== 优先级高于三目运算符?,?右结合
Thread.sleep() 和 Object.wait(),都可以抛出 InterruptedException。这个异常是不能忽略的,因为它是一个检查异常(checked exception)
getParameter()是获取POST/GET传递的参数值;
getInitParameter获取Tomcat的server.xml中设置Context的初始化参数
getAttribute()是获取对象容器中的数据值;
getRequestDispatcher是请求转发。
JSP内置对象有:
1.request对象
客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。
2.response对象
response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。
3.session对象
session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。它是HttpSession类的实例.
4.out对象
out对象是JspWriter类的实例,是向客户端输出内容常用的对象
5.page对象
page对象就是指向当前JSP页面本身,有点象类中的this指针,它是java.lang.Object类的实例
6.application对象
application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。
7.exception对象
exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象
8.pageContext对象
pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本 类名也叫pageContext。
9.config对象
config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)
4.10
构造方法不能被子类继承,所以用final修饰没有意义;构造方法用于创建一个新的对象,不能作为类的静态方法,用static修饰没有意义;此外,JAVA语言不支持native或synchronized的构造方法;
加载驱动程序:调用方法Class.forName、添加系统的jdbc.drivers属性、通过registerDriver方法注册
4.12
4.13
6. System是java.lang中的一个类,out是System内的一个成员变量,这个变量是一个java.io.PrintStream类的对象,println呢就是一个方法了。
7. 局部变量可以先申明不用必须初始化,但使用到了一定要初始化
8. volatile与synchronized的区别:
volatile本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中读取,synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住.
volatile仅能使用在变量级别,synchronized则可以使用在变量,方法.
volatile仅能实现变量的修改可见性,但不具备原子特性,而synchronized则可以保证变量的修改可见性和原子性.
volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞.
volatile标记的变量不会被编译器优化,而synchronized标记的变量可以被编译器优化.
** 4.14**
9. Java整数类型 默认int 带小数默认double
10. 构造器没有返回值,这个没有返回值与返回值为void不同; 每个类在没有自己显示声明构造器时,都会有一个默认的无参构造; 构造器可以重载,而且可以使用super()、this()互相调用; 每个构造器的默认第一行都是Super(),但是一旦父类中没有没有无参构造,必须在子类的第一行显式的声明调用哪一个构造
11. 方法内变量没有初始值,必须进行初始化;类中变量可以不需要初始值,默认初始类型; final类型的变量一定要初始化
4.15
12. 创建派生类对象,构造函数执行顺序:
父类静态域 -》子类静态域-》父类成员初始化-》父类构造块-》父类构造方法-》子类成员初始化-》子类构造块-》子类构造方法
13. 重载是在一个类中,有多个方法名相同,参数列表不同(参数个数不同、参数类型不同),与方法返回值无关,与权限修饰符无关;
14. 引用类型:
强引用:垃圾回收器永远不会回收;软引用:非必要但仍有用的对象,内存充足不会回收; 弱引用:不管内存是否充足,只要JVM开始垃圾回收,就会被回收; 虚引用:最弱的一种引用,随时会被回收
4.16
15. 在委托事件模型中,源生成事件并把它发送给一个或多个监听器,每个监听器必须向事件源注册
16.java只支持单继承,实现多继承 1.直接实现多个接口、2、继承一个类然后实现一个或多个接口、3、通过内部类去继承其他类
17.面向对象基本原则:单一职责、开放封闭、依赖倒置、接口隔离、里氏替换
抽象类原则不属于