黑马程序员 17 Java基础加强 一
纪念张孝祥老师
终于到了张老师的课,在我知道他的时候他早已离开很久了。看着他的视频,心中是一种崇敬。
#Eclipse使用技巧
*面试时注意JDK新特新,一些缩写的全拼。
*IDE工程化的方式管理项目进程。
*Debug:
双击断点
右键watch
Java——>编译器,选择编译器
*
高版本的java能运行低版本javac编译器;
低版本的java不能运行高版本javac编译器。
#
JDK1.5特性
$
静态导入:import static
$
以数组为参数,只能是最后一个参数。
for:遍历集合和数组.
可变参数方法:
1 public class VarablePara { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 System.out.println(add(23,54,54,23,66,34,35,6)); 8 } 9 10 public static int add(int a,int b, int... c) { 11 int sum=a+b; 12 for(int i : c) 13 sum+=i; 14 return sum; 15 } 16 17 }
$
自动装箱:int赋给Integer
自动拆箱:int和Integer计算
*装箱时,-128~127以内的相等值都是相等地址。
享元模式flyweight
$
枚举:
模拟枚举类每个枚举都是对象类型,public static final的。
enum:
列表必须在所有方法前;
方法必须是私有的;
构造方法:
一旦用到,调用空参构造。
可以用抽象方法重写方法;
*如果枚举只有一个成员,可以作为一个单例模式的实现。
$
反射:反射把java类中的成分映射成相应的类。
Class类:
构造函数私有,不可创建;
Class c = 字节码;
$获得字节码三种方式:
类名.class;
对象.getClass();
Class.forName("类名");//返回字节码
*九个预定义对象:八个基本类型+void;
int.class!=Integer.class;
int.class==Integer.TYPE;
数组类型的Class实例对象
Class.isArray();
*
Constructor类:
Constructor[] c = 类.class.getConstrector(类型.字节码);//参数是该构造函数参数的字节码
newInstance();//用该构造方法创造新实例,括号中传初始化参数;
class——>constructor——>new object;
反射实例:
1 public class ReflectTest { 2 public static void main(String[] args) throws Exception{ 3 System.out.println(int.class == Integer.TYPE); 4 //构造函数 5 Constructor con = Class.forName("java.lang.String").getConstructor(StringBuffer.class); 6 String str = (String)con.newInstance(new StringBuffer("QWERTYUIOPAS")); 7 System.out.println(str); 8 //Field 9 Point3D p = new Point3D(3,4,5); 10 Field fx = Point3D.class.getDeclaredField("x"); 11 fx.setAccessible(true); 12 System.out.println(fx.get(p)); 13 14 //转换一对象中的String成员的a——>b 15 p.setName("Point_a"); 16 changeStingValue(p); 17 System.out.println(p); 18 } 19 20 public static void changeStingValue(Object obj) throws Exception { 21 Field[] f = obj.getClass().getFields(); 22 for(Field fi : f){ 23 if(fi.getType() == String.class){ 24 String oldv = (String)fi.get(obj); 25 String newv = oldv.replace(‘a‘, ‘b‘); 26 fi.set(obj, newv); 27 } 28 } 29 } 30 }
*
Field类:
代表成员变量;
Field f = 字节码.getField("成员名");
f.get(对象);//如果是私有的,要用getDeclaredField
此时还是不能获取,用暴力获取
f.setAccessible(true);
转换一对象中的String成员的a——>b
*字节码作比较用 ==
*
Method成员方法类:
例:Method m = 类名.class.getMethod("方法名",para.class);
invoke(obj, param);//obj为null时,为静态方法
Method应用:
1 String s = "ZXCVBNM"; 2 Method mCharAt = String.class.getMethod("charAt", int.class); 3 System.out.println(mCharAt.invoke(s, 3));
*
Main方法:
也是用method,用字符串获取目的类名传入getMethod,张老师定义字符串数组的方式比较有特点:
maintest.invoke(null, new Object[]{new String[]{"礼","义","廉","耻"}});//JDK1.5会开包,所有知识new String[]不能匹配参数。
也是用method,用字符串获取目的类名传入getMethod,张老师定义字符串数组的方式比较有特点:
maintest.invoke(null, new Object[]{new String[]{"礼","义","廉","耻"}});//JDK1.5会开包,所有知识new String[]不能匹配参数。
用反射调用main方法:
1 //用反射调用main 2 String className = args[0]; 3 Method maintest = Class.forName(className).getMethod("main", String[].class); 4 maintest.invoke(null, new Object[]{new String[]{"礼","义","廉","耻"}}); 5
*
数组反射:
*asList把数组转换List,转基本类型数组会出错,会把整个当成一个引用存储;
*Array.getLength(obj);获得数组长度
数组反射实例:
1 // int[][] a = new int[][] { 2 // { 3, 2, 7 }, 3 // { 6, 4, 9 }, 4 // { 5, 1, 8 } 5 // }; 6 7 public static void printArray(Object obj) { 8 if (obj.getClass().isArray()) { 9 for (int i = 0; i < Array.getLength(obj); i++) { 10 Object o = Array.get(obj, i); 11 printArray(o); 12 } 13 System.out.println(); 14 } else 15 System.out.print(obj); 16 }
综合案例,配置文件:
*类加载器加载配置文件:
InputStream is = Test.class.getClassLoader().getResourceAsStream("com/hyace/day1/config.properties");//只能读
当修改config.properties中的信息时,能更改Collection的种类。
public class Test { public static void main(String[] args) throws Exception { //面向接口 File file = new File("config.properties"); InputStream is = new FileInputStream(file); Properties pro = new Properties(); pro.load(is); is.close(); String className = pro.getProperty("className"); Collection<Point3D> col = (Collection<Point3D>)Class.forName(className).newInstance(); //Collection col = new ArrayList(); // Collection<Point3D> col = new HashSet<Point3D>(); col.add(new Point3D(3, 4, 5)); col.add(new Point3D(3, 5, 4)); col.add(new Point3D(4, 5, 3)); col.add(new Point3D(4, 5, 3)); System.out.println(col.size()); } }
$
内省:
IntroSpector——>JavaBean——>特殊的java类
*
JavaBean
int getAge();
void setAge(int age);
除去get,set就是属性名
JavaBean的实例对象称为Value Object;
*
PropertyDescriptor类:
PropertyDescriptor pd = new PropertyDescriptor(propertyName, p.getClass());//p为目标对象,propertyName为目标参数
Method get = pd.getReadMethod();
*
复杂内省操作:
BeanInfo对象,描述javabean类的所有属性;
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。