JAVA中的隐藏和覆盖

一.属性的隐藏:子类中声明了与超类中相同的成员变量名

    1.从超类继承的变量将被隐藏

    2.子类拥有了两个相同名字的变量,一个继承自超类,另一个由自己声明

    3.当子类执行继承自超类的操作时,处理的是继承自超类的变量,

        而当子类执行它自己声明的方法时,所操作的就是它自己声明的变量

栗子:

class Parent                                   class Child extends Parent    

{                                                       {

  int aNumber;                                             float aNumber;          

}                                                         }


二.访问被隐藏的超类属性

    1.调用从超类继承的方法,则操作的是从超类继承的属性

    2.子类中声明的方法是用 "super.属性" 访问从超类继承的属性


栗子:属性的隐藏

class A1
{
    int x = 2;
    public void setX(int i)
   {
      x =i ;
    }
   void printa()
   {
     System.out.println(x);
    }
}
class B1 extends A1
{
int x = 10;
void printb()
   {
     super.x = super.x + 10;
     System.out.println("super.x = " + super.x + " x= " + x);
    }
}
public class Test{
public static void main(String[] args)
{
   A1 a1 = new A1();
   a1.setX(4);
   a1.printa();  //打印结果: 4

   B1 b1 = new B1();
   b1.printb();    //打印结果: super.x = 12  x = 100
   b1.printa();   //打印结果: 12
   
   b1.setX(6);    //将继承的X值 设置为6
   b1.printb();   //打印结果: super.x = 16  x = 100
   b1.printa();   //打印结果:16
   a1.printa();   //打印结果:4
}
}

栗子:访问超类静态属性

class A1
{
    static int x = 2;
    public void setX(int i)
   {
      x =i ;
    }
   void printa()
   {
     System.out.println(x);
    }
}
class B1 extends A1
{
int x = 10;
void printb()
   {
     super.x = super.x + 10;
     System.out.println("super.x = " + super.x + " x= " + x);
    }
}
public class Test{
public static void main(String[] args)
{
   A1 a1 = new A1();
   a1.setX(4);
   a1.printa();  //打印结果: 4

   B1 b1 = new B1();
   b1.printb();    //打印结果: super.x = 14  x = 100
   b1.printa();   //打印结果: 14
   
   b1.setX(6);    //将继承的X值设置为6
   b1.printb();   //打印结果: super.x = 16  x = 100
   b1.printa();   //打印结果:16
   a1.printa();   //打印结果: 16
}
}   //结论:在继承过程中,超类的静态属性不会被继承,但它可以被本来的对象和子类的对象所访问

三. 方法覆盖:子类定义了重名的方法,那么从超类继承来的方法就被覆盖了

1.覆盖方法的返回类型,方法名称,参数的个数及类型必须和被覆盖的方法一模一样

2.只需在方法名前面使用不同的类名 或 不同类的对象名即可覆盖方法和被覆盖方法

3.覆盖方法的访问权限可以比被覆盖的宽松,但是不能更为严格

4.调用被覆盖的方法: super.被覆盖的方法名();

方法覆盖的注意事项

1.必须覆盖的方法:子类必须覆盖超类中的抽象方法,否则派生类自身也成为抽象类

2.不能覆盖的方法:  超类中声明为final的终结方法,超类中声明为static的静态方法


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值