细节

  1. 调用父类构造器的好处(分工明确,父类属性由父类初始化,子类属性由子类初始化)
  2. 当子类中有和父类中的成员(属性和方法)重名时,为了访问父类成员,必须通过super。如果没有重名,使用super、this以及直接访问的效果是一样的。
  3. super的访问不限于直接父类,如果爷爷类和本类中有同名成员,也可以使用super去访问爷爷的成员。如果多个基类(上级类)中都有同名成员,使用super访问遵循就近原则。A->B->C。 ```java package super_TY;

public class Base {//父类是Object public int n1 = 999; public int age = 111;

  1. public void cal() {
  2. System.out.println("Base类的cal() 方法...");
  3. }
  4. public void eat() {
  5. System.out.println("Base类的eat().....");
  6. }

}

  1. ```java
  2. package super_TY;
  3. public class A extends Base{
  4. //4个属性
  5. public int n1 = 100;
  6. protected int n2 = 200;
  7. int n3 = 300;
  8. private int n4 = 400;
  9. public A() {
  10. }
  11. public A(String name) {
  12. }
  13. public A(String name, int age) {
  14. }
  15. // @Override
  16. // public void cal() {
  17. // System.out.println("A类的cal() 方法...");
  18. // }
  19. //4中方法
  20. public void test100() {
  21. }
  22. protected void test200() {
  23. }
  24. void test300() {
  25. }
  26. private void test400() {
  27. }
  28. }
  1. package super_TY;
  2. public class B extends A {
  3. public int n1 = 888;
  4. //编写测试方法
  5. public void test() {
  6. //super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用super去访问爷爷类的成员;
  7. //如果多个基类(上级类)中都有同名的成员,使用super访问遵循就近原则。A->B->C
  8. System.out.println("super.n1=" + super.n1);
  9. super.cal();
  10. }
  11. @Override
  12. public void cal() {
  13. System.out.println("B类的cal() 方法...");
  14. }
  15. public void sum() {
  16. System.out.println("B类的sum()方法");
  17. //希望调用父类A的cal方法
  18. //因为子类没有cal方法,则可以采用以下三种方式调用
  19. cal();
  20. //找cal方法时(cal() 和 this.cal()),顺序是:
  21. // (1)先找本类,如果有,则调用
  22. // (2)如果没有,则找父类(如果有,并可以调用,则调用)
  23. // (3)如果父类没有,则继续找父类的父类,整个规则,是一样的,直到 Object类
  24. // 提示:
  25. // 如果查找方法的过程中,找到了,但是不能访问, 则报错, cannot access
  26. //如果查找方法的过程中,没有找到,则提示方法不存在
  27. this.cal();//等价于cal();
  28. //找cal方法(super.call()) 的顺序是直接查找父类,其他的规则一样
  29. super.cal();
  30. //演示访问属性的规则
  31. //n1 和 this.n1 查找的规则是:
  32. //(1) 先找本类,如果有,则调用
  33. //(2) 如果没有,则找父类(如果有,并可以调用,则调用)
  34. //(3) 如果父类没有,则继续找父类的父类,整个规则,就是一样的,直到 Object类
  35. // 提示:
  36. // 如果查找属性的过程中,找到了,但是不能访问, 则报错, cannot access
  37. // 如果查找属性的过程中,没有找到,则提示属性不存在
  38. System.out.println(n1);
  39. System.out.println(this.n1);
  40. //找n1 (super.n1) 的顺序是直接查找父类属性,其他的规则一样
  41. System.out.println(super.n1);
  42. }
  43. //1. super可以访问父类的属性,但不能访问父类的private属性
  44. public void hi() {
  45. System.out.println(super.n1 + " " + super.n2 + " " + super.n3);
  46. //私有属性无法访问
  47. //System.out.println(super.n4);//报错!!!
  48. }
  49. //2. super可以访问父类的方法,但不能访问父类的private方法
  50. public void ok() {
  51. super.test100();
  52. super.test200();
  53. super.test300();
  54. //私有方法无法访问
  55. //super.test400();//报错!!!
  56. }
  57. //3. super访问父类的构造器
  58. public B() {
  59. //super();
  60. //super("wty",19);
  61. super("wty");
  62. }
  63. }
  1. package super_TY;
  2. public class Super01 {
  3. public static void main(String[] args) {
  4. B b = new B();
  5. b.sum();
  6. System.out.println("================");
  7. b.test();
  8. }
  9. }

image.png

super和this的比较

image.png