[黑马程序员] Java基础加强(5-7天)2010年Java高新技术_张孝祥

来源:互联网 发布:c语言中temp 编辑:程序博客网 时间:2024/05/21 09:06
---------------------- ASP.Net+Android+IO开发.Net培训、期待与您交流! ----------------------

第1单元:概述
(4.10)
------------------------
------------------------
第2单元:eclipse开发工具
(4.10) // 找工作的时候包和类命名专业点. .
------------------------
1. ide --> Integrated Development Environment
2. 包括快捷键在内的设置都是以工作间为单位的.
3. 默认代码助手(Content Assist)快捷键是: <Alt+/>.
------------------------
第3单元:java5的一些简单新特性
(4.11)
------------------------
1. 对大小为-128~127的整数装箱成Integer时, 就利用了享元(flyweight)模式: Integer类中直接就含有了这些常用的数字对应的对象(?).
------------------------
第4单元:java5的枚举
(4.11)
------------------------
1. 可以用枚举类创建单例, 也可以手写
class Singleton
{
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance()
{
if(instance == null)
{
instance = new Singleton();
}
return instance;
}
}
------------------------
第5单元:反射的深入讲解
(4.24)
------------------------
1. 如何得到各字节码对应的实例对象(Class类型)
a. 类名.class
b.对象.getclass()
c.Class.forName("类名")
2. 有9个与定义的Class实例对象:八个基本数据(boolean,byte,short,char,int,long,float,double)类型对应的 和 void关键字对应的。
3. 反射会导致性能严重下降。
4. 代码前加@Override后,表示强制重载,即如果这段代码定义的是一个新的方法的话会报错。必须继承重载。
5. 使用Class类的forName方法的时候,字符串参数必须是类的全名,导包对它不起作用。
6. Method类的invoke方法传入的第二个参数是数组时,要用new Object[]{}包装下或用(Object)强制转换下。
7. 相同维度和元素类型的数组反射成一个组。
8. 基本数据类型的变量没有继承Object类。
9. 导包快捷键: Ctrl+Shift+O导入所有用到的未导入的包,切删除导入但没用到的包;光标定位到红色波浪线的单词,Ctrl+Shift+M,导入指定包。
10. 反射的作用: 实现框架功能。
11. 框架与工具类的区别: 工具类被用户的类调用;框架调用用户提供的类。
12. 内省(IntroSpector), 是对Bean类(特殊的Java类)事件、属性的一种缺省处理方法。
//JDK中提供了对JavaBean进行操作的一些API(
  • java.beans.PropertyDescriptor),这套API就称为内省。
  • 13. 使用beanutils包要导入beanutils包和logging包。
    14. BeanUtils的getProperty和setProperty方法都可以对属性连续操作(属性链)。
    15. java bean 必须有一个不带参数的构造方法 。
    ------------------------
    第6单元:Java5的注解(annotation)
    (4.27)
    ------------------------
    1. 标记可以加在方法、包、类、成员变量、方法的参数、局部变量等上面。
    2. 元注解:注解的注解。(元数据:数据的数据。原信息:信息的信息。)
    3. @Retention用来说明注解保留到什么阶段,如@Retention(RetentionPolicy.RUNTIME )保留到内存运行时;RetentionPolicy.SOURCE; RetentionPolicy.CLASS. 共三种状态。
    4. @Target说明此注解用在什么成分上。
    5. 声明自己的注释类使用“@interface"关键字。
    ------------------------
    第7单元:java5的泛型(Generic)
    (4.27)
    ------------------------
    1. 编译器编译带类型说明的集合时会去除”类型“。
    2. ArrayList<E>类定义中的术语:ArrayList<E>称为泛型类型;E称为类型变量或类型参数。
    3. ArrayList<Integer>念作:ArrayList typeof Integer。
    4. 创建数组实例时,数组的元素不能使用参数化的类型(声明时可以)。
    Vector<Integer> vectorList[] = new Vector<Integer>[10]; 错
    5. Vector<?>、Vector<? extends Number> 、Vector<? super Number>。
    6. 自定义泛型方法: (接受两个T类型的参数,返回一个T类型的值。) (T只能代表引用类型,不能代表基本类型。例如: T可以不能代替int,但可以代替由int自动装箱来的Integer。)
    private static <T>T add(T x,T y){
    return null;
    }
    7. 用于放置泛型的类型参数的尖括号应出现在其他所有修饰符之后和在方法的返回类型之前,也就是紧邻返回值之前。按照惯例,类型参数通常用单个大写字母表示。
    8. 只有引用类型才能作为泛型方法的实际参数。
    ------------------------
    第8单元:类加载器的深入讲解与应用
    (4.28)
    ------------------------
    1. Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader.
    2. BootStrap是ExtClassLoader的父类,ExtCalssLoader是ApptClassLoader的父类。
    3. BootStrap---->JRE/lib/rt.jar
    ExtClassLoader---->JRE/lib/ext/*.jar
    AppClassLoader--->CLASSPATH指定的所有jar或目录
    ------------------------
    第9单元:动态代理技术的深入讲解
    (4.28)
    ------------------------
    1. 为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,如异常处理、日志、计算方法的运行时间、事务管理等。
    2. 面向切面编程(AOP, Aspect Oriented Programming)用到代理(proxy)。
    3. JVM生成的动态类必须实现一个或多个接口, 所以, JVM生成的动态类只能用作具有相同接口的目标类的代理。
    4. CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,所以,如果要为一个没有实现接口的类生成动态代理类,那么可以使用CGLIB库。
    5. 代理类除了调用目标方法外还可以做别的,相应的代码可以在如下四个位置上:
    a. 调用目标方法之前。
    b. 调用目标方法之后。
    c. 调用目标方法前后。
    d. 在处理目标方法异常的catch块中。
    6. () java.lang.reflect.Proxy类的getProxyClass(ClassLoader loader, Class<?>... interfaces) 需要传入一个ClassLoader类,因为,在要内存中调用一个类,此时没有类加载器,必须指定一个。
    7. StringBuilder和StringBuffer区别:前者单线程,效率高。
    8. 对于从java.lang.Object继承来的方法,只有toString,hashCode,equals 三个派发给InvocationHandler的invoke方法来执行。
    ------------------------
    第10单元:多线程及java5的线程并发库
    (4.30)
    ------------------------
    1. java.lang.Thread
    2. 用synchronized关键字保证代码块线程同步, 它还可以修饰方法,保证方法作为一个整体。 实现线程互斥。
    3. wait和notify实现线程通信。
    4. java.lang.ThreadLocal实现线程范围的共享变量。
    5. java5增加了线程并发库: java.util.concurrent包及其子包。
    6. 线程池:java.util.concurrent.Executors,java.util.concurrent.ExecutorService等。
    7. 创建多线程的方法:a. 继承Thread重写run(); b. 传入Runnable对象给Thread; c. Callable和Future实现多线程。
    8. 可以用Callable和Future实现多线程。 Callable要采用ExecutorSevice的submit提交,Future用来获得结果。
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    public class CallableAndFuture {
    /**
    * @param args
    */

    public static void main(String[] args) {
    ExecutorService threadPool = Executors.newSingleThreadExecutor();
    Future<String> future=
    threadPool.submit(
    new Callable<String>() {
    public String call() throws Exception {
    Thread.sleep(2000);
    return "Hello";
    };
    }
    );

    System.out.println("等待结果");
    try {
    System.out.println("拿到结果: " + future.get());
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (ExecutionException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    }
    }
    9. CompletionService用于提交一组Callable任务,其take方法返回已完成的一个Callable任务对应的Future对象。
    10. java.util.concurrent.locks.Lock接口。
    class Outputer{
    Lock lock = new ReentrantLock();
    public void output(String name){
    int len = name.length();
    try {
    lock.lock();
    for (int i=0; i< len; i++) {
    System.out.print(name.charAt(i));
    }
    System.out.println();
    } finally {
    lock.unlock();
    }
    }
    11. java.util.concurrent.locks.ReadWriteLock接口, 读写锁,分读锁和写锁。多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥。

    13. 视频看到了@12.

    ---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

    详细请查看:http://edu.csdn.net