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

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

 

1.覆盖:

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

    示例:

   

// 父类A
class A{

	//表示问候的公共方法
	public void sayHello( ){
		System.out.println("Hello,everyone!");
	}

	//表示道别的公共方法
	public void sayBye( ){
		System.out.println("GoodBye,everyone!");
	}

}

// A的子类B
class B extends A{
	//用中文问候
 	public void sayHello( ){
		System.out.println("大家早上好!");
	}
}

// 主程序Test
public 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.隐藏父类的字段:

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

    示例:

   

// 父类A
class A{
	public String name = "张小明";
}

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

输出结果:

我的名字是:赵红丽

  

  小结:

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

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

 

3.重载:

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

    示例:

   

// 父类A
class A{
	//表示问候的公共方法
	public void sayHello( ){
		System.out.println(“Hello,everyone!”);
	}
}

// A的子类B
class B extends A{
	//重载的sayHello方法
	public void sayHello(String helloStr){
		System.out.println(helloStr);
	}
}
// 主程序Test
public class ExtendsDemo5{
  public static void main(String[ ] args){
	B b = new B( );
	b.sayHello( );							//调用父类中的sayHello方法
	b.sayHello(“Hello!” );						//调用子类中重载的sayHello方法
  }
}

输出结果:

Hello,everyone!
Hello!

 



 

 

   

   

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值