隐藏和覆盖的区别

隐藏和覆盖

覆盖:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同。

  • 覆盖是对于实例方法而言的

方法不能交叉覆盖:子类实例方法不能覆盖父类的静态方法

              子类的静态方法也不能覆盖父类的实例方法(编译时报错)

隐藏:父类和子类拥有相同名字的属性或者方法( 方法隐藏只有一种形式,就是父类和子类存在相同的静态方法)时,父类的同名的属性或者方法形式上不见了,实际是还是存在的。

隐藏是对于静态方法和成员变量(静态变量和实例变量)而言的

(1)当发生隐藏的时候,声明类型是什么类,就调用对应类的属性或者方法,而不会发生动态绑定

(2) 属性只能被隐藏,不能被覆盖

(3)变量可以交叉隐藏:子类实例变量/静态变量可以隐藏父类的实例/静态变量

隐藏和覆盖的区别

(1)被隐藏的属性,在子类被强制转换成父类后,访问的是父类中的属性

在无强制转换时子类要访问父类的属性使用super关键字

(2)被覆盖的方法,在子类被强制转换成父类后,调用的还是子类自身的方法

 子类要是想访问父类的方法,可以使用super关键字
public class Test {  
    public static void main(String[] args)  {  
        Circle circle = new Circle();//本类引用指向本类对象  
        Shape shape = new Circle();//父类引用指向子类对象(会有隐藏和覆盖)  
          
       System.out.println(circle.name);  
       circle.printType();  
       circle.printName();  
       //以上都是调用Circle类的方法和引用  
         
        System.out.println(shape.name);//调用父类被隐藏的name属性  
        shape.printType();//调用子类printType的方法  
        shape.printName();//调用父类隐藏的printName方法   
    }  
}  
   
class Shape {  
    public String name = "shape";  
       
    public Shape(){  
        System.out.println("shape constructor");  
    }  
       
    public void printType() {  
        System.out.println("this is shape");  
    }  
       
    public static void printName() {  
        System.out.println("shape");  
    }  
}  
   
class Circle extends Shape {  
    public String name = "circle"; //父类属性被隐藏  
       
    public Circle() {  //自动调用父类无参构造函数
    	//super();
        System.out.println("circle constructor");  
    }  
     
    //对父类实例方法的覆盖  
    public void printType() {  
        System.out.println("this is circle");  
    }  
      
   //对父类静态方法的隐藏    
    public static void printName() {  
        System.out.println("circle");  
    }  
}  

以下为结果

shape constructor
circle constructor
shape constructor
circle constructor
circle
this is circle
circle
shape
this is circle  //printType被重写,调用子类printType
shape
  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值