隐藏和覆盖的区别 |
您所在的位置:网站首页 › 密码学与信息隐藏有哪些区别 › 隐藏和覆盖的区别 |
隐藏和覆盖
覆盖:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同。 覆盖是对于实例方法而言的方法不能交叉覆盖:子类实例方法不能覆盖父类的静态方法; 子类的静态方法也不能覆盖父类的实例方法(编译时报错)隐藏:父类和子类拥有相同名字的属性或者方法( 方法隐藏只有一种形式,就是父类和子类存在相同的静态方法)时,父类的同名的属性或者方法形式上不见了,实际是还是存在的。 隐藏是对于静态方法和成员变量(静态变量和实例变量)而言的 (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 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |