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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

毕老师讲到,静态方法只能访问静态成员。主函数是静态函数,为什么能调用非静态方法呢?
代码如下:
红色部分不明白了,以前还没什么疑惑,讲到静态就糊涂了,求教。
class Person
{
        String name;
        String country="CN";
        Person(String name)
        {
                this.name=name;
        }
        public void show()
        {
                System.out.println(name+country);
        }

}

class PersonDemo
{
        public static void main(String[] args)
        {
                Person p=new Person("lisi");
                p.show();
        }
}

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
是通过引用调用对象的方法。不是直接调用非静态方法。
回复 使用道具 举报
你这个例子是Person p=new Person("lisi");
                p.show();
你在
主函数创建了Person对象 然后p.show():你是通过Person对象调用的方法,而不是直接通过主函数去调用show()
回复 使用道具 举报
本帖最后由 夏诗瑶 于 2012-9-19 23:42 编辑

你举的例子是通过对象去访问对象自己的方法,而不是main方法自己去访问

下面举个例子:在同一类中写个非静态方法用main方法调用,


public class DemoTest {
public static void main(String[] args) {
  show();//Error, //Cannot make a static reference to the non-static method show() from the type DemoTest
}
public  void show(){
  
}
}

回复 使用道具 举报
Person p=new Person("lisi");

p或得了 Person在内存中的地址,指向了person类,引用了person 的地址,

p.show(); 是通过引用调用普通方法的,并不是静态方法直接调用的,这样是可以的。


public class One {
        public static void main(String[] args) {
                One_2.say(); //静态方法还可以通过类名调用,普通方法则不能
                say();//这个是直接调用静态方法
        }
        public static void say() {
                One_2 o = new One_2();
                o.x = 3;
                System.out.println(o.x);
        }
}
class One_2 {
        int x = 5;
        public static void say() {
                System.out.println("one_2");
        }
}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这个问题,你首先要知道为什么main()不能调用非静态方法:
前提是变量只有在内存中才能被访问,
静态成员(方法、变量)在类加载时分配内存,
非静态成员(方法、变量)是类的对象所拥有的,需要类对象实例化后,分配内存。
静态访问非静态出错是因为静态出现的比非静态出现的早,不能访问一个还不存在的东西不是?
总结就是:静态成员不能直接访问非静态成员,需要等到非静态成员存在于内存中时才可以,
main()需要等获得一个对象的引用,然后通过这个引用调用非静态成员。
这样说的话,可以理解一些吗?
回复 使用道具 举报
你是通过创建对象调用的p.show(),而没有直接调用show(),所以你的程序编译不会报错,并且运行正常。
回复 使用道具 举报
一个类就是一种数据类型,当你在主函数中声明了这种数据类型了就是可以用了,就相当于,你在主函数中声明  int[] arr=new int[10];   这个变量也不是静态的,但是你声明了就可以使用,和这个道理是一样的,只要你能理解这句话,并且知道一个类就是一种数据类型就明白了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马