黑马程序员技术交流社区

标题: 关于static的问题? [打印本页]

作者: 范鹏飞    时间: 2013-3-27 21:40
标题: 关于static的问题?
主函数是static的,那么也可以访问别的类中的非static 方法吗?
不是static 方法只能访问非staic 方法和属性吗?
作者: 胡志超    时间: 2013-3-27 21:46
主函数是static的,只能访问static修饰的属性和方法
不是static 方法可以访问static修饰和非static修饰的方法和属性
作者: 伊廷文    时间: 2013-3-27 21:51
不能,因为只有静态访问静态不能访问非静态
非静态能访问静态的和非静态的
作者: 张昶    时间: 2013-3-27 22:00
第一句话的答案好像是可以的,第二句话的答案好像是可以的。如:
public class Test3{
        public static void main(String[] args){
                //在main()方法体中调用method()方法
                method("Hello HeiMa!");
        }
       
        public static void method(String str){
                //将传来的参数在控制台输出
                System.out.println(str);
        }
}


public class Test8{
        public static void main(String args[]){
                //建立一个内部类对象,同时建立了一个外部类对象
                Out.Inter out = new Out().new Inter();
                //调用内部类的方法
                out.talk();
        }
}

//创建一个外部类
class Out{
        //定义一个外部类变量
        String str = "out";
        //创建一个内部类
        class Inter{
                //创建一个内部类变量
                String str = "inter";
                //定义一个内部类方法
                public void talk(){
                        // 在this前加上外部类名,打印外部类变量
                        System.out.println("外部类变量str = "+Out.this.str);
                        // 用this关键字打印内部类的变量
                        System.out.println("内部类变量str = "+this.str);
                }
        }
}
作者: 王俊杰    时间: 2013-3-27 22:01
本帖最后由 王俊杰 于 2013-3-27 22:13 编辑

static 用到main方法上有其特殊的意义。

static 是为了保证在class loading的时候就能够调用main方法了。

需将main函数设为先于类的构造而执行,否则无法确定调用的构造函数。
假如,包含main方法的类本身又有自己的构造函数,而这时候如果main方法不是static的,JVM就会走投无路了。

如不是static,就一定要生成类实例。但如果没法调用main方法,又有谁能生成类实例呢?

在  http://blog.csdn.net/shenquanxi/article/details/6704315 里解释的特别详细。

我也是看了这个才理解得更透彻。尤其是引自英文网页的那段解释,很深刻。
主函数里面,可以通过其他类的对象来调用对象自己的方法。
不是static 方法里面不只能访问非staic 方法和属性,也可以访问static的属性和方法。通常都是用 类名+点+static属性或方法 的方法来访问

又及:可以认为静态方法是没有this参数的方法。

声明为static的方法有以下几条限制:

1、它们仅能调用其他的static 方法。

2、它们只能访问static数据。

3、它们不能以任何方式引用this 或super。

在一个static 方法中引用任何实例变量都是非法的。
作者: 夏凡    时间: 2013-3-28 08:15
1.static变量
      按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是:
    对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。


2.static方法
      静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。

3.static代码块
      static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。

作者: 曾祥旭    时间: 2013-3-28 09:10
我们知道访问成员方法有两种,一种是创建对象调用该方法,另一种是类名调用,但是通过类名调用的话,那个成员方法必须是静态的。
(1)主函数是静态的,可以访问类中非静态的方法。通过创建对象调用。如:
class Person{
        void show(){}
}
public class Test{
        public static void main(String[] args){
                new Person().show();
        }
}

(2)明白一点就可以了:被静态所修饰后的成员随着类的加载而加载,它是优先于对象存在的。
作者: 赵喜平    时间: 2013-3-28 10:15
被static修饰后具有:随着类的加载而加载,优先于对象存在,被所以对象共享,可以直接被类名调用
静态方法只能访问静态成员
作者: 陆旭东    时间: 2013-3-28 13:46
不能在静态方法中访问非静态成员变量;可以在静态方法中访问静态的成员变量。可以在非静态方法中访问静态的成员变量,而且不能在静态方法中使用this关键字。




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