首页 > 代码库 > 黑马程序员_Java基础加强(上)
黑马程序员_Java基础加强(上)
1.静态导入
静态导入是jdk1.5版本以后出现的新特性,一般是指导入静态方法,如:import static java.lang.System.out 是指导入系统输出的静态方法。
例:
import static java.lang.System.out //导入java.lang包下的System类的静态方法out
public class StaticImport {
public static void main(String[] args) {
int x=1;
x++;
out.println(x); //导入java.lang包下的System类的静态方法out后,可以写成out.println(x);来打印数据x,不必写全System.out.println(x);
}
}
2.可变参数
一个方法接受的参数个数不固定如:
System.out.println(add(3,4,5)),
System.out.println(add(1,2,3,4,5)),
可变参数的特点:
只能出现在参数列表最后;
... 位于参数类型和参数名之间前后有无空格都可以
调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法中以数组形式访问参数。
例:
public class VarableParameter {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(add(2,3));
System.out.println(add(2,3,5));
}
public static int add(int x,int ... args){ //可变参数创建格式
int sum=x;
for (int i=0;i<args.length;i++){
sum+=args[i];
}
return sum;
}
}
3.增强for循环
语法:for(type 变量名 :集合变量名)
注意事项:
迭代变量必须在()中定义
集合变量可以是数组或实现了iterable接口的集合类
例:
public class VarableParameter {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(add(2,3));
System.out.println(add(2,3,5));
}
public static int add(int x,int ... args){ //可变参数创建格式
int sum=x;
for (int arg :args){
sum+=arg;
}
return sum;
}
}
4.基本数据类型的拆箱与装箱
自动装箱:
Integer num1 = 12;
自动拆箱:
System.out.println(num1 + 2);
例:
public class AutoBox {
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer iObj = 3;
System.out.println(iObj + 12);
}
}
5.枚举
枚举是要让某个类型的变量的取之只能为若干个固定的值中的一个,否则编译器就会报错,枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一功能。
用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能
私有构造方法;每个元素分别用一个共有的静态成员变量表示;可以有若干构造方法或抽象方法,要提供NextDay()是抽象的。
例:
package cn.itcast.day1;
public abstract class WeekDay1 {
private WeekDay1(){}
public final static WeekDay1 SUN= new WeekDay1(){
@Override
public WeekDay1 nextDay() {
// TODO Auto-generated method stub
return MON;
}
};
public final static WeekDay1 MON= new WeekDay1(){
@Override
public WeekDay1 nextDay() {
// TODO Auto-generated method stub
return SUN;
}
};
public abstract WeekDay1 nextDay();
/* public WeekDay nextDay(){
if(this == SUN){
return MON;
}else{
return SUN;
}
}*/
public String toString(){
return this == SUN?"SUN":"MON";
}
}
package cn.itcast.day1;
public class EnumTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
WeekDay1 weekDay = WeekDay1.MON;
System.out.println(weekDay.nextDay());
WeekDay weekDay2 = WeekDay.FRI;
System.out.println(weekDay2);
}
public enum WeekDay{
SUN,MON,TUE,WED,THI,FRI,SAT
}
//交通灯枚举类
public enum TrafficLamp{
RED(30){
public TrafficLamp nextLamp(){
return GREEN;
}
},
GREEN(45){
public TrafficLamp nextLamp(){
return YELLOW;
}
},
YELLOW(5){
public TrafficLamp nextLamp(){
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time){
this.time=time;
}
}
}
6.反射
Class 反射的基石
如何得到各个字节码对应的实例对象?
类名.class,例如:System.class ;对象.getClass() 例如:new Date().getClass ; Class.forName("类名") 例如:Class.forName("java.util.Date");
反射就是把Java类中的各种成分映射成相应的Java类。例如一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等信息也用一个个Java类来表示就像汽车是一个类,汽车的发动机,变速箱也是一个个的类。表示Java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,他们是Field、Method、Contructor、Package等等。
例:
package cn.itcast.day1; import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays; public final class ReflectTest { public static void main(String[] args) throws Exception{ String str1 = "abc"; Class cls1 = str1.getClass(); Class cls2 = String.class ; Class cls3 = Class.forName("java.lang.String"); System.out.println(cls1 == cls2); System.out.println(cls1 == cls3); System.out.println(cls1.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()); System.out.println(int[].class.isArray()); //new String(new StringBuffer ("abc")); Constructor constructor1 = String.class.getConstructor(StringBuffer.class); String str2 = (String)constructor1.newInstance(new StringBuffer("abc")); System.out.println(str2.charAt(2)); ReflectPoint pt1 = new ReflectPoint(3,5); Field fieldY = pt1.getClass().getField("y"); System.out.println(fieldY.get(pt1)); Field fieldX = pt1.getClass().getDeclaredField("x"); fieldX.setAccessible(true); System.out.println(fieldX.get(pt1)); changeStringValue(pt1); System.out.println(pt1); Method methodCharAt = String.class.getMethod("charAt", int.class); System.out.println(methodCharAt.invoke(str1, 1)); //TestArguments.main(new String[]{"111","222","333"}); String startingClassName = args[0]; Method mainMethod = Class.forName(startingClassName).getMethod("main", String[].class); //mainMethod.invoke(null,new Object[]{new String[]{"111","222","333"}}); mainMethod.invoke(null,(Object)new String[]{"111","222","333"}); int[] a1 = new int[]{1,2,3}; int[] a2 = new int[4]; int[][] a3 = new int[2][3]; String[] a4 = new String[]{"a","b","c"}; System.out.println(a1.getClass() == a2.getClass()); System.out.println(a1.getClass().getName()); System.out.println(a1.getClass().getSuperclass().getName()); System.out.println(a4.getClass().getSuperclass().getName()); System.out.println(a3.getClass().getSuperclass().getName()); Object aobj1 = a1; Object aobj2 = a2; //Object[] aobj3 = a1; Object[] aobj4 = a3; Object[] aobj5 = a4; System.out.println(a1); System.out.println(a4); System.out.println(Arrays.asList(a1)); System.out.println(Arrays.asList(a4)); //Object obj = null; printObject(a1); printObject("abc"); } private static void printObject(Object obj) { Class clazz = obj.getClass(); if(clazz.isArray()){ int len = Array.getLength(obj); for(int i=0;i<len;i++){ System.out.println(Array.get(obj, i)); } }else{ System.out.println(obj); } } private static void changeStringValue(Object obj) throws Exception { Field[] fields = obj.getClass().getFields(); for(Field field : fields){ //if(field.getType().equals(String.class)) if(field.getType() == String.class){ String oldValue = (String)field.get(obj); String newValue = oldValue.replace("b", "a"); field.set(obj,newValue); } } } } class TestArguments{ public static void main(String[] args){ for(String arg : args){ System.out.println(arg); } } }
package cn.itcast.day1; import java.util.Date; public class ReflectPoint { private Date birthDay = new Date(); public Date getBirthDay() { return birthDay; } public void setBirthDay(Date birthDay) { this.birthDay = birthDay; } private int x; public int y; public String str1 = "ball"; public String str2 = "basketball"; public String str3 = "itcast"; 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 ReflectPoint(int x, int y) { super(); this.x = x; this.y = y; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + x; result = prime * result + y; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; ReflectPoint other = (ReflectPoint) obj; if (x != other.x) return false; if (y != other.y) return false; return true; } @Override public String toString() { return str1+":"+str2+":"+str3; } }
package cn.itcast.day1; import java.io.FileInputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Properties; public class ReflectTest2 { public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub //InputStream ips = new FileInputStream("config.properties"); //InputStream ips = ReflectTest2.class.getClassLoader().getResourceAsStream("cn/itcast/day1/config.properties"); //InputStream ips = ReflectTest2.class.getResourceAsStream("resource/config.properties"); InputStream ips = ReflectTest2.class.getResourceAsStream("/cn/itcast/day1/resource/config.properties"); Properties props = new Properties(); props.load(ips); ips.close(); String className = props.getProperty("className"); Collection collections = (Collection)Class.forName(className).newInstance(); //Collection collections = new HashSet(); ReflectPoint pt1 = new ReflectPoint(3,3); ReflectPoint pt2 = new ReflectPoint(5,5); ReflectPoint pt3 = new ReflectPoint(3,3); collections.add(pt1); collections.add(pt2); collections.add(pt3); collections.add(pt1); //pt1.y = 7; //collections.remove(pt1); //导致内存泄漏 System.out.println(collections.size()); } }
7.内省——>JavaBean
JavaBean是一种特殊的Java类,主要用于传递数据信息,这种Java类中的方法主要用于访问私有字段,且方法符合某种命名规则。
例:
import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Map; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.PropertyUtils; public class IntroSpectorTest { public static void main(String[] args) throws Exception{ ReflectPoint pt1 = new ReflectPoint(3,5); String propertyName = "x"; Object retVal = getProperty(pt1, propertyName); System.out.println(retVal); Object value = 7; setProperties(pt1, propertyName, value); System.out.println( BeanUtils.getProperty(pt1,"x").getClass().getName()); BeanUtils.setProperty(pt1, "x", "9"); System.out.println(pt1.getX()); //Java7的新特性 /*Map map = {name : "zxx",age : 18}; BeanUtils.setProperty(map, "name", "lhm");*/ BeanUtils.setProperty(pt1, "birthDay.time", "111"); System.out.println(BeanUtils.getProperty(pt1, "birthDay.time")); PropertyUtils.setProperty(pt1, "x", 9); System.out.println( PropertyUtils.getProperty(pt1,"x").getClass().getName()); } private static void setProperties(Object pt1, String propertyName, Object value) throws IntrospectionException, IllegalAccessException, InvocationTargetException { PropertyDescriptor pd2 = new PropertyDescriptor(propertyName,pt1.getClass()); Method methodSetX = pd2.getWriteMethod(); methodSetX.invoke(pt1,value); } private static Object getProperty(Object pt1, String propertyName) throws IntrospectionException, IllegalAccessException, InvocationTargetException { /*PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass()); Method methodGetX = pd.getReadMethod(); Object retVal = methodGetX.invoke(pt1);*/ BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass()); PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors(); Object retVal = null; for(PropertyDescriptor pd : pds){ if(pd.getName().equals(propertyName)){ Method methodGetX = pd.getReadMethod(); retVal = methodGetX.invoke(pt1); break; } } return retVal; } }