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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 乔九 中级黑马   /  2012-12-16 20:32  /  2437 人查看  /  8 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

class MainDemo
{
        public static void main(String[] args)
        {
                System.out.println("Hello World!");
                person p=new person();
                p.show();
                speak();
        }
        public void speak()此句被主函数调用时会提示静态无法引用非静态
        {
                System.out.println("我是姐姐");
        }
}
class person
{
        String name;
        public void show()此句话也不是静态的怎么被调用时不会报错
        {
                System.out.println("haha ");
        }
}

8 个回复

倒序浏览
txl 中级黑马 2012-12-16 20:49:58
沙发
因为person被创建了对象,使用了 对象.方法名 的形式在静态函数中调用,有了对象调用就不会报错
而MainDemo类中的speak()方法,是 this.方法名 的形式在静态函数里调用的,没有MainDemo类的对象,无法调用speak方法.所以会报错


唉,还没有改名字....
回复 使用道具 举报
静态:static
用法:是一个修饰符,用于修饰成员(成员变量,成员函数)
当成员被静态修士后,就多了一个调用的方式,除了可以被对象调用外,还可以直接被类名调用。类名.静态成员
Static特点
1,        随着类的加载而加载,随着类的消失而消失
说明他的生命周期最长
2,        优先于对象存在
3,        被所有对象所共享
4,        可以直接被类名所调用

可以看到下面调用person类的show() 不是静态没有报错,是因为你在调用的时候初始化了person类的对象p,用对象p调用的show()函数。
如果上面的你也实例化对象MainDemo m = new MainDemo();m.speak(); 这样就不报错了
回复 使用道具 举报
本帖最后由 陈德基 于 2012-12-16 20:56 编辑

静态方法是在类被加载到内存中时就存在的,类加载到内存中,你所知道的实例对象都是类加载到内存中的字节码创造出来的,你定义的方法并不是静态方法而是实例对象的方法必须是要在创建对象后才能调用。

class MainDemo
{
        public static void main(String[] args)
        {
                System.out.println("Hello World!");
                person p=new person();
                p.show();
                speak();
        }
        public void speak()这里你有两个选择,一个是在主函数中创建MainDemo的实例对象,二就是在void前面加static 静态修饰符
        {
                System.out.println("我是姐姐");
        }
}
class person
{
        String name;
        public void show()此句话也不是静态的怎么被调用时不会报错
        {
                System.out.println("haha ");
        }
}
回复 使用道具 举报
通常情况下,类成员必须通过它的类的对象访问.像这样:p.show();
简单说来:
1.静态方法可以不用创建对象就调用
2.非静态方法必须有了对象的实例才能调用

回答一:根据1.在静态方法中引用非静态方法,它究竟引用的是哪个对象的非静态方法呢?编译器不知道。,因为没有对象啊,所以要报错.(加上static可试试)
回答二:他是通过了对象去调用。符合2.
回复 使用道具 举报
创建的P 是person的对象。p.show()肯定没有问题。但是你的speak()在Maindemo类中,属于内部方法。你再理解理解static的特点,慢慢理解下、
静态:static
用法:是一个修饰符,用于修饰成员(成员变量,成员函数)
当成员被静态修士后,就多了一个调用的方式,除了可以被对象调用外,还可以直接被类名调用。类名.静态成员
Static特点
1,        随着类的加载而加载,随着类的消失而消失
说明他的生命周期最长
2,        优先于对象存在
3,        被所有对象所共享
4,        可以直接被类名所调用
回复 使用道具 举报
class MainDemo
{
         public static void main(String[] args)
        {
                 System.out.println("Hello World!");
                 person p=new person();
                 p.show();
                 speak();
         }
         public void speak()//此句之所以被主函数调用时会提示静态无法引用非静态是因为:主方法是静态方法,静态方法中要么直接调用其它静态方法,要么采用对象调用实例方法,而你在调用该方法时采用了直接调用,但是本方法又不是静态的,所以会出错。
         {
                 System.out.println("我是姐姐");
         }
}
class person
{
         String name;
         public void show()//此方法虽然不是静态的,但由于他在主方法中调用时采用了对象调用的形式,当然可以啦。
         {
                 System.out.println("haha ");
         }
}
回复 使用道具 举报
speak函数属于MainDemo类,show函数属于person类。
当你使用 person p = new person();的时候,show就已经在内存了。所以可以使用。而MainDemo加载后,首先加载静态的函数, main 就是静态的,进入main后开始执行你的代码,但是speak 还没加载。
简而言之就是你把person当作对象来使用了,所以没有报错,如果你在speak前加上 MainDemo m = new(); 然后m.speak() 这样是可以执行的。

不知道楼主能不能看懂。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马