黑马程序员 java高新技术笔记(一)

来源:互联网 发布:linux mplayer 分辨率 编辑:程序博客网 时间:2024/05/17 05:03

                       ----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

 1、静态导入
 import static java.lang.System.out;//导入java.lang包下的System类的静态方法out;
 public class HelloWorld{
     public static void main(String[] args){
         out.print("Hello World!");//既是在这里不用再写成System.out.println("Hello World!")了,因为已经导入了这个静态方法out。
     }
 }
 import xxxx 和 import static xxxx的区别是前者一般导入的是类文件如import java.util.Scanner;后者一般是导入静态的方法,import static java.lang.System.out;
 2、可变参数
 如果一个方法接受的参数个数不固定,就需要重载方法多次以接收不同个数的参数,为此jdk 1.5提出可变参数概念。
 可变参数的特点:
 只能出现在参数列表的最后。
 书写方法:...位于变量类型和变量名之间,前后有无空格都可以。
 调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
3、基本数据类型的自动装箱与拆箱
 自动装箱:
 Integer num1 = 3;
 自动拆箱:
 System.out.println(num + 5);
 基本数据类型的对象缓存:
 Integer num1 = 5;
 Integer num2 = 5;
 System.out.println(num1 == num2);//true,一个字节长度内即-128~127会缓存起来,下次直接从内存中调用,这也是享元模式:将经常用到的数据缓存起来,而不是每次都新建一个对象,以节省空间提高效率。
 Integer num3 = 128;
 Integer num4 = 128;
 System.out.println(num3 == num4);//false
 Integer num5 = Integer.valueOf(5);
 Integer num6 = Integer.valueOf(5);
 System.out.println(num5 == num6);//true,和自动装箱机制一样
 4、枚举
 枚举就是让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法做到这一点。
 枚举是一个特殊的类,其中的每个元素都是该类的一个实例对象,其中也可以定义构造方法、成员变量、普通方法、抽象方法。
 枚举元素必须放在枚举体的最开始部分,枚举元素列表的后面要有分号与其他元素分隔,否则编译器报错。
 带构造方法的枚举:
 构造方法必须定义为私有的;
 枚举元素MON和MON()的效果一样,都是调用默认的构造方法。
 枚举中每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义。
 枚举只有一个成员时,就可以作为一种单例的实现方式。
 public enum WeekDay {
SUN(1), MON(), TUE, WED, THI, FRI, SAT;
private WeekDay() {
 System.out.println("first");
  }
  private WeekDay(int day) {
System.out.println("second");
  }
 }
  public enum TrafficLamp {
RED(30) {
    public TrafficLamp nextLamp() {
 return GREEN;
   }
  },
   GREEN(20) {
  public TrafficLamp nextLamp() {
return YELLOW;
   }
  },
  YELLOW(10) {
   public TrafficLamp nextLamp() {
    return RED;
   }
  };
  public abstract TrafficLamp nextLamp();
  private int time;
  private TrafficLamp(int time) {
    this.time = time;
  };
 }
 
5、内省,javabean
 javabean是一种特殊的java类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。
 如果要在两个模块之间传递多个信息,可以将这些信息封装到一个javabean中,这种javabean对象的实例对象通常称之为值对象(Value Object,简称VO)。
 一个类被当做javabean使用时,javabean的属性是根据方法名推断出来的,因为外部看不到javabean内部的成员变量。javabean的属性名称是set方法去掉set前缀,如果剩余部分第二个字母是小写的,则把剩余部分的首字母改成小写。例如:
 setId()的属性名为id;
 setCPU()的属性名为CPU;
 //mainMethod.invoke(null, new String[]{"111","222","333"});
 开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都使用反射技术完成此类操作过于麻烦,所以sun公司开发了一套API,专门用于操作java对象的属性。 
 内省访问JavaBean属性的两种方式: 
 1>通过PropertyDescriptor类操作Bean的属性。
 2>通过Introspector类获得Bean对象的BeanInfo,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后通过反射机制来调用这些方法。
 对javabean的简单内省操作:
  ReflectPoint rp = new ReflectPoint(3,3);
  PropertyDescriptor pd = new PropertyDescriptor("x", rp.getClass());//获取属性描述对象
  Method methodGetX = pd.getReadMethod();//获取get方法
  System.out.println(methodGetX.invoke(rp));//输出3
  Method methodSetX = pd.getWriteMethod();//获取set方法
  methodSetX.invoke(rp, 7);
  System.out.println(rp.getX());//输出7
  
6、BeanUtils工具包
   将一个jar包直接导入某个工程时,如果工程移动,可能导致找不到jar包,方便的做法是:工程下新建一个文件夹,存放jar包,再右键build path加载到构建路径下。
   BeanUtils类用于设置获取属性的值,get属性时返回的结果为字符串,set属性时可以接受任意类型的对象,通常使用字符串。
   PropertyUtils类也用于设置获取属性的值,get属性时返回的是该属性本来的类型,set属性时也只接受该属性本来的类型。当设置属性值参数类型不对时,将抛出参数类型不匹配异常。
   综上,当不知道参数类型时,建议使用BeanUtils设置属性值。
7、类加载器 
  java虚拟机中可以安装多个类加载器,系统默认三个主要的类加载器,每个类负责加载特定位置的类:
  BootStrap,ExtClassLoader,AppClassLoader
  类加载器本身也是java类,因此java类加载器本身也需要被类加载器加载,BootStrap根加载器是C++编写。
  java虚拟机中的所有类装载器采用父子关系的属性结果进行组织,在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载。
  类加载器之间的父子关系和管辖范围:
  BootStrap---JRE/lib/rt.jar
   |
   |
  ExtClassLoader---JRE/lib/ext/*.jar
   |
   |
  AppClassLoader---CLASSPATH指定的所有jar或目录
   |
   |
  MyClassLoader---用户指定的目录
  类加载器的委托机制:
  首先当前线程的类加载器去加载线程中的第一个类;
  如果类A引用了类B,java虚拟机使用加载类A的加载器加载类B;
  还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器进行加载。
  每个类加载器加载类时,先委托给其上级类加载器;
  当所有父加载器没有加载到类,回到发起者类加载器,如果还加载不了,则抛出ClassNotFoundException异常,而不会交给子级类加载器进行加载。
  注意:
  如果某个类被打包到JRE/lib/ext/*.jar目录下,但其父类并没有放到此目录,则抛出类找不到异常。
  ClassLoader loader = ClassLoaderTest.class.getClassLoader();
  while(null != loader)
  {
   System.out.println(loader.getClass().getName());
   loader = loader.getParent();
  }
  System.out.println(loader);
  输出:
  sun.misc.Launcher$AppClassLoader
  sun.misc.Launcher$ExtClassLoader
  null //BootStrap类加载器不是java类,而是C++二进制码,因此输出null;

                              ----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

0 0
原创粉丝点击