黑马程序员技术交流社区

标题: 父类成员被子类覆盖后,如何继续调用父类成员呢? [打印本页]

作者: 曹宇    时间: 2013-3-29 13:45
标题: 父类成员被子类覆盖后,如何继续调用父类成员呢?
本帖最后由 曹宇 于 2013-3-29 13:47 编辑

如下代码
  1. class Fu
  2. {
  3.         int show()
  4.         {
  5.                 System.out.print("a");
  6.                 return 0;
  7.         }
  8. }
  9. class Zi extends Fu
  10. {
  11.         int show()
  12.         {
  13.                 System.out.print("b");
  14.                 return 0;
  15.         }
  16. }
  17. class Run
  18. {
  19.         public static void main(String [] args)
  20.         {
  21.         Zi z= new Zi();
  22.         z.show();                                    //在这地方直接调用父类中的show()如何调用?
  23.         }
  24. }
复制代码
正常情况下是这样的,可是我想在主函数中直接调用父类中的show()应该怎么调用?      

我尝试使用这样的语句 z.super.show()  不行,这样的语句super.show()也不行,  我向来想去  不知道在这地方怎么调用父类中的show()


谢谢了!
作者: 胡志超    时间: 2013-3-29 13:52
你直接创建父类对象,然后用父类对象调用自己的方法
作者: Just_Only    时间: 2013-3-29 13:56
使用super关键字
继承的时候,如果子类覆盖了父类的成员方法的那么父类的功能将会被隐藏的,此时可以使用super关键字,则可以现实父类的功能内容。
也可以使用父类的构造的函数的,但此时必须写在子类构造函数的第一行。
代码如下
你将下面的代码中加一句
int show()

        {

               System.out.print("b");

                return 0;

        }
加了后的代码

int show()

        {

               super.show();
                System.out.print("b");

              return 0;

       }

作者: HM汪磊    时间: 2013-3-29 14:01
你的意思是用子类对象调用父类被覆盖的方法是吧?代码如下,另外你的代码小问题也有,帮你改啦,自己看看,你定义的函数不用返回数据,所以定义成public void 就可以
也省去return语句啦!!!!
class Fu
{
        public void show()
        {
                System.out.print("a");
        }
}
class Zi extends Fu
{
        public void show()
        {
                System.out.print("b");
        }
                public void showFu()
        {
                super.show();//调用父类被覆盖的方法
        }
}
class Run
{
        public static void main(String [] args)
        {
                        Zi z= new Zi();
                        z.showFu();
        }
}
作者: 奋斗2013    时间: 2013-3-29 14:10
你好 ,针对你的问题我想提问一下,子类在创建对象时,是不是可以向上转型为父类对象?那么这个对象是不是既能调用父类的方法,又能调用子类的方法。
作者: 董延京    时间: 2013-3-29 14:15
这个代码有错误吧,一个Run类应该是public修饰符,要不然这个程序没有办法执行的。不过意思表达出来了:
不能,单独通过这个子类是不能去调用已经被覆盖的父类的方法。必须要一个父类的实例。
对于一个被覆盖的父类方法,唯一可以调用父类方法的地方,就只有子类内部。子类自己控制,什么时候该调用父类,什么时候做自己的处理。
所以,如果你希望子类用这个父类的方法,可以这样写:
  1. class Fu {
  2.   public int show() {
  3.     System.out.print("a");
  4.     return 0;
  5.   }
  6. }

  7. class Zi extends Fu {
  8.   @Override
  9.   public int show() {
  10.     System.out.print("b");
  11.     return 0;
  12.   }
  13.   
  14.   public int showFu(){
  15.    return  super.show();
  16.   }
  17. }

  18. public class Run {
  19.   public static void main(String[] args) throws Exception {
  20.     Zi z = new Zi();
  21.     z.showFu();
  22.   }
  23. }
复制代码

作者: 曹宇    时间: 2013-3-29 15:14
恩,谢谢你们的回答,明白了。

就是说子类的对象并不能够直接去调用父类隐藏的方法的,就像私有数据了,要提供访问方式才能访问。
父类隐藏的也是,只有创建父类对象或者在子类中提供对父类隐藏函数的调用函数,然后对此子类函数进行调用来间接的访问父类函数。




作者: 曹宇    时间: 2013-3-29 15:15
董延京 发表于 2013-3-29 14:15
这个代码有错误吧,一个Run类应该是public修饰符,要不然这个程序没有办法执行的。不过意思表达出来了:
不 ...

恩,为什么一个Run类要被public 修饰呢?

我在编译和运行都通过了啊!
作者: 曹宇    时间: 2013-3-29 15:22
奋斗2013 发表于 2013-3-29 14:10
你好 ,针对你的问题我想提问一下,子类在创建对象时,是不是可以向上转型为父类对象?那么这个对象是不是 ...

我想 如果是这样的话 不知道这样可不可以实现。

class Fu{
private Fu(){}
public static Fu f= new Fu();
public static Fu getFu()
    {
        return f;
    }
}
class Zi extends Fu
{
    .......

}
class Run
{
    Fu f = Fu.getFu();
}
作者: 曹宇    时间: 2013-3-29 15:24
奋斗2013 发表于 2013-3-29 14:10
你好 ,针对你的问题我想提问一下,子类在创建对象时,是不是可以向上转型为父类对象?那么这个对象是不是 ...

我想 如果是这样的话 不知道这样可不可以实现。

class Fu{
private Fu(){}
public static Fu f= new Fu();
public static Fu getFu()
    {
        return f;
    }
}
class Zi extends Fu
{
    .......
    .......
    .......
}
class Run
{
   
Zi duixiang =  new Zi();
duixiang = Fu.getFu();
}

上面是伪代码。。。。随便写的。   
如果如你所说,将子类对象向上转型成父类 我想参看单例设计模式中的这个方法,应该可以将子类对象向上成为父类对象。

至于对不对,我也不清楚,菜鸟一枚。。。。。。

还望大神来说一说,指点一下。
作者: 董延京    时间: 2013-3-29 15:57
曹宇 发表于 2013-3-29 15:15
恩,为什么一个Run类要被public 修饰呢?

我在编译和运行都通过了啊!

的确,可能是我误解了,一个java文件中至多只能有一个public类的意思了,不好意思。
作者: 陆旭东    时间: 2013-3-29 16:03
因为Run这个类不是Fu这个类的子类,所以用super()肯定是不可以的,你可以就创建一个Fu类的对象,然后调用对象的方法。
作者: 董延京    时间: 2013-3-29 16:06
曹宇 发表于 2013-3-29 15:15
恩,为什么一个Run类要被public 修饰呢?

我在编译和运行都通过了啊!

又去确定了一下,如果在一个文件中,有多类,但只有一个有main()方法时可以省略,jdk会自己识别,但当多个类有main()方法时,就必须表明哪个类是public的,否则jdk找不到运行入口。至多有一个public类。
作者: 熊永标    时间: 2013-3-29 16:17
你可以在你的子类方法中再添加一个方法,用于调用父类的方法,然后在子类对象中调用该方法就等于调用父类的方法了嘛!!!
public int callSuperShow(){
       return super.show();
}
作者: 陈丽莉    时间: 2013-3-29 16:35
建议将追问的内容,补充到提问中去哦~
作者: 曹宇    时间: 2013-3-29 20:40
董延京 发表于 2013-3-29 16:06
又去确定了一下,如果在一个文件中,有多类,但只有一个有main()方法时可以省略,jdk会自己识别,但当 ...

额,我记得不是类名进行编译吗?有多个main 但是这些main的类名应该是不同的吧?

我在写java文件的时候,也有过多个main入口的情况,但是我编译好之后,都是运行我要进入的main的对应class文件执行的。。。

不过一个文件中 至多有一个public 我还不知道,长知识了。

谢谢学长了!
作者: 曹宇    时间: 2013-3-29 20:42
陈丽莉 发表于 2013-3-29 16:35
建议将追问的内容,补充到提问中去哦~

恩,谢谢美女斑竹的提醒啦。

也是,在下面回复,追问的内容不容易让人看到。
作者: 黑马李杰    时间: 2013-3-29 21:38
刚学了反射,用反射玩一下,呵呵

package com.j2se.text;

class Fu
{
        int show()
        {
                System.out.print("a");
                return 0;
        }
}
class Zi extends Fu
{
        int show()
        {
                System.out.print("b");
                return 0;
        }
}
class Run
{
        public static void main(String [] args) throws Exception
        {
                Fu z= new Zi();
                z.show();                                    //在这地方直接调用父类中的show()如何调用?
                Fu f = (Fu)z.getClass().getSuperclass().newInstance();
                f.show();
        }
}
作者: 王廷顺    时间: 2013-3-29 23:44
大家给出的解决方法都很好,既然都被你们说了,我在这里就延伸一点,如果定义的是静态方法,去实现这个功能,还可以使用类名调用。代码如下:
class Fu

{

       static int show()    //定义为静态方法。

        {

                System.out.print("a");

                return 0;
        }

}

class Zi extends Fu

{
      
       static int show()     //定义为静态方法。

        {
                Fu.show();           //使用类名调用。
                      System.out.print("b");

                return 0;
        }

}
class Run

{

        public static void main(String [] args)

        {
        
        Zi z= new Zi();
        z.show();      //在这地方直接调用父类中的show()如何调用?
                             

       }

}
作者: 曹宇    时间: 2013-3-30 11:23
恩 谢谢你们的回答,受教了。{:soso_e142:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2