黑马程序员 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

自动拆箱:intInteger计算

*装箱时,-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);//objnull时,为静态方法

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类的所有属性;

黑马程序员 17 Java基础加强 一,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。