class Cleanser
{
private String s = new String("Cleanser");
public void append(String a) {s=s + " " +a+ " ";}
public void dilute() {append("dilute()");}
public void apply() {append("apply()");}
public void scrub() {append("scrub()");}
public String toString() {return s;}
public static void main(String [] args)
{
Cleanser x = new Cleanser();
x.dilute();
x.apply();
x.scrub();
System.out.println(x);
}
}
public class Detergent extends Cleanser
{
public void scrub()
{
append("Detergent.scrub()");
super.scrub();
}
public void foam()
{
append("foam()");
}
public static void main(String [] args)
{
Detergent x = new Detergent();
x.dilute();
x.apply();
x.scrub();
x.foam();
System.out.println(x);
System.out.println("Testing base class");
Cleanser.main(args);
}
}
我觉得在类Detergent中应该看不到变量s(private String s) 那下面的x.dilute();这些调用就要用到s  怎么就没出错了呢

解决方案 »

  1.   

    s的确在子类是不可见的,但你并没有在子类中直接操作s啊,所以没有出错。  子类继承了父类的方法,当你没有重写该方法时,就是通过其父类进行操作。  如果你在子类main中加一个类似x.s = "";语句就会见到报错
      

  2.   

    但是可以通过方法去访问啥!
    x是一个Detergent对象,这个对象继承了Cleanser类,那么就可以通过Detergent的对象访问dilute方法,而这个方法在Cleanser中通过append方法操作Cleanser自己的私有变量是合法的...
      

  3.   

    class A
    {
    private int i=1;
    public int j=2;
    public void aa()
    {
    System.out.println(i + "  " + j);
    }
    }
    class Test extends A
    { public static void main(String [] args)
    {
    Test t = new Test();
    t.aa();
    }
    }当Test类继承了类A Test类就有了个aa()方法
    class A
    {
    private int i=1;
    public int j=2;
    }
    class Test extends A
    {
    public void aa()
    {
    System.out.println(i + "  " + j);
    }
    public static void main(String [] args)
    {
    Test t = new Test();
    t.aa();
    }
    }
    那我这样,类A没有aa()方法,而我呢自己写个aa()方法
    这样和继承到的aa()方法有什么区别吗?
      

  4.   

    但是可以通过方法去访问啥!
    x是一个Detergent对象,这个对象继承了Cleanser类,那么就可以通过Detergent的对象访问dilute方法,而这个方法在Cleanser中通过append方法操作Cleanser自己的私有变量是合法的...不是有个this的吗 x.dilute(); this是x; 就会调用 x.append("apply()") 那append()方法里的s 还是应该是this.s也就是x.s啊,怎么就变Cleanser的s了呢??????????
      

  5.   

    aa()有什么区别,楼主运行这个程序就知道了请注意你的子类代码中从来就没有出现过this.s,虽然调用了一个子类自己的方法,但你的子类的方法仍然是在调用父类已有方法。劝楼主结贴,好好将类的定义与继承、扩展这两章反复看几遍