Android-问一个android中java基础哈。关于方法加载问题

发布于 2016-10-19 20:15:31 字数 154 浏览 1080 评论 3

最近做项目中要用到很多popupwindwows。所以想建立一个类来管理不同的popupwindwows。而有一点困惑就是,类中的方法该用静态还是非静态。用静态的话效率会高些,但是不知道不调用的时候会不会消耗资源(加载);如果用非静态的话,在新建一个对象的时候,方法是否加载(消耗资源)。求科普

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

归属感 2017-10-12 00:15:03

静态方法是随着类的加载而同时加载的,随意什么时候加载类,什么时候就加载了静态方法。而实例方法则是在创建实例对象的时候才存在的。而且静态方法效率上要比实例方法高一些。但是静态方法无法实现面向对象的一系列特性,比如多态性。实例方法可以做到不同对象不同处理,但是静态方法只能作为所有对象的统一处理。
其实通过上述描述,一般来说,对于一些配置信息和管理工具类使用静态方法和静态变量,其他的一般都会为了保留面向对象的特性而使用实例方法和实例变量。
如果你想建立的类是用来管理不同的popupwindows的,那么可以考虑使用静态方法,方便高效。

灵芸 2017-09-15 01:37:02

同意楼上的观点,对于一些配置信息和管理工具类抑或常量类建议使用静态方法和静态变量,其他的一般都会为了保留面向对象的特性而使用实例方法和实例变量。

清晨说ぺ晚安 2017-03-13 14:59:20

我做了实验,结论是在我的环境里(win7 64,sun jre7),方法用静态还是非静态 无明显区别:

建一个Sample类,里面写一个很大的实例方法,编译后.class文件为43k。用5000个不同的classloader实例转载进来;再建5000个实例。
建一个Sample类,里面写一个很大的静态方法。然后做1的步骤。

1的结果:

Fri May 24 14:28:16 CST 2013before load class
Fri May 24 14:28:21 CST 2013after load class
Fri May 24 14:28:26 CST 2013begin create instance
Fri May 24 14:28:48 CST 2013after create instance

在Visual VM中可见:
可见,实例方法字节码载入permgen 和 类加载同时进行,而不是在新建对象时进行。

2的结果:

Fri May 24 14:25:47 CST 2013before load class
Fri May 24 14:25:51 CST 2013after load class
Fri May 24 14:25:56 CST 2013begin create instance
Fri May 24 14:26:14 CST 2013after create instance

在Visual VM中曲线和1一样。

附部分测试代码:

public class Main {
    public static void main(String[] args) throws Exception {
        String classDataRootPath = "c:\temp";
        String className = "com.test.loader.Sample";
        Thread.sleep(15000);
        System.out.println(new Date() + "before load class");
        List<Class<?>> list = new ArrayList<>();
        for (int i = 0; i < 5000; i++) {
            FileSystemClassLoader fscl1 = new FileSystemClassLoader(
                    classDataRootPath);
            list.add(fscl1.loadClass(className));
        }
        System.out.println(new Date() + "after load class");
        Thread.sleep(5000);
        System.out.println(new Date() + "begin create instance");
        List list2 = new ArrayList<>();
        for (Class c : list) {
            list2.add(c.newInstance());
        }
        System.out.println(new Date() + "after create instance");
        Thread.sleep(5000);
    }

FileSystemClassLoader 我复用了 @关于Java类加载器的代理模式的疑问的代码。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文