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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孟江 中级黑马   /  2013-6-6 15:28  /  1722 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

不是说静态只能访问静态吗,下面的代码中,s1是静态的而setName()和getName都是非静态的为什么可以访问呢?
class Student
{
        private Student(){}
        private String name;
        private int age;
        private static Student s = new Student();
        public static Student getStudent()
        {
                return s;
        }
        public void setName(String name)
        {
                this.name = name;
        }
        public String getName()
        {
                return this.name;
        }
}


class StudentDemo
{
        public static void main(String[] args)
        {
                Student s1 = Student.getStudent();
                s1.setName("lisi");
                System.out.println(s1.getName());
        }
}

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 神马都是浮云

查看全部评分

8 个回复

倒序浏览
你理解错了。 Student s1 = Student.getStudent();这句话右边执行时需要加载Student类,对象会被创建并将地址值赋给方法区中的变量s,然后才通过类名调用了getStudent方法,运行后会返回一个s,这个s就是该对象的地址值,然后赋值给了s1,所以,s1也指向了这个对象。s1.setName("lisi");这句话就是对象在调用一个非静态的方法了,这是完全可以的。
以上是我的理解,我也是新手,如果有不对的地方希望其他高手能够指正。

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
private static Student s = new Student(); 这句话是说在对内存中创建了一个Student对象,然后把对象地址值传递给了静态引用s ,引用存放在方法区中。
Student s1 = Student.getStudent(); 这句话是取出方法区中s引用的值赋值给引用s1,但s1引用是放在栈内存中。等价于 Student s1 = new Student();
最终指向的还是堆内存中的对象,所以s1不是静态的。所有被static关键字修饰的静态成员都存放在方法区中。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
Student s1 = Student.getStudent();
Student.getStudent();这句话调用Student类中的getStudent()方法返回了Student类的一个对象
Student s1 = Student.getStudent(); 然后把该对象给了s1   此时,s1就相当于是Student类的一个对象了  后面的语句也就是对象调用方法,当然可以了

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
静态只能调用静态,但是非静态是可以调用静态和非静态的。你理解错了

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报

Student s1 = Student.getStudent();这句话调用getStudent(),就返回了一个你上面定义的new Student(),这里就生成一个对象,就在堆内存了,其实上面你如果直接定义// private static Student s = new Student();//注释掉
        public static Student getStudent()
        {
                return new Student();
        }
效果也是一样,感觉更常用!

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
如果问题已经解决  把帖子的类型改为已解决。
回复 使用道具 举报
楼主你好  如果帖子的问题已经解决,请把帖子的类型改为“已解决”。{:soso_e102:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马