覆盖和隐藏的区别
- 覆盖是对于实例方法而言的
- 子类的静态方法也不能覆盖父类的实例方法(编译时报错)
- 方法不能交叉覆盖:子类实例方法不能覆盖父类的静态方法,
- 隐藏
隐藏是对于静态方法和成员变量(静态变量和实例变量)而言的,局部变量和形参不被隐藏
(1)当发生隐藏的时候,声明类型是什么类,就调用对应类的属性或者方法,而不会发生动态绑定
(2) 属性只能被隐藏,不能被覆盖
(3)变量可以交叉隐藏:子类实例变量/静态变量可以隐藏父类的实例/静态变量
- 隐藏和覆盖的区别
* (1)被隐藏的属性,在子类被强制转换成父类后,访问的是父类中的属性
在无强制转换时子类要访问父类的属性使用super关键字
* (2)被覆盖的方法,在子类被强制转换成父类后,调用的还是子类自身的方法
子类要是想访问父类的方法,可以使用super关键字
- 4、常见的笔试面试题
1..public class Test {
2. public static void main(String[] args) {
3. Circle circle = new Circle();//本类引用指向本类对象
4. Shape shape = new Circle();//父类引用指向子类对象(会有隐藏和覆盖)
5.
6. System.out.println(circle.name);
7. circle.printType();
8. circle.printName();
9. //以上都是调用Circle类的方法和引用
10.
11. System.out.println(shape.name);//调用父类被隐藏的name属性
12. shape.printType();//调用子类printType的方法
13. shape.printName();//调用父类隐藏的printName方法
14. }
15.}
16.
17.class Shape {
18. public String name = "shape";
19.
20. public Shape(){
21. System.out.println("shape constructor");
22. }
23.
24. public void printType() {
25. System.out.println("this is shape");
26. }
27.
28. public static void printName() {
29. System.out.println("shape");
30. }
31.}
32.
33.class Circle extends Shape {
34. public String name = "circle"; //父类属性被隐藏
35.
36. public Circle() {
37. System.out.println("circle constructor");
38. }
39.
40. //对父类实例方法的覆盖
41. public void printType() {
42. System.out.println("this is circle");
43. }
44.
45. //对父类静态方法的隐藏
46. public static void printName() {
47. System.out.println("circle");
48. }
49.}