通过对象或类名直接调用方法的方式的区别

在项目中,有的方法是直接 类名.方法名这种调用方式,调用静态方法;
有的是 new 一个对象 对象.方法名;
还有,用Class.forName("")也可以加载一个类,获得相应的实例也可以调用方法,对象.方法名;
不知道这三种方式有什么区别?请教
为什么不所有的DAO,BO的方法 都写成static 类型的或者 new对象或者 class.forname(),调用??

[quote]在项目中,有的方法是直接 类名.方法名这种调用方式,调用静态方法;
有的是 new 一个对象 对象.方法名;
还有,用Class.forName("")也可以加载一个类,获得相应的实例也可以调用方法,对象.方法名;
不知道这三种方式有什么区别?请教
为什么不所有的DAO,BO的方法 都写成static 类型的或者 new对象或者 class.forname(),调用?? [/quote]
1.静态方法,比较适合工具类、静态工厂等,必须考虑多线程问题。静态方法属于类本身,而非类的实例,所以可以用“类名.方法名”调用。
2.new就不用说了吧。
3.Class.forName("")也存在线程安全问题,所以建议和Thread.getCurrentThread().getClassLoader结合使用。Class.forName("")返回Object需要类型转换,newInstance方法无法执行有参数的构造函数。用反射包的Constructor也非常不方便。反射类库,包括Class.forName().newInstance适合用在框架设计领域,一般编程不建议使用,性能也比普通调用低很多。
4.DAO如果没有属性,理论上说是可以用静态方法的,但一定要保证方法的原子性,否则线程安全是一个大问题。而且,这样做失去了OO的所有特征。

通过类名+点的方式调用静态方法是JAVA语言的规定,静态方法其实就相当于其它语言中的全局方法,[color=red]因为JAVA里面所有的东东都是类,所以必须要放到一个类中[/color],但是静态方法跟这个类基本上没有任何逻辑上的关系。
通过Class.forName和通过对象调用都是一回事儿,都说明这个方法是这个对象的一部分,是这个对象拥有的行为

[quote]为什么不所有的DAO,BO的方法 都写成static 类型的或者 new对象或者 class.forname(),调用?? [/quote]
你可以把所有的DAO都搞成静态方法,但这[color=red]严重违背了面向对象程序设计的基本原理[/color]所以一般人不会那么去使用的

首相介绍的是Java中的静态方法,他是一个公用的方法,里面用到的类变量也必须是static的,所以在类的个性化操作时候就只能使用每个类自己的方法处理,此时不能使用静态的。
另外new一个类和Class.forName加载一个类本质上没什么区别,都是实例化了一个对象
Spring的加载就是这个过程
因此如果你用spring的DI方法进行注入操作时候,可能会看不到new这样的方法来实例化类了

静态方法会在类加载前加栽,也就是你不用实例化一个对象就可以使用里面的方法.

当然如果你把所有方法改为静态的,把变量传进去,运行起来应该没什么大问题.

使用实例话对象是为了让开发更加模式化、面向对象化.

例如一个人
年龄,性别都是非静态的,每个人的属性都不一样,但人在生物学上属于哪个门哪个纲哪个目等,这个属性是属于整个人类,所以就应该是静态的——它不依赖与某个特定的人.

class.forName和直接实例话对象没什么区别