您的位置:首页 > 编程语言 > Java开发

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效率较低
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: