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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郎泽东 中级黑马   /  2013-4-20 17:28  /  2579 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Date1{
        private int day;
        private int month;
        private int year;
        public Date1(int d, int m, int y){
                this.day = d;
                this.month = m;
                this.year = y;
        }
        public void setday(int i){
                day = i;
        }
        public void setmonth(int i){
                        month = i;
                }       
        public void setyear(int i){
                        year = i;
                }       
        public int getday(){
         return day;
        }
  public int getmonth(){
  return month;
  }
  public int getyear(){
  return         year;
  }
  public  static void display(Date1 s){
  System.out.println(s.year +"-"+s.month+"-"+s.day);
  }

}
public class Test{
  public static void main(String [] args){
  Date1 d1= new Date1(1,2,3);
  Date1 d2= new Date1(2,3,4);
  Date1.display(d1);
  Date1.display(d2);
  }

}
这是我今天测试的一段代码;为什么静态方法display可以访问s.day和s.month和s.year。我个人认为它们不是静态变量

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

4 个回复

正序浏览
静态方法属于一个类,因为静态方法和静态成员在编译时就存在,所以是属于一个类的,所以在vs中main函数中只能类名.调用静态方法、或者实例化一个对象.静态方法或成员,

静态方法里只能调用静态方法,不能调用非静态方法,因为非静态方法属于一个实例化的一个对象,静态方法中如果调用非静态方法,可能此时并未实例化一个对象,所以不能调用,除非,将一个实例化的对象作为参数传入到静态方法中,此时静态方法中就可以间接的调用非静态方法了

非静态方法可以访问类的静态成员,也可以访问类的非静态成员,因为此时调用非静态方法时,静态方法编译后已经存在,可以调用
回复 使用道具 举报
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢
回复 使用道具 举报
static的特点是在你加载类的时候一并加载进虚拟机。
所以当你在它修饰的时候使用自身的非静态变量会报错,
因为加载类的时候你还没有对象。这些属性就更不可能存在。
但是你的静态方法里给他传递了该类的对象,他自然乐意运行了。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
真让人蛋碎啊,,你这个问题我是真碎了,,首先在display();方法中你传入了一个引用类型的数据 作为形参,,并调用了 该形参的自己的私有属性,当你用类名.直接调用display 时 你传 入了实参 对象d1,这个时候打印的就应该是 传进去的对象的 私有属性。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马