枚举,享元模式,反射基础



枚举类:     JDK1.5新特性

       枚举是一个特殊的类,枚举中的元素相当于类的实例对象,其中可以定义构造方法,成员变量,普通方法和抽象方法。定义构造方法时必须是私有的;

       枚举元素必须位于枚举体中的最开始处,枚举元素的后面要有分号与其他成员分隔。

       把枚举中的成员方法或成员变量放在枚举元素的前面时,编译器报错;

带方法的枚举: 1.定义枚举 TrafficLamp

                             2.实现普通的next()方法。

                            3.实现抽象的next()方法:每个元素分别是由枚举的子类来生成实例对象,这些子类采用类似内部类的方式进行定义。

                           4.增加表示时间的构造方法。

枚举只有一个成员时,就可以作为一种单例实现方式。

public enum TrafficLamp
	{
		RED(30)
		{
			public TrafficLamp nextLamp()
			{
				return GREEN;
			}
		},
		GREEN(45)
		{
			public TrafficLamp nextLamp() {
				// TODO Auto-generated method stub
				return YELLOW;
			}
		},
		YELLOW(5)
		{
			public TrafficLamp nextLamp() {
				// TODO Auto-generated method stub
				return RED;
			}
		};
		private int time;
		private TrafficLan(int time)
		{
			this.time = time;
		}
		public abstract TrafficLamp nextLamp();
	}

自动装箱与拆箱
       Integeri1 = 13;    // -128 --127

       Integer i2 = 13;

       System.out.println(i1 + 12);

享元设计模式 flyweight

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

可变参数:一个方法接受的参数不固定

       1.    只能出现在参数列表的最后。

       2.    调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。

反射机制:Class 反射会使程序性能下降

       java类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性的值是什么,则是由这个类的实例对象来确定,不同的实例对象有着不同的属性值。

       java程序中的各个java类,也属于同一类事物,描述这一同类事物的类的名字就是Class.

要注意与小写class关键字的区别。Claa类描述了类的名字,类的访问属性,类说属于的包名,字段名称的列表,方法名称的列表的那个。

Class的实例对象代表内存里面的一段字节码。调用源程序中的类时,首先在硬盘中把类的二进制代码编译成 .class,然后把 .class中的二进制代码加载到内存中,再用这些字节码去创建对象。也可以说字节码就是一个对象。

       Class  cls = Date.class; //Date类所代表的字节码

       Class cls2 = Math.class; //Math类的字节码

       p1.getClass(); //p1表示字节码所创建的对象,得到这个对象的类名;

       Class.forName(“java.lang.String”);  //forName()的作用 :返回到这个类的字节码,

返回字节码方式有两种:

      1、这个类已经加载到内存中,可以直接返回这个类的字节码;

      2、java虚拟机还没有这个类的字节码,先把这个类加载到内存中,再返回这个类的字节码;

如何获得类的字节码?有3中方法。

      1、类名.class

      2、对象.getClass(); 例如:new Date().getClass();

      3、Class.forName(“类名”); 例如:Class.forName(“java.util.Date”);

  9个预定义的Class实例对象:8个基本数据类型和1个void

        class cls1 = int.class          Class cls2 = void.class;       int.class == Integer.TYPE;

         数组类型的实例对象:Class.isArray();

 总之,只要在源程序中出现的类型,都有各自的Class实例对象,例如:int[],void;

   反射就是把java类中的各种成分映射成相应的java类。java类中的各种成分所对应的类Field,Method,Contructor,Package

构造方法的反射:Constructor

//new String(new StringBuffer("abc"));

Constructorconstructor = String.class.getConstructor(StringBuffer.class);

String str2 =(String)constructor.newInstance(newStringBuffer("abc"));

System.out.println(str2.charAt(2));

     1、  得到某个类的构造方法:获得构造方法时要用到类型;

     2、  创建实例对象:调用获得的方法时要用到与获得方法相同类型的实例对象。

     3、  Class.newInstance():不带参数的构造方法;





你可能感兴趣的