A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hg3093483 中级黑马   /  2013-3-17 15:53  /  1389 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

新手,看毕向东老师视频看到了static关键字的时候,说到有static的时候会开辟一个方法区,这个方法区是不是指向了栈内存呢?求解

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1 鼓励下

查看全部评分

3 个回复

倒序浏览
不会,因为方法区只供类调用,类变量随着类的加载而存在于方法区中,可以直接被类名所调用,被所有对象所共享
当对象中出现共享数据时,该数据被静态所修饰。
对象中的特有数据要定义成非静态存在于堆内存中
只有栈内存中的引用变量指向堆内存

评分

参与人数 1黑马币 +10 收起 理由
hg3093483 + 10 很给力!

查看全部评分

回复 使用道具 举报
方法的多态static理解
要强调的是,,多态性只发生于方法,而不发生于域.并且,对于方法,只有那些非static与非final方法才具有多态性.

这里讨论的是static方法不能发生多态.值得注意的是, 所谓的static方法不能多态指的是:override的方法本身是不是static的,而不是指调用override方法的方法是不是static 的!比如以下程序:
class Father {
public void act() {
System.out.println("Father.act()");
}
}

class Son extends Father {
public void act() {
System.out.println("Son.act()");
}
}
public    class    Test {
public static    void test(Father i) {    //static方法
i.act();
}
public static void main(String[] a)    {
Son son = new Son();
test(son);

}
}    //输出结果为:Son.act(),如果static不能多态,那结果不就应该是Father.act()吗?

其实,就象上面说的.我们要考虑的是 的act()方法是不是static,有没有多态,而不是调用的方法(test())是不是static的
这跟test方法是否static无关,若把两个act方法都修改成static,则输出结果就是 Father.act(),因为static 方法不能多态




static方法(与隐式static方法)


        static方法就是没有this的方法.在static方法的内部不能调用非静态方法,反过来,非静态方法倒是可以调用static方法.
      !!! 值得注意的是:这里说的是在static方法内部,不能直接调用非static方法,但可以通过生成对象来调用非静态方法.
        在static方法内部,也不可以调用非static变量,其实道理很简单,因为static是面向全局的,相当于全局方法,不可能只针对某个类中的一般变量而使用.

        在static与非static方法内部都不能声明static变量.(全局变量),因为,在方法内声明的变量都是局部变量,不可能在里面定义一个全局变量.



=====了解上面的知识后,你可能会发现有一个特例:在编程思想第四版P157上,(还有很多地方都曾经说过)构造器隐式的就是static的!然而在构造器内部为什么可以直接调用非静态方法??
            static方法就是没有this的方法.在static方法的内部不能调用非静态方法,反过来,非静态方法倒是可以调用static方法.
     !!! 值得注意的是:这里说的是在static方法内部,不能直接调用非static方法,但可以通过生成对象来调用非静态方法.
       在static方法内部,也不可以调用非static变量,其实道理很简单,因为static是面向全局的,相当于全局方法,不可能只针对某个类中的一般变量而使用.

       在static与非static方法内部都不能声明static变量.(全局变量),因为,在方法内声明的变量都是局部变量,不可能在里面定义一个全局变量.



=====了解上面的知识后,你可能会发现有一个特例:在编程思想第四版P157上,(还有很多地方都曾经说过)构造器隐式的就是static的!然而在构造器内部为什么可以直接调用非静态方法??
      所谓显式隐式static,是指类在实例化时,系统会执行的代码
比如
public class StaticTest {
     
      { //这样没有static关键字的,叫隐式static,系统执行完显式static后会接着执行隐式static的代码
          System.out.println("hide static");
          show(); // 这个方法不是static的,但是在这里不会出错
      }
     
      static { //这样有static关键字的叫显式static,系统会先执行显式static的代码
          System.out.println("static");
          //show(); //这个方法不是static的,所以会出错
          }
     
      public StaticTest() { //执行完显式和隐式static后,系统会执行构造器的代码,因为构造器没有static,但也会被执行,跟隐式static一样,所以书上就把它说成隐式static了
          System.out.println("constuctor");
      }
     
      public void show() {
          System.out.println("show");
      }
     
      public static void main(String[] args) {
          new StaticTest();
      }
     
}

所以所谓显式隐式static,只是对于类实例化执行代码的先后顺序而言的,从某种意义上说,不带static的都可以叫隐式static,隐式static可以调用隐式static

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

回复 使用道具 举报
简单的说 static 的方法 调用不能实例化 只能通过类型点对象进行调用
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马