黑马程序员技术交流社区

标题: 有关main函数调用非静态成员的问题 [打印本页]

作者: 尹博    时间: 2012-4-8 02:17
标题: 有关main函数调用非静态成员的问题
    为什么在main函数中用new创建本类对象后调用本类对象的成员时不用在成员前加static修饰,而直接调用本类成员要加static,是不是因为main函数所在的类中只有静态成员才随着类的加载而开辟内存空间,类中的没有被static修饰的成员全部都还不在内存中?
作者: 秦岩    时间: 2012-4-8 07:29
声明为public是为了这个方法可以被外部调用,
static是为了将某个成员变量/方法关联到类(class)而非实例(instance)。
你不需要创建一个对象就可以直接使用这个类的static成员,因而在static成员中不能调用非static成员,因为后者是关联到对象实例(instance)的。
在A类中调用B类的static成员可以使用B.staticMember的写法。
注意一个类的static成员变量是唯一的,被所有该类对象所共享的,在多线程程序设计中尤其要谨慎小心。
类的static成员是在类第一次被JRE装载的时候初始化的。
你可以使用如下方法来使用非static成员:
public class A
{
private void someMethod() //非static成员
{}
public static void main(String args)
{
A a = new A(); //创建一个对象实例
a.someMethod(); //现在你可以使用非static方法了
}
}



概括来讲,静态类可以不需要创建对象直接调用,非静态类需要创建一个对象,然后由对象来调用。当程序比较小的时候,看不出来它的作用,但是如果你了解了面向对象的思想以后,就会知道,每个类都有属于自己的方法,不同的类有不同的方法,简单举例来说,我们有两个类,一个是飞机类,一个是汽车类,这两个类各有属于自己的一个方法——“载客”,那我们可以这样做,新建一个飞机类,在飞机类里面写一个私有的“载客”方法,再新建一个汽车类,在汽车类里面同样写一个私有的“载客”方法,虽然他们的方法名相同,但是他们的载客方法是不一样的,如果只用一个静态的“载客”方法,是无法实现这两个类的“载客”的区别的
关于面向对象的思想需要自己好好去理会,当你明白之后,就自然明白为什么不把所有的方法写成static的了
作者: 郑强强    时间: 2012-4-8 07:56
通常情况下,方法必须通过它的类对象访问。但是如果该方法的使用完全对立于该类的任何对象,
可以利用static关键字。通过该关键字可以创建一个方法或者变量,它能够被自己使用,而不用引用特定的示例。
在方法或变量前面加上static即可。如果一个方法被声明为static,它就能够在它的类任何对象创建之前被访问,而不必引用任何对象。

public class StaticDemo1
{
     //s为静态变量
      public static String s="我是静态变量";
     //静态方法
      public static void printInfo(){
         System.out.println("我是静态方法");
     }
     public static void main(String[] args){
         //调用StaticDemo1中的printInfo方法时,不需要创建新的
         //StaticDemo1对象,直接访问即可
          StaticDemo1.printInfo();
         //直接调用StaticDemo1中的s变量时,直接访问即可
          System.out.println(StaticDemo1.s);
     }
}

java中static表示属于类,不必创建对象可以使用,因为常量应该不依赖任何对象。
final表示值不能改变,一般用作常量的静态成员变量访问权限设置为public,因为常量应该允许所有的类或对象访问。

作者: 邓海涛    时间: 2012-4-8 08:41
如果一个方法主要由主方法调用,则必须按以下格式声明:"public static 方法的返回值类型方法名称(参数列表){}"
这是因为主方法是静态方法,而静态方法是不能调用非静态方法的,所以之前的方法声明处必须加上static关键字
作者: 刘_浩    时间: 2012-4-8 09:54
不是,new出来的对象都在堆内存中的,被static修饰是优先于对象加载,对象还没有存在,就已经有static修饰的成员了。到于调用,静态方法访问静态成员,而非静态方法,可以访问静态成员,也可以访问非静态成员;这是因为static优先于对象加载,当有了对象当然static早就存在于内存中了,所以非静态可以访问静态和大非静态的。有一个先后顺序。
作者: 王硕'    时间: 2012-4-9 16:40
个人感觉楼主问题的问题并不是不清楚为什么静态方法里只能调用静态成员。而是为什么静态方法中new了一个对象后,就可以调用非静态函数。
以前我也不懂。现在的理解:
  1. class Test{
  2.         private static int a=1;
  3.         void show(){
  4.                 System.out.println("111");
  5.         }
  6.         public static void main(String[] args){
  7.                  System.out.println(a);
  8.                  show();
  9.                  Test t=new Test();
  10.                  t.show();
  11.         }
  12. }
复制代码
我觉得重点是看方法被“谁”调用。
在main方法里的某个方法没有明确是谁调用的,那么这个方法前缺省的是类名.
上文,如果在main方法内直接调用show()方法,说明这个方法就是被类所调用的,而它又是非静态方法,jvm在运行到这行时,方法区内还没有show这个方法,自然会报错。
为什么t.show()可以,这个就不用多说了,有对象了,方法区里就可定有非静态方法了,被对象调用理所当然。


说实话,在看到这个问题前,还不是很清晰,也算是对自己的知识巩固吧。
作者: pray    时间: 2014-4-26 04:58
顶!(虽然有且仅有一个字,却深刻表达回复人的深深的祝福与刻骨的情感,可谓言简意赅,一字千金,字字扣人心弦,催人泪下,足于见作者扎实的文字功底和信手拈来的写作技巧及惨绝人寰的创新能力。实在佩服佩服!加上以感叹号收尾,点睛之笔,妙笔生花,意境深远,照应前文,升华主题,把作者的感情表达得淋漓尽致,给人无限感动和惆怅,有浑然天成之感,实乃回复中之极品,祝福中之绝笔。)




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