⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 java8.txt

📁 达内IT培训Core Java全部笔记 是学习Java编程的好东西
💻 TXT
📖 第 1 页 / 共 2 页
字号:
sd 0804 Javaday08   2008年6月19日比较器接口(java.util.comparatpr):	可以比较任何对象按照任何方式(不一定是comparable对象)比较:	1.Comparable(自然排序)	2.comparator(比较器)TreeSet按构造选择其中一种比较(有Comparator)作参数是比较器,否则是自然排序-------------------------------------------------------------------------------------package com.tarena.day08;public class Person {		//本类自身不可比较	private int id;	public int getId() {		 return id;	}	public void setId(int id) {		 this.id = id;	}}-------------------------------------------------------------------------------------package com.tarena.day08;import java.util.Comparator;import java.util.Set;import java.util.TreeSet;public class PersonCmparator implements Comparator{	public int compare(Object o1,Object o2){//比较器的比较逻辑和类是分离的,比较灵活		if(o1!=null&&o2!=null&&o1 instanceof Person&&o2 instanceof Person){			Person p1=(Person)o1;			Person p2=(Person)o2;			return p1.getId()-p2.getId();		}		return 0;	}	public static void main(String[] args) {		TreeSet<Person> ts=new TreeSet<Person>(new PersonCmparator());//参数多态			ts.add(new Person(1));			ts.add(new Person(2));			ts.add(new Person(3));		for(Person p:ts){			System.out.println(p.getId());		}	}}-------------------------------------------------------------------------------------TreeSet在add元素的时候会自动调用对应的比较方法(如果是Comparable就是找compareTo()方法,如果是Comarator就是找compare()方法)Map:	增加:put(key,value)	删除:clear()全部		  remove(key)	取得:keyset -> set() -> foreach -> get(key) -> value-------------------------------------------------------------------------------------package com.tarena.day08;import java.util.Collection;import java.util.Iterator;import java.util.Map;import java.util.HashMap;import java.util.Set;public class TestMap {	public static void print(Collection<? extends Object>(){//key被限定为String,value没有限定		Iterator<? extends Object> it=c.iterator();		while(it.hasNext()){//遍历所有元素			Object element=it.next();			System.out.println(element);		}	}	public static void main(String[] args){		Map<String,Object> m=new HashMap<String,Object>();		m.put("1", 1);		m.put("2", "two");		m.put("3","three");		m.put("3", 3);//后输入的会替代掉之前的value//key如果重复会替换调相同的key还有对应的value,所以这里替换上面的		//m.put(3, "");	//key已经被限定为String		print(m.entrySet());		/*System.out.println(m.entrySet());		Set<String> set=m.keySet();		for(String s:set){		Object obj=m.get(s);		System.out.println(s+":"+obj);*/	}}输出结果:3:32:two1:1-------------------------------------------------------------------------------------	反射(Reflection):	动态调用代码,在运行的时候找要用的类中的属性或方法是否存在类对象(java.lang.class):	JVM可以通过类对象获得一个类的所有属性,方法,构造,类似于API,只是给虚拟机(JVM)看的API-------------------------------------------------------------------------------------package com.tarena.day08.reflect;public class TestClass {	public static void main(String[] args) throws Exception{		String temp = "abc";		Class c1 = temp.getClass();			Class c2 = String.class;	//得到类对象(隐藏属性,在原码中找不到)		Class c3 = Class.forName("java.lang.String");//返回与带有给定字符串名的类或接口相关联的 Class 对象		Class c4 = int.class;		Class c5 = Integer.TYPE;		//是int的类对象			}}-------------------------------------------------------------------------------------1.得到class中所有属性/方法/构造2.newInstance()得到一个普通对象,底层等同于new+无参构造,所以需要该对象的class有无参构造跟类对象(class)相关的就是放射,用的不多,但是功能很强大,用起来很方便有declared的支持私有但不支持继承,没有declared的支持继承,但不支持私有:一般情况下,取属性是加declared,属性一般都是私有取方法和构造都不加declared,因为方法有可能是继承-------------------------------------------------------------------------------------package com.tarena.day08.reflect;public class Person {	private int id;	public String name;	public Person(){}	private Person(int i){}	private int getId() {		return id;	}	public void setId(int id) {		this.id = id;	}	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}}-------------------------------------------------------------------------------------package com.tarena.day08.reflect;import java.lang.reflect.*;public class TestPerson {	public static void main(String[] args) {		Class c1 = Person.class;//最灵活的写法应该用Class.forName()		Field[] f1 = c1.getFields();		Field[] f2 = c1.getDeclaredFields();		for (Field f : f1) {			System.out.println(f);		}		System.out.println("***************");		for (Field f : f2) {			System.out.println(f);		}		System.out.println("***************");		Method[] m1 = c1.getMethods();		Method[] m2 = c1.getDeclaredMethods();		for (Method f : m1) {			System.out.println(f);		}		System.out.println("***************");		for (Method f : m2) {			System.out.println(f);		}		System.out.println("***************");		Constructor[] n1 = c1.getConstructors();		Constructor[] n2 = c1.getDeclaredConstructors();		for (Constructor c : n1) {			System.out.println(c);		}		System.out.println("***************");		for (Constructor c : n2) {			System.out.println(c);		}		System.out.println("***************");	}}输出结果:public java.lang.String com.tarena.day08.reflect.Person.name***************private int com.tarena.day08.reflect.Person.idpublic java.lang.String com.tarena.day08.reflect.Person.name***************public void com.tarena.day08.reflect.Person.setId(int)public java.lang.String com.tarena.day08.reflect.Person.getName()public void com.tarena.day08.reflect.Person.setName(java.lang.String)public native int java.lang.Object.hashCode()public final native java.lang.Class java.lang.Object.getClass()public final native void java.lang.Object.wait(long) throws java.lang.InterruptedExceptionpublic final void java.lang.Object.wait(long,int) throws java.lang.InterruptedExceptionpublic final void java.lang.Object.wait() throws java.lang.InterruptedExceptionpublic boolean java.lang.Object.equals(java.lang.Object)public java.lang.String java.lang.Object.toString()public final native void java.lang.Object.notify()public final native void java.lang.Object.notifyAll()***************public void com.tarena.day08.reflect.Person.setId(int)public java.lang.String com.tarena.day08.reflect.Person.getName()private int com.tarena.day08.reflect.Person.getId()public void com.tarena.day08.reflect.Person.setName(java.lang.String)***************public com.tarena.day08.reflect.Person()***************public com.tarena.day08.reflect.Person()private com.tarena.day08.reflect.Person(int)***************-------------------------------------------------------------------------------------重复上面的代码,用getInstance创建新的Class:-------------------------------------------------------------------------------------package com.tarena.day08.reflect;public class TestClass {	public static Object getInstance(String name) throws Exception{//动态		Class c = Class.forName(name);		return c.newInstance();	}	public static void main(String[] args) throws Exception{		String temp = "abc";		Class c1 = temp.getClass();			Class c2 = String.class;	//得到类对象(隐藏属性,在原码中找不到)		Class c3 = Class.forName("java.lang.String");//返回与带有给定字符串名的类或接口相关联的 Class 对象		Class c4 = int.class;		Class c5 = Integer.TYPE;		//是int的类对象			Object obj = TestClass.getInstance("java.lang.String");		Object obj1 = TestClass.getInstance("java.lang.Integer");	//Integer没有无参构造,所以不会创建		}}-------------------------------------------------------------------------------------field:	取属性值:get()	属性赋值:set()	属性类型:getType()	取属性名:getName()一个类的类对象只有一个得到类的参数:-------------------------------------------------------------------------------------package com.tarena.day08.reflect;public class Person {	private int id;	private String name;	//这里如果是private,那下面的代码无法将"zhang"赋进来	public Person(){}	private Person(int i){}	private int getId() {		return id;	}	public void setId(int id) {		this.id = id;	}	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}}-------------------------------------------------------------------------------------package com.tarena.day08.reflect;import java.lang.reflect.Field;;public class UserField {	public static void main(String[] args) throws Exception{		Class c1 = Person.class;		Field f1 = c1.getDeclaredField("id");		Field f2 = c1.getDeclaredField("name");		System.out.println(f2.getType());	//得到name的类型		Object obj = c1.newInstance();	//创建新对象//		f2.setAccessible(true);	//打破封装,可以直接访问私有,把private当public		f2.set(obj, "zhang");//等同于obj.name = "zhang", 这句受访问权限限制,如果是private就不能更改为"zhang"		if(obj instanceof Person){			Person p = (Person)obj;			System.out.println(p.getName());		}	}}输出结果:class java.lang.StringException in thread "main" java.lang.IllegalAccessException: Class com.tarena.day08.reflect.UserField can not access a member of class com.tarena.day08.reflect.Person with modifiers "private"	at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)	at java.lang.reflect.Field.doSecurityCheck(Field.java:960)	at java.lang.reflect.Field.getFieldAccessor(Field.java:896)	at java.lang.reflect.Field.set(Field.java:657)	at com.tarena.day08.reflect.UserField.main(UserField.java:13)如果name更改为public,结果为:class java.lang.Stringzhang-------------------------------------------------------------------------------------调类的有参构造:-------------------------------------------------------------------------------------package com.tarena.day08.reflect;public class Person {	private int id;	private String name;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -