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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 焦晨光 中级黑马   /  2012-7-18 21:01  /  2323 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 焦晨光 于 2012-7-19 11:06 编辑

public class Foo {
    int i = 5;
    static int k = 2;

    public static void main (String[] args){
        int j = i;
        m1();
        }
    public void m1() {
        i = i+k + m2(i,k);
        }

       public static int m2(int i,int j) {
            return (int) (Math.pow( i , j ));
}
}

首先,上面这段程序是错误的 但是我不知道他错在哪里。
静态变量和静态方法是怎么声明和调用的?
实例变量和实例方法是怎么声明和调用的?
他们两者之间的有什么联系和要注意的?
书上的答案我感觉很笼统,求解!~

8 个回复

倒序浏览
程序有两处错误,集中在main方法中,错误类型相同,在静态的main方法中直接调用了非静态的成员和非静态的方法
int j = i; //因为i是类Foo的非静态成员变量,若想调用,必须建立类的对象,通过对象进行调用
m1(); //m1()是类Foo的非静态成员方法,也需要通过类的对象才能进行调用

正确的调用方式如下:
Foo foo = new Foo();
int j=foo.i;
foo.m1();

另外你这个程序也定义了静态成员变量和静态方法,这个可以直接在main方法中使用,如下:
int x=k;
m2(1,2);
回复 使用道具 举报
静态只能调用静态,不能直接调用飞静态。主函数是静态的,不能在其中直接使用非静态变量i 和直接调用非静态方法m1();
静态static修饰    可以调用静态,不可以直接调用非静态。
非静态无static修饰   可以调用静态和非静态。
回复 使用道具 举报
public class Foo {
            int i = 5;
            static int k = 2;

            public static void main (String[] args){
                int j = i;//错误,i是非静态成员变量
                m1();//错误,m1是非静态成员方法
                }
            public void m1() {
                i = i+k + m2(i,k);
                }

               public static int m2(int i,int j) {
                    return (int) (Math.pow( i , j ));
        }
}

静态方法和实例方法的区别主要体现在两个方面:

1.在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。

2.静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。

静态方法调用和实例方法调用详细代码如下:
        public class Foo{
               
                public static void callMe(){
                        System.out.println("This is a static method.");
                        }
  
                public static void main(String args[]){
                        Foo.callMe(); //1.调用静态方法时,不创建对象,直接调用静态方法
                        Foo f = new Foo(); //2.调用示例方法时,创建一个对象
                        f.callMe(); //利用对象来调用静态方法
                }
        }

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1

查看全部评分

回复 使用道具 举报
首先主函数是静态修饰的,如果不创建对象要调用本类中的非静态方法,需要创建本类对象。
对于你这个例子中,静态成员有:main(String[] args), int k, m2(int i, int j)
非静态成员有:int i, m1()
对于类中的成员,被静态修饰的方法只能调用被静态修饰的成员,
非静态成员间的互相调用,必须创建本类对象,才可调用。
回复 使用道具 举报
     静态方法不需要通过它所属的实例就会被调用,因此在静态方法中不能使用关键字this,也不能直接访问所属类的实例变量和实例方法,但是可以直接访问所属类的静态变量和静态方法,主函数是静态的,java虚拟机只要加载了main()方法所属的类,就能执行main()方法,而无须创建这个类的实例,你的程序中,主函数调用了非静态的成员变量i和成员方法m1()。这儿是错误的。
   静态变量和静态方法就是用static修饰的,可以直接通过类名类访问,被static修饰的成员变量和成员函数标明归某个类所有,不依赖类的特定实例,被所有类的实例共享,也就是说你new N多个对象,这N多个对象共享这个静态的成员变量或者成员方法。
   实例变量也可以叫成员变量,是实例的变量,每个实例的变量可能不同,通过new一个类的实例来调用;实例方法,也叫成员方法,供实例用的方法,必须要先有实例,才能通过此实例调用实例方法。
   至于区别,我感觉就是,静态变量和静态方法可以直接使用,而实例变量和实例方法需要通过new出一个实例来调用。
回复 使用道具 举报
初学者都会遇到这种问题,你要多在论坛上讨论还有多看别人的代码
我刚觉如内存地址分配明白了自然就明白了

下面是毕老师课上的笔记 :
静态:static。
用法:是一个修饰符,用于修饰成员(成员变量,成员函数).
当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,
还可以直接被类名调用。类名.静态成员。

static特点:
1,随着类的加载而加载。
   也就说:静态会随着类的消失而消失。说明它的生命周期最长。

2,优先于的对象存在
明确一点:静态是先存在。对象是后存在的。

3,被所有对象所共享
4,可以直接被类名所调用。

实例变量和类变量的区别:
1,存放位置。
        类变量随着类的加载而存在于方法区中。
        实例变量随着对象的建立而存在于堆内存中。
2,生命周期:
        类变量生命周期最长,随着类的消失而消失。
        实例变量生命周期随着对象的消失而消失。

静态使用注意事项:
1,静态方法只能访问静态成员。
        非静态方法既可以访问静态也可以访问非静态。
2,静态方法中不可以定义this,super关键字。
        因为静态优先于对象存在。所以静态方法中不可以出现this。
3,主函数是静态的。
       
静态有利有弊
利处:对对象的共享数据进行单独空间的存储,节省空间。没有必要每一个对象中都存储一份。
        可以直接被类名调用。
弊端:生命周期过长。
          访问出现局限性。(静态虽好,只能访问静态。)






回复 使用道具 举报
康大玮 发表于 2012-7-18 23:10
初学者都会遇到这种问题,你要多在论坛上讨论还有多看别人的代码
我刚觉如内存地址分配明白了自然就明白了
...

嘿嘿,谢谢,写得很详细,我明白了@~
回复 使用道具 举报
public class Foo {
     int i = 5;
     static int k = 2;

    public static void main (String[] args){
         int j = i;
         m1();//着两行编译的时候都通不过,会报错

         }
     public void m1() {
         i = i+k + m2(i,k);
         }

       public static int m2(int i,int j) {
             return (int) (Math.pow( i , j ));
}
}
错误信息如下图:

因为主函数是静态的方法,静态方法不能访问非静态的方法或者是变量,
在主函数若想调用类的成员变量和方法,因为他们是非静态的,所以必须new一个实例对象,
通过这个对象来调用类的成员变量和类的成员方法,如本题中的变量j和方法m1.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马