`
baiqian
  • 浏览: 37760 次
  • 性别: Icon_minigender_2
  • 来自: 河南
社区版块
存档分类
最新评论

黑马程序员—java基础加强—枚举、反射

阅读更多

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

 

枚举:

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

枚举就相当于一个类,其中也可以定义构造方法、成员方法、普通方法、抽象方法。

枚举元素必须位于枚举体中的最开始部分,且列表的后面要有分号与其他杨员分隔,

如果枚举中带有构造方法则这个方法必须定义成private

 

Overload vs Override:

 

Overload :方法重载,是指方法名相同参数个数不同、参数类型不同,如果一个方法的参数个数及参数类型都相同只是返回值不同,它也不是方法重载,因为方法重载与返回值无关。

Override:方法重写,方法重写是发生在子类中。方法的返回值类型、方法名、参数列表和父类中的方法完全一致,并且子类的访问级别不能低于父类的访问级别。但如果子类中的这个方法是private的那它就不是重写父类中的方法了,它完全就是另一个方法。

享元模式(flyweight):如果很多很小的对象它们又有很多相同的属性,就把它们封装成一个对象,而那些不同的属性就封装成外部对象作为方法的参数传入,称为外部状态,方法称为对象的内部状态。

 

 

反射:

Class 这个类代表内存中的一份字节码,

得到类的字节码有三种方式:

如:类名.class——Class c1=Date.class

对象.getClass()——new Date().getClass();

      反射Class.forName("类名")——

Class.forName(java.util.Date);来返回字节码,返回有两种情况:

1、是字节码已经加载到了虚拟机中只要返回就行

2、是虚拟机中还没有字节码,用类加载器去加载,把加载进来的的字节码缓存到虚拟机中返回

     判断是不是原始类型:

 

String s="abc"; 
Class c1=s.getClass(); 
System.out.println(c1.isPrimitive());
System.out.println(int.class.isPrimitive()); 
System.out.println(int.class==Integer.class);
System.out.println(int.class==Integer.TYPE); 
System.out.println(int[].class.isPrimitive()); 
判断是不是数据类型的Class实例对象: 
System.out.println(int[].class.isArray());

 

 

反射就是把java类中的各种成分映射成相应的java类 

得到某个类所有的构造方法:

Constructor[]constructors=

Class.forName("java.lang.String").getConstructors();

得到某类的一个构造方法:

Constructor constructor=

Class.forName("java.lang.String").

getConstructor(StringBuffer.class);//获得方法时要用到类型

创建实例对象:

通常方式:String str=new String(new StringBuffer("abc"));

反射方式:String str=

(String)constructor.newInstance(new StringBuffer("abc"));//调用获得的方法时要用到上面相同类型的实例对象

Field 类:它代表某个类中的一个成员变量

 

public class ReflactPoint {
	public int x;
	private int y;
	public String a="abckedg";
	public String b="basket";
	public String c="telnalPhona";
	public ReflactPoint(){}
	public ReflactPoint(int x, int y) {
		super();
		this.x = x;
		this.y = y;
	}
	@Override
	public String toString(){
		return "a:"+a+"b:"+b+"c:"+c;
	}
}
Public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchFieldException {

		ReflactPoint rp=new ReflactPoint(12,45);
		//访问公共的 x
		//Field不是对象身上的变量而是类身上的,要用它去取对象身上对应的变量
		Field fieldX=rp.getClass().getField("x");
		System.out.println(fieldX.get(rp));
		//访问私有的y
		Field fieldY=rp.getClass().getDeclaredField("y");
		fieldY.setAccessible(true);
		System.out.println(fieldY.get(rp));
比较两个字节码时要用==双等号,不要用.equals
//练习:把一个对象中所有String类型的变量中的b换成a.
public static void main(String[] args) throws...
		ReflactPoint rp=new ReflactPoint();
		changeString(rp);
		System.out.println(rp);

public static void changeString(Object obj) throws IllegalArgumentException, IllegalAccessException{
		Field[] fields=obj.getClass().getFields();
		for (Field field : fields) {
			if(field.getType()==String.class){
				String oldStr=(String) field.get(obj);
				String newStr=oldStr.replace("a", "e");
				field.set(obj, newStr);
			}
		}

 

 

Method:某个类中的一个成员方法。

得到类中的某一个方法:

Method charAt=

Class.forName("java.lang.String").getMethod("name",parameterTypes)

 如:

//得到方法

methodCharAt=String.class.getMethod("charAt",int.class);

methodCharAt.invoke(str,1);//调用方法

调用方法:

通常方式:System.out.println(str.charAt(1));

反射方式:System.out.println(charAt.invoke(str,1));

如果传递给Method对象的invoke()方法的第一个参数为null,说明该Method对象对应的是一个静态方法!

具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象,代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class.

基本数据类型的一维数组可以被 当作Object类型来使用,不能当作Object[]类型来使用,非基础数据类型的一维数组既可以当作Object类型使用又可以当做Object[]类型使用。

Arrays.asList()方法处理int[]String[]时是不一样的。

数组的反射:

Array工具类用于完成对数组的反射操作。

ArrayList_HashSet的比较及Hashcode分析:

ArrayList它的底层实现是数组数据结构,是有顺序的集合它中存储的是对象的引用并且其中的元素可以重复

HashSet是它的底层实现是哈希表,它所存储的元素不允许重复。

Hashcode的作用:

hashcode时容易造成内存泄漏。

加载配置文件的三种方法:

InputStream is=new FileInputStream("文件名");

InputStream is=

Person.class.getClassLoader().getResourceAsStream("路径");

InputStream is=Person.class.getResourceAsStream("文件名");

 

 

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics