黑马程序员技术交流社区

标题: static的一个小问题,很苦恼 [打印本页]

作者: xieshuhua    时间: 2012-5-14 21:28
标题: static的一个小问题,很苦恼
public class luck {
               
                static void ss(){
                    int []i={1,4};
                    i[0]++;
                    System.out.println(i[0]);
                    }
            public static void main(String[] args) {
                    ss();
}
}
这段程序中ss前面加了一个static修饰符,如果没有就不能编译通过,请问为什么会出现这种情况,求助下。。。
作者: xieshuhua    时间: 2012-5-14 21:29
ss在引用的时候必须加()我想这只是格式的问题吧。
作者: 任睦强    时间: 2012-5-14 21:46
public class luck {
               
                static void ss(){
                    int []i={1,4};
                    i[0]++;
                    System.out.println(i[0]);
                    }
            public static void main(String[] args) {
                    ss();
           }
}
如果ss()这个方法不写static 的话  就要 把  luck 类 new 一下,然后用对象名.ss()才能使用,  
要是ss() 这个方法直接是static的话 ,就可以直接调用,因为静态类可以直接调用静态类。

在同一个类中,如果是特殊的main方法调用其他实例方法,都需要先将类实例化,在通过“对象名。方法名”进行调用,而调用static静态类方法,则不需要,直接调用该方法即可,因为main()方法是一个典型的静态方法,它同样遵循一般静态方法的规则,规则就是静态方法可以直接调用同一个类的静态方法


ss() 后面这个括号 是表示 它是一个方法
作者: 王德南    时间: 2012-5-14 21:49
因为static方法不能直接调用非static方法。而main是static的,所以在ss()前面必须加上static
作者: 朱晓辉    时间: 2012-5-14 21:50
public static void main(String[] args) {
                    ss();      //这里没有创建类的对象,属于调用静态方法,静态方法必须使用static声明。故ss()方法必须使用static静态声明。
}
作者: wangrenjie    时间: 2012-5-14 21:50
因为main方法是static的,静态的方法中只能调用静态的方法或者通过对象调用方法
作者: wangrenjie    时间: 2012-5-14 21:51
main方法是处理器的入口方法,他本身没有指向的,要指向luck里的ss方法,只有2个方法,实例化对象或static。
你可以试下实例化

作者: 高云飞    时间: 2012-5-14 21:51
这样就可以了,new luck().ss();那方法ss()前边就不用加static了,因为你在静态方法里直接引用了一个非静态方法。静态方法在程序加载时候就在内存里了,而非静态方法不会存在,你用一个已经存在的main去调用还没有的ss当然不行了。
作者: 张亭    时间: 2012-5-14 21:51
因为主函数是static 的,static方法只能调用static方法,所以ss前面必须加static修饰符才能被主函数访问
作者: 黑马罗坚    时间: 2012-5-14 22:01
成员用static修饰表明该成员属于该类 是类成员 在类装载是被classload加载进方法区  ss()方法定义时头前没加static修饰符修饰的话代表该方法为成员方法 属于该类对象 不能在类集方法里直接调用只有该类对象才可以调用  而static void main()是类级方法被jvm加载时那时候还没有对象所有不能直接调用静态成员  2中解决方式 把成员修饰成静态(ss()方法修饰成静态方法也就是加static)  或者通过创建该类对象通过对象调用(new lock().ss();)  静态成员的作用率为该类 生存周期为类装载到类结束  成员的作用率为该对象 生存周期对象的创建 到对象变成垃圾也就是无引用指向该对象
作者: xieshuhua    时间: 2012-5-14 22:12
没分了,全部给二楼了,但是下面的回答的也很好,谢谢你们了。
作者: 冯心程    时间: 2012-5-15 13:21
手慢 没回复上  我的分啊{:soso_e109:}
作者: 徐炯    时间: 2012-5-16 10:27
public class luck {
               
                static void ss(){
                    int []i={1,4};
                    i[0]++;
                    System.out.println(i[0]);
                    }
            public static void main(String[] args) {
                    ss();
           }
}
如果ss()这个方法不写static 的话  就要 把  luck 类 new 一下,然后用对象名.ss()才能使用,  
要是ss() 这个方法直接是static的话 ,就可以直接调用,因为静态类可以直接调用静态类。

在同一个类中,如果是特殊的main方法调用其他实例方法,都需要先将类实例化,在通过“对象名。方法名”进行调用,而调用static静态类方法,则不需要,直接调用该方法即可,因为main()方法是一个典型的静态方法,它同样遵循一般静态方法的规则,规则就是静态方法可以直接调用同一个类的静态方法


ss() 后面这个括号 是表示 它是一个方法


这位同学的解释是正解,补充一下:静态方法ss()只能被同一个类的静态方法直接调用,其他类的静态方法必须加上类名才能调用ss();
另外,不支持直接new出一个新类,在软件开发中会造成数据流失(新类里是没数据的)。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2