黑马程序员技术交流社区
标题:
静态方法的调用
[打印本页]
作者:
牛合超
时间:
2013-3-6 22:56
标题:
静态方法的调用
本帖最后由 牛合超 于 2013-3-7 21:12 编辑
都说java中的静态方法不用创建类的对象,直接拿来用,做试题发现,貌似实例化的对象也可以调用···希望高手能帮忙解释一下···· 疑惑啊,不实例化就是为了简便吗。。。
作者:
张卫刚
时间:
2013-3-6 23:25
java中的静态方法调用有两种方式:
1:类名.静态方法();
2:对象名.静态方法(); 对象名就是实例化的,别疑惑
不实例化调用:省内存, 这样说吧,静态成员随类的加载就存在了,就是不用实例化对象可以直接通过 类名.静态方法()调用;
而实例化的时候,会在堆中创建空间,有了实例化对象才可以通过 对象名.静态方法(); 调用静态方法 感觉出来区别了吧。多想想
作者:
小丑的媳妇2
时间:
2013-3-6 23:38
呵呵 你问你这个问题我曾经也疑惑过 如果你细心的话你会发现 毕老师在第六天的视频中 讲到类方法和实例方法的时候说过这个问题 现在我来回答你的这个问题
首先,你要先明白,实例的方法既能对类变量的操作,也能对实例变量进行操作,而类方法只能对类变量进行操作,
其次,同一个类中的方法可以相互调用,实例方法可以调用该类中的其他方法,类中的类方法只能调用该类的方法,不能调用实例方法.
我这里给你举出一个例子,静态成员变量及方法的调用,代码如下:
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
时间:
2013-3-7 00:12
朱荣宁. 发表于 2013-3-6 23:38
呵呵 你问你这个问题我曾经也疑惑过 如果你细心的话你会发现 毕老师在第六天的视频中 讲到类方法和实例方法 ...
唉.......
作者:
谢洋
时间:
2013-3-7 01:00
我来说一下我的理解吧:
从类的加载开始:
拿这样的一个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到栈内存,所以所有对操作静态成分时,都是同一份。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2