Java学习笔记
2015-09-24 09:47
435 查看
1. 静态模块和构造模块的区别
静态块:用static申明,JVM加载类时执行,仅执行一次构造块:类中直接用{}定义,每一次创建对象时执行
执行顺序优先级:静态块>main()>构造块>构造方法
静态块按照申明顺序执行,所以先执行
public staticB t1 = newB();该语句创建对象,则又会调用构造块,输出构造块
接着执行
public static B t1 = new B();输出构造块
再执行
static { System.out.println("静态块"); }
输出静态块
最后main方法执行,创建对象,输出构造块。
例如:
public class B { public static B t1 = new B(); public static B t2 = new B(); { System.out.println("构造块"); } static { System.out.println("静态块"); } public static void main(String[] args) { B t = new B(); } }
输出结果是:构造块 构造块 静态块
2.构造函数
父类没有无参的构造函数,所以子类需要在自己的构造函数中显式调用父类的构造函数,添加
super("nm");
否则报错:
Implicit super constructor Person() is undefined. Must explicitly
invoke another constructor
class Person { String name = "No name"; public Person(String nm) { name = nm; } } class Employee extends Person { public Employee(String nm) { super(nm); // TODO Auto-generated constructor stub } String empID = "0000"; } public class Test { public static void main(String args[]) { Employee e = new Employee("123"); System.out.println(e.empID); } }
3. super()和this()的区别
1)调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。2)super()和this()类似,区别是,super从子类中调用父类的构造方法,this()在同一类内调用其它方法。
3)super()和this()均需放在构造方法内第一行。
4)尽管可以用this调用一个构造器,但却不能调用两个。
5)this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
6)this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
7)从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。
4. JSP分页代码
先取总记录数,得到总页数,再取所有的记录,最后显示本页的数据。5. final的使用:
final所修饰的成员变量只能赋值一次,可以在类方法中赋值,也可以在声明的时候直接赋值,而final修饰的局部变量可以在声明的时候初始化,也可以在第一次使用的通过方法或者表达式给它赋值。Final修饰的类不能被继承,修饰的方法不能被子类覆盖,修饰的局部变量为常量,只能赋值一次。6. ThreadLocal类
1)ThreadLocal的类声明:public class ThreadLocal可以看出ThreadLocal并没有继承自Thread,也没有实现Runnable接口。
2)ThreadLocal类为每一个线程都维护了自己独有的变量拷贝。每个线程都拥有了自己独立的一个变量。所以ThreadLocal重要作用并不在于多线程间的数据共享,而是数据的独立。
由于每个线程在访问该变量时,读取和修改的,都是自己独有的那一份变量拷贝,不会被其他线程访问,变量被彻底封闭在每个访问的线程中。
3)ThreadLocal中定义了一个哈希表用于为每个线程都提供一个变量的副本:
static class ThreadLocalMap { static class Entry extends WeakReference<ThreadLocal> { /** The value associated with this ThreadLocal. */ Object value; Entry(ThreadLocal k, Object v) { super(k); value = v; } } /** * The table, resized as necessary. * table.length MUST always be a power of two. */ private Entry[] table; }
7. stract class 和 interface 有什么区别
含有abstract修饰符的class即为抽象类,abstract类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然 eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。
两者在应用上的区别:
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码,伪代码如下:
package com.lei; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public abstract class BaseServlet extends HttpServlet { /** * serialVersionUID属性概述 * */ private static final long serialVersionUID = 1L; public final void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // 记录访问日志 // 进行权限判断 if (true)// if条件里写的是“具有权限” { try { doService(request, response); } catch (IOException e) { // 记录异常信息 } } } protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException; }
实例类如下:
package com.lei; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyServlet extends BaseServlet{ /** * serialVersionUID属性概述 * */ private static final long serialVersionUID = 1L; @Override protected void doService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // TODO Auto-generated method stub } }
父类方法中间的某段代码不确定,留给子类干,就用模板方法设计模式。
备注:这道题的思路是先从总体解释抽象类和接口的基本概念,然后再比较两者的语法细节,最后再说两者的应用区别。
比较两者语法细节区别的条理是:先从一个类中的构造方法、普通成员变量和方法(包括抽象方法),静态变量和方法,继承性等6个方面逐一去比较回答,接着从第三者继承的角度的回答,特别是最后用了一个典型的例子来展现自己深厚的技术功底。
8. request的forward和response的redirect
1)redirect地址栏变化,forward发生在服务器端内部从而导致浏览器不知道响应资源来自哪里2)redirect可以重定向到同一个站点上的其他应用程序中的资源,forward 只能将请求 转发给同一个WEB应用中的组件
3)redirect默认是302码,包含两次请求和两次响应
4)redirect效率较低
相关文章推荐
- 在java项目文件读取数据库文件prodect.xml信息
- spring mvc综合easyui点击上面菜单栏中的菜单项问题
- java根据jar包反编译后修改再打包回jar的做法
- 给java项目改名字
- 使用 JavaFX 快速创建应用程序
- Java基础知识强化53:经典排序之选择排序(SelectionSort)
- 将java log4j的日志配置输出到mysql中
- java集合类中的迭代器
- SimpleDateFormat使用详解 java
- 深入理解Java:注解(Annotation)--注解处理器
- JAVA 学习关于 类
- java冒泡排序算法
- 深入理解Java:注解(Annotation)基本概念
- Java基础知识强化52:经典排序之冒泡排序(BubbleSort)
- java中的Eclipse的主要视图
- 深入理解Java:注解(Annotation)自定义注解入门
- Java使用串行编程操作继电器
- Java Keyword -- super
- 【SSH】——Struts2中的动态方法调用(二)
- javaEE__JSP指令