这个程序在执行y.min()的时候编译器是调用父类中的方法吗?  如果是为什么不调用子类的方法呢?
如果不是的话  那么答案为什么是 0 100 0  99 呢?

解决方案 »

  1.   

    你子类又没写min这个方法。 当然是调用父类了
      

  2.   

    1、是的,是调用父类的
    2、之所以调用的是父类的,是因为子类自己没有写。
    --------
    技巧性理解:
        就好比,儿子继承了父亲的财产,现在儿子在用财产(即y.min()),那么财产是谁的?当然是父亲的,只不过使用者是儿子罢了 ...
      

  3.   

    因为父类中的 min方法
    就是父类的 a。
      

  4.   

    class son extends father {
    public void plus() {
    a++;
    }
    public int getA() {
    return super.a;
    }
    }
    你把子类的int a 去掉 运行结果 你就明白了
      

  5.   

    public class Test {
    public static void main(String[] args) {
    Dog dog = new Dog();
    dog.call();
    MiniDog mini = new MiniDog();
    mini.call();
    Dog d = (Dog) mini;
    d.call();
    }
    }
    class Dog {
    private String getName() {
    return "Dog";
    }
    public String bark() {
    return "wang wang";
    }
    public void call() {
    System.out.println("I'm " + getName() + " " + bark());
    }
    }class MiniDog extends Dog {
    private String getName() {
    return "Mini";
    }
    public String bark() {
    return "wo wo";
    }
    }
    那这个怎么解释
      

  6.   

    public class Test {
    public static void main(String[] args) {
    Dog dog = new Dog();
    dog.call();
    MiniDog mini = new MiniDog();
    mini.call();
    Dog d = (Dog) mini;
    d.call();
    }
    }
    class Dog {
    private String getName() {
    return "Dog";
    }
    public String bark() {
    return "wang wang";
    }
    public void call() {
    System.out.println("I'm " + getName() + " " + bark());
    }
    }class MiniDog extends Dog {
    private String getName() {
    return "Mini";
    }
    public String bark() {
    return "wo wo";
    }
    }
    那这个怎么解释
    前面不难理解,为什么后面是那样的呢?
    http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html里面写到子类是不能继承父类的私有成员的(私有变量,私有方法),即使子类写了一个和父类中某个私有方法一样方法名和参数的方法,那是子类自己扩展的方法。父类只能调用子类从父类继承过来的方法,而子类自己扩展的方法是不能被父类所调用的。因此,这里只能调用父类的getName()方法,而后面的bark因为在父类中不是私有方法,所以能被子类继承,因此调用的还是子类的继承过来的方法
    Ps:(重载的方法属于子类扩展的方法,覆写的方法才是继承过来的)
      

  7.   

    如果变成public class father {
            int a = 100;
            public void min() {
                    this.a--;
            }
    在调试时候 this 指向的是 son  但是 this.a 却是 father的a。
      

  8.   

    public class Test {
    public static void main(String[] args) {
    Dog dog = new Dog();
    dog.call();
    MiniDog mini = new MiniDog();
    mini.call();
    Dog d = (Dog) mini;
    d.call();
    }
    }
    class Dog {
    private String getName() {
    return "Dog";
    }
    public String bark() {
    return "wang wang";
    }
    public void call() {
    System.out.println("I'm " + getName() + " " + bark());
    }
    }class MiniDog extends Dog {
    private String getName() {
    return "Mini";
    }
    public String bark() {
    return "wo wo";
    }
    }
    那这个怎么解释
    前面不难理解,为什么后面是那样的呢?
    http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html里面写到子类是不能继承父类的私有成员的(私有变量,私有方法),即使子类写了一个和父类中某个私有方法一样方法名和参数的方法,那是子类自己扩展的方法。父类只能调用子类从父类继承过来的方法,而子类自己扩展的方法是不能被父类所调用的。因此,这里只能调用父类的getName()方法,而后面的bark因为在父类中不是私有方法,所以能被子类继承,因此调用的还是子类的继承过来的方法
    Ps:(重载的方法属于子类扩展的方法,覆写的方法才是继承过来的)
     MiniDog mini = new MiniDog();这个时候是子类对象,为什么在getName()方法中还是返回DOg不是应该返回Mini吗?
      

  9.   

    public class Test {
    public static void main(String[] args) {
    Dog dog = new Dog();
    dog.call();
    MiniDog mini = new MiniDog();
    mini.call();
    Dog d = (Dog) mini;
    d.call();
    }
    }
    class Dog {
    private String getName() {
    return "Dog";
    }
    public String bark() {
    return "wang wang";
    }
    public void call() {
    System.out.println("I'm " + getName() + " " + bark());
    }
    }class MiniDog extends Dog {
    private String getName() {
    return "Mini";
    }
    public String bark() {
    return "wo wo";
    }
    }
    那这个怎么解释
    前面不难理解,为什么后面是那样的呢?
    http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html里面写到子类是不能继承父类的私有成员的(私有变量,私有方法),即使子类写了一个和父类中某个私有方法一样方法名和参数的方法,那是子类自己扩展的方法。父类只能调用子类从父类继承过来的方法,而子类自己扩展的方法是不能被父类所调用的。因此,这里只能调用父类的getName()方法,而后面的bark因为在父类中不是私有方法,所以能被子类继承,因此调用的还是子类的继承过来的方法
    Ps:(重载的方法属于子类扩展的方法,覆写的方法才是继承过来的)
     MiniDog mini = new MiniDog();这个时候是子类对象,为什么在getName()方法中还是返回DOg不是应该返回Mini吗?个人理解是:
    因为子类MiniDog中没有call方法,因此调用了父类的call方法,可以看作为父类向子类的实例的引用了,那么getName()子类是没有这个方法的,前面已经说了,私有方法不能被继承,子类中的那个getName()是重新扩展的,不是继承来的,因此,父类是无法对其调用,只能调用自己的了,而bark()方法是子类继承过来的,父类可以进行调用!
    ps:网上我也没找到很多资料,这是我自己的理解,可能有不妥,可以有机会好好找一下!