黑马程序员十一、Java基础加强

来源:互联网 发布:人工智能开发入门 编辑:程序博客网 时间:2024/04/27 13:43

----------- android培训java培训、期待与您交流! ------------

一、基本数据类型的自动装箱和拆箱

     Interger i = 1;   //自动装箱,Integer i = new Integer(1);

      System.out.println(i+2);   //自动拆箱,i为Integer类型自动拆箱成int。

    例:

       Integer i1 = 13;    //Integer i1 = 138;

       Integer i2 = 13;    //Integer i2 = 138

       System.out.println(i1 == i2);  //true  false

       装箱成Integer对象时,如数值是在1个字节(-128~127)之间的数,会将数值缓存池,以便以后会使用这些整数,节省内存空间。

二、享元模式(flyweight):

             有很多个小的对象,他们有很多属性相同,把他们变成一个对象。不同的属性变成方法的参数,称之为外  部状态。相同的属性          称之为内部状态。

三、枚举

      类模拟枚举:私有的构造方法;每个元素分别用一个公有的静态成员变量表示;可以有若干个方法或抽象方法。

      枚举是一个类,元素就是类的对象。

      带有构造方法的枚举:构造方法应为私有。

publicclassEnumTest {

   publicstaticvoid main(String[] args) {

      WeekDay1weekDay = WeekDay1.MON;

      System.out.println(weekDay.nextDay());

      WeekDayweekday2 = WeekDay.FRI;

      System.out.println(weekday2);

      System.out.println(weekday2.ordinal());

      System.out.println(weekday2.name());

      System.out.println(WeekDay.valueOf("SUN"));

   }

   //带有构造方法的枚举

   publicenum WeekDay{

      SUN(1),MON,TUE,WED,THI,FRI,SAT;

      private WeekDay(){System.out.println("first");}

      private WeekDay(int day){System.out.println("second");}

   }

   //带有抽象方法的枚举

   publicenum TrafficLamp{

      RED(30){

         public TrafficLamp nextLamp(){

            returnGREEN;

         }

      },GREEN(45){

         public TrafficLamp nextLamp(){

            returnYELLOW;

         }

      },YELLOW(5){

         public TrafficLamp nextLamp(){

            returnRED;

         }

      };

      publicabstract TrafficLampnextLamp();

      privateinttime;

      private TrafficLamp(int time){this.time=time;}

   }

}

四、JavaBean

JavaBean是一种特殊的Java类,主要用于传递数据信息,这种Java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。

JavaBean的内省就是对JavaBean中的属性和事件的一些处理方法,通过setXxx和getXxx 去访问和设置xxx的值。

public class Person {

private int x;

private int y;

public Person(int x, int y) {

super();

this.x = x;

this.y = y;

}

public int getX() {

return x;

}

public void setX(int x) {

this.x = x;

}

public int getY() {

return y;

}

public void setY(int y) {

this.y = y;

}

}

public class IntroSpectorTest {

public static void main(String[] args) throws Exception{

 Person p1 = new Person(3,5);

 String propertyName = "x";

PropertyDescriptor pd = new PropertyDescriptor(propertyName,p1.getClass());

 Method methodGetX = pd.getReadMethod();

 Object retVal = methodGetX.invoke(p1);  System.out.println(retVal);

 

 Method methodSetX = pd.getWriteMethod();

 methodSetX.invoke(p1,7);  System.out.println(p1.getX());

}

}

五、类加载器

1.Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:

                 BootStrapExtClassLoaderAppClassLoader

2.类加载器也是Java类,因为其他是Java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是Java类,这正是BootStrap。 

3.Java虚拟机中的所以类加载器采用具有父子关系的树形结果进行组织,在实例化每个类加载器对象时,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载。

    类加载器的委托机制

1.当Java虚拟机要加载一个类时,

  1)首先当前线程的类加载器去加载线程中的第一个类。

  2)如果类A中引用了类B;Java虚拟机将使用加载器类A的类加载器去加载类B。

  3)还可以直接调用ClassLoader loadClass()方法来指定某个类加载器去加载某个类。

2.每个类加载器加载类时,又先委托给其上级类加载。

  当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛出ClassNotFoundException,不是再去找发起者类加载器

 的儿子,因为没有getChild方法,即使有,那有多个儿子。

六、代理

1、程序中的代理

  1)要为已存在的uoge具有相同借口的目标类的各个方法增加一些系统功能,如,异常处理,日志,事务管理等。

  2)编写一个与目标类具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码。

  3)如果采用工厂模式的配置文件的方式进行管理,则不需要修改客户端程序。在配置文件中配置是使用目标类,

还是代理类,这样以后很容易切换。

2.动态代理技术

  1)要为系统中的各种接口的类加载代理功能,那将需要太多的代理类,全部采用静态代理方式,将是一件非常麻烦的事情。

  2)JVM可以在运行期动态生成出类的字节码,这种动态生成的类往往被用作代理类,即动态代理类。

  3)JVM生成的动态类必须实现一个或多个接口,所以,JVM生成的动态类只能用作具有相同接口的目标类的代理。

  4)CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,所以,如果为一个没有实现接口的类生成动态代理类那么可以使用CGLIB库.

  5)代理类的各个方法中通常除了要调用目标的相应方法和对外返回的结果外,还可以在代理方法中的如下四个位置上加上系统功能的代码:

     在调用目标方法之前、之后、前后;在处理目标方法异常的catch块中。

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

详情请查看:http://edu.csdn.net/heima