黑马程序员技术交流社区

标题: 关键字static [打印本页]

作者: iori    时间: 2015-12-28 18:34
标题: 关键字static
       static这个关键字总感觉学的不好。下面红字部分哪位大神知道啊,给个答复。我总感 觉理解不了,来个通俗易懂的。

关键字static 静态的意思可以修饰成员变量,和成员方法。      特点:     
              1...随着类的加载而加载,随着类的消失而消失。
              2....并且优先于对象存在。
              3...被类的所有对象共享。 //  什么叫被类的所有对象共享啊,我死活不明白什么意思。
             4...可以通过对象名调用,也可以通过类名调用(我们建议通过类名调用)//请举个例子,我现在有点糊涂。
     注意事项:
             A: 静态只能访问静态。 // 不懂,为毛。
             B:静态方法中没有this对象。//为毛。
     静态变量和成员变量的区别

             A:所属不同
                静态变量:属于类,类变量
                成员变量:属于对象,对象变量,实例变量  //什么叫实例变量
            B:内存位置不同
                静态变量:方法区的静态区
                成员变量:堆内存
            C:生命周期不同
                静态变量:静态变量是随着类的加载而加载,随着类的消失而消失
                成员变量:成员变量是随着对象的创建而存在,随着对象的消失而消失
             D:调用不同
                        静态变量:可以通过对象名调用,也可以通过类名调用  //怎么调用,跟上面说的静态只能访问静态。我都蒙了
                        成员变量:只能通过对象名调用




作者: 正阳门下    时间: 2015-12-28 20:59
实例变量就是成员变量
作者: 正阳门下    时间: 2015-12-28 21:02
class  Test_Static{ // 一个static 的例子
        public static void main(String[] args) {
                System.out.println("Hello World!");
                Person p = new Person("北野武","日本");
                p.print1();
                Person p2 = new Person();// 新建一个对象
                p2.setName("宫崎骏");// 没有赋值 country
                p2.print1();// 这个地方输出  日本 (P2这个对象的country没有赋值但是因为country是静态的被共享的,P1的时候已经被赋值了)
                System.out.println(Person.country);// 这个就是类名.直接调用;  输出 日本
                System.out.println(p2.country);// 这个就是对象名调用

        }
}
class Person {
        String name ;
        static String country;// 静态变量,能够被类所有的对象使用; 上面P2就可以直接使用country(日本)
        public Person () {
        }
        public Person(String name, String country) {
                this.name = name;
                this.country = country;
        }
        public void setName(String name) {
                this.name = name;
        }

        public void print1() {
                System.out.println(name);
                System.out.println(country);
        }
        public static void print2() {
                //System.out.println(name);
                System.out.println(country);
        }
       
}
作者: 正阳门下    时间: 2015-12-28 21:05
没有this是因为 静态变量是随着类的加载而加载;而this是对象创建的时候才存在,类加载在对象创建前面所以没有this;
静态方法只能访问静态变量,不能访问非静态变量;这也是因为静态变量是随着类的加载而加载,那个时候其他成员变量还不存在呢
作者: qinrongchang    时间: 2015-12-28 21:10
我们还没学呢  先看看
作者: 汐枫wait    时间: 2015-12-28 23:02
写了好多,赞
作者: Zrz_K    时间: 2015-12-28 23:21
静态随着类的加载而加载,成员变量需要创建对象才存在,所以访问不存在
作者: iori    时间: 2015-12-29 09:12
正阳门下 发表于 2015-12-28 21:02
class  Test_Static{ // 一个static 的例子
        public static void main(String[] args) {
                System.out.prin ...

明白了,谢了,看完代码我就明白了。但一但用中文一说我就蒙了。
作者: 李永佳    时间: 2015-12-29 10:53
  3...被类的所有对象共享。 //  什么叫被类的所有对象共享啊,我死活不明白什么意思。
答:因为一个类,有可能你创建多个实例对象,这多个实例对象都可以使用一份被static修饰的变量。

4...可以通过对象名调用,也可以通过类名调用(我们建议通过类名调用)//请举个例子,我现在有点糊涂。
答:有人举例了就不管了。

A: 静态只能访问静态。 // 不懂,为毛。答:因为静态随着类的加载而加载,所以静态是在非静态之前就存在了,一个已存在的东西去调用为存在的,这不是会出问题吗。

B:静态方法中没有this对象。//为毛。
答:这个好像也有人解释了吧,静态既然不涉及到对象,那么就没有this之分,因为静态的数据只有一份。


成员变量:属于对象,对象变量,实例变量  //什么叫实例变量
答:实例变量就是创建对象之后对象的变量,相对于静态变量而言,被static修饰的是静态变量,类中的其他成员变量就是实力变量。


静态变量:可以通过对象名调用,也可以通过类名调用  //怎么调用,跟上面说的静态只能访问静态。我都蒙了
答:这个吧,你看多了就好了。静态变量因为在类加载后就存在了,所以有个特殊的调用形式,那就是通过类名调用,比如Student.name。





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