A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

刚刚在看多态,突然想到这么一种状况,有点钻牛角,开发可能遇不到,但还是拿出来晒晒

一个父类里定义了个私有的方法,子类里有个和这个私有同名的public 方法,像下面的代码
class A {
   private void function(){
       System.out.println("AAAAAAAA");
}
   public  static void operator( A a){
    a.function();
   }
public static void main(String[] args){
      A.operator( new A()); //输出是AAAAAAAA
          A.operator( new B());//编译通过了,输出是AAAAAAAA,我只能理解为这是特殊情况吧。
         
}
}
class B extends A {
   public void function(){
       System.out.println("BBBBBB");
}
}

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

5 个回复

倒序浏览
这个程序按照上转型对象的特点来说的话,确实是这样的。那个function()方法没有被重写,只能调用父类的function方法
上转型对象的特点:
1.上转型对象不能操作子类的声明定义的成员变量(失掉了这部分属性),不能使用子类声明定义的方法
2.上转型对象可以代替子类对象去调用子类重写的实例方法。如果子类重写的方法是实例方法,那么上转型对象调用重写的方法时,就是通知对应的子类对象去调用这些方法。因此,如果子类重写了父类的某个实例方法后,子类对象的上转型对象调用这个方法时,一定是调用了这个重写的方法。
3.上转型对象可以调用子类继承的成员标量和隐藏的成员变量。
4.可以将对象的上转型对象再强制转换成一个子类对象,这时该子类对象又具备了子类的所有属性和功能。

  1. A a=new B();
  2.       a.function();//输出是AAAAAAAA
复制代码

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
子类B没有重写父类A的function()方法,因为使用私有修饰符修饰的方法是不能被继承,B类中的function()方法是一个全新的方法,当用子类对象去实例化父类时,父类对象是无法调用子类的新方法。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
  1. class A {
  2.    private void function(){
  3.        System.out.println("AAAAAAAA");
  4. }
  5.    public  static void operator( A a){//当new B时,等效于 A a=new B()
  6.     a.function();
  7.    }
  8. public static void main(String[] args){
  9.       A.operator( new A()); //输出是AAAAAAAA
  10.           A.operator( new B());//编译通过了,输出是AAAAAAAA,我只能理解为这是特殊情况吧。
  11.          

  12.                  /*
  13.                        
  14.                  1、子类B的function方法没有覆写父类A的function,因为父类A的function方法是私有的,不可以被子类所继承。

  15.                  2、A.operator( new B())的new B相当于将对象B的引用地址传递给operator( A a),
  16.                         等效于 A a=new B():向上转型;

  17.                  3、当A拿到对象B的引用地址后,父类A会先调用自己的function方法,而不会去调用子类的function。
  18.                         所以A所调用的function方法不是子类B特有的function,而是本类的function。故才会那样打印
  19.                        
  20.                         总结:

  21.                         1、向上转型的父类可以调用子类继承所覆写的方法,但不可以直接调用子类特有方法,
  22.                         必须对其向下转型为子类对象才可以调用。

  23.                         2、子类不能继承父类私有方法和私有属性,只能继承非私有方法和非私有属性。

  24.                  */
  25. }
  26. }
  27. class B extends A {
  28.    public void function(){
  29.        System.out.println("BBBBBB");
  30. }
  31. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
楼主你的这段代码实际上没有多态,你的main方法中调用了两次A.operator( A a )方法,这个方法是静态方法。你第二次传入的参数为new B(),可是你要知道语法规则中有个叫做参数自动适配的规则,也就是说A.operator(( ? extends A) a ),此时输入的new B(),被隐式的向上转型,因此第二次也是输出AAAAAAAA

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
这个问题毕老师前边的视频讲到过,我也刚学到这儿,父类私有函数,是无法被子类覆写的,因此子类的function方法并没有覆盖父类的,另外new B()将地址传给A a,执行的function是父类的function,所以结果是"AAAAAAAA"

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马