A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 皮卫凯 于 2012-9-21 20:07 编辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package Reflect;
  
interface fruit{                        
    public abstract void eat();
}
  
class Apple implements fruit{
    public void eat(){
        System.out.println("Apple");
    }
}
  
class Orange implements fruit{
    public void eat(){
        System.out.println("Orange");
    }
}
  
class Factory{
    public static fruit getInstance(String ClassName){
        fruit f=null;
        try{
            f=(fruit)Class.forName(ClassName).newInstance();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return f;
    }
}
class hello{
    public static void main(String[] a){
       fruit f=Factory.getInstance("Reflect.Apple");
       if(f!=null){
            f.eat();
        }
    }
}


public static fruit getInstance(String ClassName)
这句话意思是定义一个Factory类,在此类中定义的这个getInstance方法是什么怎么个情况??

fruit  f=(fruit)Class.forName(ClassName).newInstance();
fruit不是个接口,这是定义的一个接口对象么?

fruit f=Factory.getInstance("Reflect.Apple"
);
这句话的意思是建立一个名字为 Reflect.Apple 的对象么?主要是不明白getInstance()括号中为什么写 "Reflect.Apple" ?

if(f!=null){f.eat();}
这里为什么要加上这句,难道f可能为空么,上面不是已经建立了对象f,怎么还可能为空,这个if判断不是多余的么?

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
本帖最后由 宁振庄 于 2012-9-21 20:28 编辑

public static fruit getInstance(String ClassName)
这句话意思是定义一个Factory类,在此类中定义的这个getInstance方法是什么怎么个情况??
创建一个实例

fruit  f=(fruit)Class.forName(ClassName).newInstance();
fruit不是个接口,这是定义的一个接口对象么?
这个其实是面向对象中的多态的体现。
而且也不要说接口可以定义对象,应该这么说会好点,叫做接口的引用指向它的实现类的对象


fruit f=Factory.getInstance("Reflect.Apple");
这句话的意思是建立一个名字为 Reflect.Apple 的对象么?主要是不明白getInstance()括号中为什么写 "Reflect.Apple" ?
不是,这句话创建的是一个父类引用f指向子类Apple。为什么写Reflect.Apple,你看它这个方法定义的时候括号里面的参数是(String ClassName),意思就是一个类的名字,为什么不只写"Apple"呢?这个文件的头顶有一句package Reflect;就是把这个类(你这个类文件包括了Apple类)装到一个包Reflect里面,你要找Apple类就要Reflect.Apple。其实这是命名规范的问题,可能你的Apple类是放在其他类文件或者其他包里面的。

if(f!=null){f.eat();}
这里为什么要加上这句,难道f可能为空么,上面不是已经建立了对象f,怎么还可能为空,这个if判断不是多余的么?
可能为空的,你在上面的创建的时候可能由于Apple这个类不存在呀或者其他原因导致f可能只是个空引用
回复 使用道具 举报
我发现以前回答我提问的那群哥们,从他们那学习到好多,但是现在好像不怎么上论坛了,是不是他们的技术分都达到了。现在没他们解答,我都感觉有点点低落啊。
回复 使用道具 举报
public static fruit getInstance(String ClassName)
这句话意思是定义一个Factory类,在此类中定义的这个getInstance方法是什么怎么个情况??
这个方法就是要返回一个fruit对象呗,工厂中生成水果。
fruit  f=(fruit)Class.forName(ClassName).newInstance();
fruit不是个接口,这是定义的一个接口对象么?
f是一个实现了fruit接口的类对象,如果ClassName为Apple,说明想要生成一个苹果出来
fruit f=Factory.getInstance("Reflect.Apple"
);
这句话的意思是建立一个名字为 Reflect.Apple 的对象么?主要是不明白getInstance()括号中为什么写 "Reflect.Apple" ?
括号中写 Reflect.Apple
是类名,就是工厂想生成一个 apple出来
if(f!=null){f.eat();}
这里为什么要加上这句,难道f可能为空么,上面不是已经建立了对象f,怎么还可能为空,这个if判断不是多余的么?

如果生成过程中发生了异常,f就为null了吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马