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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 牛合超 中级黑马   /  2013-3-6 22:56  /  1855 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 牛合超 于 2013-3-7 21:12 编辑

都说java中的静态方法不用创建类的对象,直接拿来用,做试题发现,貌似实例化的对象也可以调用···希望高手能帮忙解释一下···· 疑惑啊,不实例化就是为了简便吗。。。

4 个回复

倒序浏览
java中的静态方法调用有两种方式:
1:类名.静态方法();
2:对象名.静态方法();   对象名就是实例化的,别疑惑
不实例化调用:省内存,    这样说吧,静态成员随类的加载就存在了,就是不用实例化对象可以直接通过 类名.静态方法()调用;
   而实例化的时候,会在堆中创建空间,有了实例化对象才可以通过   对象名.静态方法();  调用静态方法   感觉出来区别了吧。多想想

评分

参与人数 2黑马币 +8 收起 理由
陈丽莉 + 6
牛合超 + 2 这么晚了,谢谢各位的细心回答。.

查看全部评分

回复 使用道具 举报
呵呵 你问你这个问题我曾经也疑惑过 如果你细心的话你会发现 毕老师在第六天的视频中 讲到类方法和实例方法的时候说过这个问题 现在我来回答你的这个问题
首先,你要先明白,实例的方法既能对类变量的操作,也能对实例变量进行操作,而类方法只能对类变量进行操作,
其次,同一个类中的方法可以相互调用,实例方法可以调用该类中的其他方法,类中的类方法只能调用该类的方法,不能调用实例方法.
我这里给你举出一个例子,静态成员变量及方法的调用,代码如下:
package lession1;
import java.io.IOException;
public class HelloWorld {

private static int a = 10;
private int b;

public static void main(String[] args) throws IOException,Exception
{
//静态变量或方法可直接调用
hello1();
System.out.println(a);
//静态变量或方法也可以通过类名.成员名调用
HelloWorld.hello1();
System.out.println(HelloWorld.a);

//非静态方法必须通过类的实例来调用
HelloWorld helloWorld = new HelloWorld();
helloWorld.hello2();
//非静态变量必须通过类的实例来调用
System.out.println(helloWorld.b);
}

//静态方法hello1
//静态方法内可以调用非静态方法
public static void hello1()
{
System.out.println("Hello World! -1");
}

//非静态方法hello2
//非静态方法内也可以调用静态方法
public void hello2()
{
System.out.println("Hello World! -2");
}
}


输出结果:
Hello World! -1
10
Hello World! -1
10
Hello World! -2
0


通过这个例子,你会发现:
1.静态变量或方法可直接调用
方式一:staticMethodName();
方式二:ClassName.staticMethodName();

2.非静态方法必须通过类的实例来调用
步骤一:
定义一个类的实例 HelloWorld helloWorld = new HelloWorld();
步骤二:通过实例调用 helloWorld.hello2();

注:如果把hello2方法定义为static,则会出现warnings如下:
the static method hello2() from the type HelloWorld should be accessed in a static way.

如果用实例的方式去调用静态变量a,则会出现warnings如下:
the static field a should be accessed in a static way.

这是我的理解,希望对你有用!

评分

参与人数 2技术分 +1 黑马币 +3 收起 理由
陈丽莉 + 1
牛合超 + 3 这么晚了,谢谢各位的细心回答。.

查看全部评分

回复 使用道具 举报
朱荣宁. 发表于 2013-3-6 23:38
呵呵 你问你这个问题我曾经也疑惑过 如果你细心的话你会发现 毕老师在第六天的视频中 讲到类方法和实例方法 ...

唉.......
回复 使用道具 举报
我来说一下我的理解吧:
从类的加载开始:
拿这样的一个Person类来比示例吧
class Person{
    String name;
    public String getName(){
            return name;
    }
   public static void show(){
         System.out.println("static show ");
   }
}
1、假如我们要new Person()的对象时,类加载器会根据Person这个类名找到Person.class文件
2、然后把Person.class文件以字节码的形式,加载到内存中来
3、这时Person的所有成分都被加载进来,可以把这些成分看成是制造对象的原材料吧。
4、既然所有成分都被加载了,为什么只能直接用 类名.静态成分,而还能使用非静态成分?
5、那就先了解一下对象的生成:当new Person()时,JVM根据类名找到字节码,通过该的构造方法在堆内存中
   开辟一个间空间,分别把以上各种成分的引用(各成分加被进内存时的地址),存入所开辟的间空中,
   也就是说对象的空间存放着指向各成分的地址;
6、有了上面指向字节码成分的地址,对象要调用某个成分时,它就会把相应的地址传给jvm,然后jvm根据地址找到相应的成分并进行操作;
7、当每个对象操作的成分是非静态,jvm都会从字节码中把相应的非静态成分copy一分到栈内存中,并且该成分是指向调用它的对象,
  这时对象就可以该成分进行操作了,当对象用完了,JVM就会把该成分从栈内存中回收,这就是所谓的非静态的由来吧
8、当用类名或对象调用静态成分时,是找到这些成分后接操作的,没有把它们copy到栈内存,所以所有对操作静态成分时,都是同一份。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马