JAVA覆盖和隐藏超类中的方法

来源:互联网 发布:淘宝店面设计 知乎 编辑:程序博客网 时间:2024/05/14 06:59

    子类继承了父类的所有成员,包括父类中的方法.然而有时候子类的行为动作并一定和继承过来的方法一致,我们需要为个性的子类编写特有的方法.

 

1.覆盖:

    当一个子类中的一个实例方法具有与其超类中的一个实例方式相同的签名(即方法名、参数个数和类型)和返回值时,称子类中的方法"重写"或"覆盖"了超类的方法.

    示例:

   

// 父类Aclass A{//表示问候的公共方法public void sayHello( ){System.out.println("Hello,everyone!");}//表示道别的公共方法public void sayBye( ){System.out.println("GoodBye,everyone!");}}// A的子类Bclass B extends A{//用中文问候 public void sayHello( ){System.out.println("大家早上好!");}}// 主程序Testpublic class ExtendsDemo3{  public static void main(String[ ] args){B b = new B( );b.sayHello( );b.sayBye( );  }}

输出结果:

大家早上好!GoodBye,everyone!

因此,重写的方法具有与所覆盖的方法需要具备:相同的名称、参数数量、参数类型和方法的返回值.

 

2.隐藏:

    2-1.隐藏父类的类方法:

    隐藏主要是针对父类的类方法(静态方法).下面对隐藏这一概念的迷惑点进行简析:

    1).隐藏与上述的覆盖的作用对象完全不同的,隐藏作用对象是类方法;覆盖作用对象是实例方法.

    2).当存在隐藏时,应该调用子类的类方法还是父类的类方法取决于方法的引用变量最原始类的声明.

    示例:

public class Animal {    public static void testClassMethod() {        System.out.println("Animal中的类方法.");    }    public void testInstanceMethod() {        System.out.println("Animal中的实例方法.");    }}


 

public class Cat extends Animal {    public static void testClassMethod() {        System.out.println("Cat中的类方法.");    }    public void testInstanceMethod() {        System.out.println("Cat中的实例方法.");}}


 

public class ExtendsDemo4{    public static void main(String[] args) {        Cat myCat = new Cat();        Animal myAnimal = myCat;//隐式对象类型转换        Animal.testClassMethod();//调用Animal类的类方法        myAnimal.testClassMethod();//调用myAnimal对象的类方法        Cat.testClassMethod();//调用Cat类的类方法        myAnimal.testInstanceMethod();//调用myAnimal对象的实例方法        myCat.testInstanceMethod();//调用myCat对象的实例方法        Animal myAnimal2 = new Animal();        myAnimal2.testInstanceMethod();//调用myAnimal2对象的实现方法    }}

输出结果:

Animal中的类方法.Animal中的类方法.Cat中的类方法.Cat中的实例方法.Cat中的实例方法.Animal中的实例方法.

 

 

    2-2.隐藏父类的字段:

    如果一个子类中与其父类有同名的字段,即使这些字段的数据类型不同,那么也就是说,子类中的字段隐藏了超类的字段.

    示例:

   

// 父类Aclass A{public String name = "张小明";}// A的子类Bclass B extends A{public String name = "赵红丽";public void self( ){System.out.println("我的名字是:" + super.name);//此处调用子类B中声明的字段name}}// 主程序ExtendsDemo6public class ExtendsDemo6{  public static void main(String[ ] args){B b = new B( );b.self( );  }}

输出结果:

我的名字是:赵红丽

  

  小结:

    方法覆盖与方法隐藏的权限问题

    1).子类中被重写的方法,其访问权限大于等于被其覆盖的方法.例如父类中一个受保护的实例方法(protected)在子类中可以是公共的(public)但是不允许是私有的(private);
    2).子类中不能在实例方法改变其父类的类方法.即两者必须是平行的存在方式,类方法对类方法,实例方法对实例方法.

 

3.重载:

    重载和上述的覆盖、隐藏并没有太大的关系.重载不会对父类有任何影响.重载和构造器相仿,只是根据不同的签名来片选子类还是父类的方法.

    示例:

   

// 父类Aclass A{//表示问候的公共方法public void sayHello( ){System.out.println(“Hello,everyone!”);}}// A的子类Bclass B extends A{//重载的sayHello方法public void sayHello(String helloStr){System.out.println(helloStr);}}// 主程序Testpublic class ExtendsDemo5{  public static void main(String[ ] args){B b = new B( );b.sayHello( );//调用父类中的sayHello方法b.sayHello(“Hello!” );//调用子类中重载的sayHello方法  }}

输出结果:

Hello,everyone!Hello!