形式一:class Instrument
{
public void play(Note n)
{
System.out.println("instrument.play()");
}
}
public class Wind extends Instrument
{
public void play(Note n)
{
System.out.println("Wind.play()"+n);
}
}
形式二:class Instrument
{
public void play(Note n)
{
System.out.println("instrument.play()");
}
}
问题:形式一中Instrument类和形式二中的Intrument类本质上有区别吗,
没有的话, 为什么同一包中的另一个类中比如Music类中的方法
public static void tune(Instrument i)
{
i.play();
}
用形式二可以,而形式一却不可以。这不都是包访问权限吗?初学Java,望多加指教

解决方案 »

  1.   

    问题补充:public static void tune(Instrument i) 

      i.play(Note.C_SHARP); 

     
    忘加参数了。
    但这不是问题所在之处,望指教
      

  2.   

    没有区别
    你是不是把Music写成public的了
    一个类中只能有一个public的类,与类名相同
      

  3.   

     public void play(Note n)i.play(Note.C_SHARP); 你传Note.C_SHARP值是Note的引用么?
    估计你参数传错了
      

  4.   

    额,形式一中的Instrument.play()方法会被子类Wind.play()方法给覆盖掉
    如果你执行形式一中的Wind或Instrument的play()会打印wind.play
    而形式二执行的是Instrument.play()
      

  5.   

    一个class文件中只有一个主类即public类 形式一里面的Instrument类因为不是public类所以被当成Wind的内部类了 同一个包下的其他类是访问不到Wind的内部类的里面的方法的
    形式二里面因为没有定义其他的public类 所以Instrument被默认为主类所以可以被访问
      

  6.   

    music类中方法参数是父类的引用,涉及多态 父类引用指向类型兼容的对象,调用都可以呀。
    不明白你究竟要问什么问题
      

  7.   

    再去看看你的教材书--------《thinking in java》,
    上面解释得很清楚。
      

  8.   


    public enum Note
    {
    ZHANG,YANG;
    }
    class Instrument
    {
    public void play(Note n)
    {
    System.out.println("Instrument play()"+n);
    }
    }
    public class Wind extends Instrument
    {
    public void play(Note n)
    {
    System.out.println("Wind play()"+n);
    }
    }
    public class Music 
    {
    public static void tune(Instrument i)
    {
    i.play(Note.ZHANG);
    }
    public static void main(String[] args)
    {
     Instrument first = new Wind();
     tune(first);
    }
    }谁能把它编译不过的原因找出来。为什么这种形式不行,而用把Instrument类单独出去就可以。!!!!
      

  9.   

    我用eclipse运行正常,没问题啊?
    结果:
    Wind play()ZHANG
      

  10.   

    cmd下你试一试,我的不行,你看你 的行不行,并且我不认为是环境变量配置的问题,
    我有Eclipse 但没使用。
      

  11.   

    冼不是访问权限问题,
    形式一和形式二差别在于,形式一有一个子类继承Instrument,子类中public void play(Note n)方法覆盖了基类中的public void play(Note n)方法,所以很多能是这的问题。
    Instrument first = new Wind();不知道子类继承Instrument有什么用,作用也吸是输出Wind play()+n
      

  12.   

    you are right!非常感谢您的耐心指导。这给了初学Java的我极大的鼓舞,虽然我很菜,但还是想问一问,
    为什么如果不先编译Wind类就不能编译Music类,难道Instrument之前对于Music类是不可见的吗。
      

  13.   

    编译Music类时,找不到wind.class文件,所以会报错。
    IDE会对使用到得类进行自动编译,所以不用自己全部编译。
      

  14.   

    class Instrument  //加public 就可以 
    {
        public void play(Note n)
        {
            System.out.println("Instrument play()"+n);
        }
    }
    public class Wind extends Instrument
    {
        public void play(Note n)
        {
            System.out.println("Wind play()"+n);
        }
    }
      

  15.   

    class Instrument  //加public 就可以 
    {
        public void play(Note n)
        {
            System.out.println("Instrument play()"+n);
        }
    }
    public class Wind extends Instrument
    {
        public void play(Note n)
        {
            System.out.println("Wind play()"+n);
        }
    }
      

  16.   

    你的文件是不是打包了,要是打包在cmd下要加包名的,我试过了,可以