代码1:
package com.chem;
class  A{
 private void fun(){
 System.out.println("******A类方法******");
 }}
class B extends A{
 void fun(){   
System.out.println("******B类方法******");
}
}
public class ExtendsDemo01 {
public static void main(String[] args){
B b=new B();
b.fun();
}
}
代码2:
package com.chem;
class  A{
 private void fun(){
 System.out.println("******A类方法******");
 }
 public void print(){
 this.fun();
 }
}
class B extends A{
 void fun(){   
System.out.println("******B类方法******");
}
}
public class ExtendsDemo01 {
public static void main(String[] args){
B b=new B();
b.print();
}
}
代码1的输出结果:******B类方法******
代码2的输出结果:******A类方法******
代码2的输出结果为什么是A 有点弄不明白?求指导!

解决方案 »

  1.   

    派生类的fun并没有覆盖父类的fun,改成下面的试试class A {
    public void fun() {
    System.out.println("******A类方法******");
    } public void print() {
    fun();
    }
    }class B extends A {
    public void fun() {
    System.out.println("******B类方法******");
    }
    }
      

  2.   

    this不是你想的new B()传给A的 
    在创建B的时候会同时创建A对象,this就是在创建B之前创建的A对象,用的这个A对象调用的A的私有fun
      

  3.   

    private 方法 不可以覆盖 .
      

  4.   

    #1 
    谢谢1楼  你说的我明白 但是不是我想问的
    #2
    你能在说具体一点么?视频上说的是  代码2:B中的 fun()是新方法 但是我没明白
      

  5.   

    package test;class A {
    private void fun() {
    System.out.println("******A类方法******");
    }
    }class B extends A {
    public void fun() {
    System.out.println("******B类方法******");
    }
    public void print() {
    this.fun();
    }
    }public class ExtendsDemo01 {
    public static void main(String[] args) {
    B b = new B();
    b.print();
    }
    }/**这样试试,你就明白了
     */
      

  6.   

    代码一是因为private 方法不可继承,并且就算是public 你也已经重写了fun()方法,所以你执行的肯定是你重写过的那个方法里面的代码。代码二:
    public void print(){
    this.fun();
    }
    这里是执行的是A里面的fun方法,因为fun是private的,所以不能重写A里面的fun方法,就算重写了那个也是B里面的fun方法,而print()执行的时A里面的fun()方法,所以它的输出是那样的
      

  7.   

    代码2:
    package com.chem;
    class A{
    private void fun(){
    System.out.println("******A类方法******");
    }
    public void print(){
    this.fun();
    }
    }
    class B extends A{
    void fun(){   
    System.out.println("******B类方法******");
    }
    }
    public class ExtendsDemo01 {
    public static void main(String[] args){
    B b=new B();
    b.print();//由于B继承了A,所以拥有了A类的print()方法,显然他是直接调用了A类中的print()方法,没有重写该方法,而该方法public void print(){this.fun();}中的this代表当前对象的引用,实际就相当于声明类A对象:A a,然后a.fun();实现了该方法:private void fun(){System.out.println("******A类方法******");打印了"******A类方法******,应该是这样的
    }
    }
      

  8.   

    建议看马士兵J2se视频第二第三章,画内存分布图,就一目了然了!
      

  9.   

    #6
    有点明白了 在想想。
    马士兵的视频看过了1遍 可能记下来的较少。
    我现在看的MLDN的视频,主要是为了加强基础。