日期:2014-05-20  浏览次数:20760 次

java继承中的一个小问题
首先代码贴出来

public class TestExtends {
public static void main(String[] args) {
new Person().printPerson();
new Student().printPerson();
}
}

class Student extends Person {
private String getInfo() {
return "Student";
}
}

class Person {
private String getInfo() {
return "Person";
}

public void printPerson() {
System.out.println(getInfo());
}
}


student继承了person类,private不能访问,但是printPerson是public的,是可以访问的,但是它里面调用了person里的private的方法,这种情况,结果是两个person,等于还是去调用了父类person里的private的getInfo方法。

这里有点不明白,为什么不是去掉子类中的重写的getInfo()方法呢?
------解决方案--------------------
student类没有printPerson()方法,所以调用父类的,父类怎么调用子类的方法?
------解决方案--------------------
private修饰的方法只能在类内部访问,不会被子类继承或者被创建的对象调用
------解决方案--------------------

class Person {   
  private String getInfo()
{   
      return "Person";     
}       
public void printPerson() 
{         
System.out.println(this.getInfo());

实际上父类中调用的是当前的getInfo方法。而这个方法子类中有,但是由于是私有的并没有被继承下去。
这就相当于调用的是this.getInfo();
------解决方案--------------------
你犯了一个错误,我按逻辑来给你分析一下,先诞生了父类,按照前面说的那个例子,父类里面有两个方法,如果把getInfo()方法去掉,那么是不是应该在printPerson()中调用getInfo()方法的时候应该说明调用的是那个类里面的getInfo()方法。以此来推算,父类里面有这个方法那么就会调用父类里面的方法。如果没有就会报错,所以父类不会调用子类里面的方法,原因就是父类先诞生的,子类后诞生的。在构造父类的时候怎么能提前调用子类的方法呢?
------解决方案--------------------
public class TestExtends 
{
    public static void main(String[] args)
    {
System.out.println("1-------------1");
    //通过new父类实例化后,调用了printPerson();
    //而printPerson(); 里面又调用了 getInfo()方法
    //所以输出肯定是Student
        new Person().printPerson();
System.out.println("2-------------2");
//通过new子类实例化后,Student是Person的子类,所以
//Student类会继承父类除private修饰的关键字外的属性和方法
//调用了printPerson(),调用的这个方法是子类从父类继承而来的,
//但是父类的这个方法在输出时,又会调用父类本身的这个 getInfo()
        new Student().printPerson();
System.out.println("3--------------3");
    }
}
 
class Student extends Person 
{
    private String getInfo()
    {
   
        return "Student";
    }
}
 
class Person {