黑马程序员技术交流社区

标题: 关于static的问题 [打印本页]

作者: 胡威    时间: 2012-1-3 09:08
标题: 关于static的问题
abstract class Animal
{
        abstract void eat();
}
class Dog extends Animal
{
        Public void eat()
       {
              System.out.println(“啃骨头”);
       }
}
class Demo
{
        public static void main(String[] args)
        {
                function(new Dog());
                public static void function(Dog d)
               {
                     d.eat();
               }
       }
}

问题:为什么function()要static,能static吗?

作者: 刘忠德    时间: 2012-1-3 09:48
当然可以啊,这是静态函数
静态函数是类相关的,静态函数随类的初始化而初始化,就是说类被加载到内存中的方法区后,该静态方法也被分配到内存中,所以可以直接调用,而非静态方法是对象相关的,当类被实例化后(创建了该类的实例),该非静态方法才被分配内存(加载到内存的方法区中),必须对象调用才行。
作者: 想好了再写    时间: 2012-1-3 10:18
你可以参考一下下面
Java静态对象和非静态对象有什么区别??

静态对象                                                        非静态对象      
是类共同拥有的.                                          是类独立拥有的,
内存空间上是固定的                                              空间在各个附属类里面分配
先分配静态对象的空间                                            继而再对非静态对象分配空间,也就是初始化顺序是先静态再非静态.


java静态对象和静态属性及静态方法又有什么区别呢?
这三者都和一般的对象属性和方法相似,可以将静态对象看成的静态属性.只不过楼主要注意的是在非静态方法里是不可以使用静态属性的.静态方法里也无法使用非静态属性(是属性不是参数.参数一般是指在方法里临时新建的数值或对象,属性是类声明部分声明的信息).


为什么先声明一个静态对象 static Lefthand left;还要在主函数中再实例化该对象呢left=new Lefthand();?
因为任何对象在使用之前都要进行初始化,new就是进行对象的分配空间后进行初始化.


java静态对象到底有什么好处??
我个人的理解就是静态对象可以让相同类型的类之间共享共同的属性,这个共享是同步的,而且不用new,节省了空间


1、静态对象的数据在全局是唯一的,一改都改。如果你想要处理的东西是整个程序中唯一的,弄成静态是个好方法。
2、非静态的东西你修改以后只是修改了他自己的数据,但是不会影响其他同类对象的数据。
3、静态对象和非静态对象都是对象,是对象都是要实例化的。不同之处就是2者的数据表现和存储方式不一样。
4、静态的好处:
引用方便。对于公用类型的变量,直接用 类名.静态方法名  或者  类名.静态变量名就可引用并且直接可以修改其属性值,不用getter和setter方法。
保持数据的唯一性。此数据全局都是唯一的,修改他的任何一处地方,在程序所有使用到的地方都将会体现到这些数据的修改。
有效减少多余的浪费。
作者: 胡威    时间: 2012-1-3 10:34
那么,静态是随着类的加载而加载,这个静态方法里含有dog对象,类加载时还没有创建对象吧
作者: 刘基军    时间: 2012-1-3 10:36
  1. abstract class Animal
  2. {
  3.         abstract void eat();
  4. }
  5. class Dog extends Animal
  6. {
  7.         public void eat()
  8.         {
  9.               System.out.println("啃骨头");
  10.         }
  11. }
  12. class Demo
  13. {
  14.         public static void main(String[] args)
  15.         {
  16.              function(new Dog());
  17.                
  18.         }      
  19.    
  20.   //1.这个方法不能定义在另一个方法里面;
  21.   //2.若是在main()中直接访问function()方法,那么function()必须使用静态static修饰
  22.   //  否则只能:创建一个Demo对象,通过demo对象调用function()方法:new Demo.function(new Dog());
  23.         public static void function(Dog d)
  24.         {
  25.              d.eat();
  26.         }
  27. }
复制代码

作者: 闫玉泉    时间: 2012-1-3 12:50
想好了再写 发表于 2012-1-3 10:18
你可以参考一下下面
Java静态对象和非静态对象有什么区别??

“只不过楼主要注意的是在非静态方法里是不可以使用静态属性的.静态方法里也无法使用非静态属性”
main()函数不是静态方法吗?它不是可以定义非静态的属性吗? 求解
作者: 为梦而战    时间: 2012-1-3 13:00
function()也可以不用static,之所以这里static 了,是想让狗一实例化的时候就有吃的功能 ,而想达到这样的目的,就把function()搞成静态的,这样可以和main()一并加载入来。如不static 的话,当执行此调用函数语句的时候,也会能过调用的方式达到目的。
作者: 罗利民    时间: 2012-1-4 10:01
一定要加static,因为不加的话,function方法是非静态的方法,它是属于实例的,这里没有实例化Demo,因此不加static是不能调用的,
当如如果不想加的话,就要这么写,new Demo().function();

作者: 罗利民    时间: 2012-1-4 10:10
本帖最后由 罗利民 于 2012-1-4 10:36 编辑
闫玉泉 发表于 2012-1-3 12:50
“只不过楼主要注意的是在非静态方法里是不可以使用静态属性的.静态方法里也无法使用非静态属性”
main( ...



首先,在非静态方法里是可以使用静态属性的,是不可以定义静态属性

然后

main()函数是静态方法,它里面定义的是 临时变量,不叫非静态属性。

在某种意义上,静态方法和非静态属性,非静态方法,静态属性,他们是同一级别的,
比如:
public  class Demo
{      int  j = 0; //这个变量是非静态属性
        public static void main(String[] args)
        {      int  i = 0; //这个变量i是临时变量,在这个main方法里有效,不叫非静态的属性
                function(new Dog());
                public static void function(Dog d)
               {
                     d.eat();
               }
       }
}


作者: 彭嘉聪    时间: 2012-1-4 10:42
function(Dog d) 是类demo内的方法,一般要调用此方面必须将类实例化

例如:
main函数下执行此程序段
new demo().function(new Dog());

一般来说不是静态的方法不能直接调用,在内存里面,要new 新的对象,才可以执行对象里面的方法,就好像说,没有小明这个人,又怎么让他去踢球?




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