1. 子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问,但私有属性和方法不能在子类直接访问,要通过父类提供的公共方法访问。
    2. 子类必须调用父类的构造器,完成父类的初始化。
    3. 当创建子类对象时,不管使用哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译出错。
    4. 如果去指定调用父类的某个构造器,则显示的调用一下:super(参数列表)
    5. super在使用时,需要放在构造器的第一行
    6. super()和this()都只能放在构造器的第一行,因此两个方法不能共存在一个构造器中。
    7. java中所有类都是Object的子类,Object是所有类的基类。(Ctrl + h可以查看类的层级)
    8. 父类构造器的调用不限于直接父类,将一直追溯到Object类(顶级父类)
    9. 子类最多只能继承一个父类(指直接继承),即java中是单继承机制。
    • 如何让A类继承B类和C类?
    • A类先继承B类,在让B类继承C类。
    1. 不能滥用继承,子类和父类之间要用一定的逻辑关系。 ```java package student;

    public class Base {//父类 //4个属性 public int n1 = 100; protected int n2 = 200; int n3 = 300; private int n4 = 400;

    1. public Base() { //无参构造器
    2. System.out.println("父类Base()构造器被调用....");
    3. }
    4. public Base(String name, int age) {//有参构造器
    5. //默认super()
    6. System.out.println("父类Base(String name, int age)构造器被调用....");
    7. }
    8. public Base(String name) {//有参构造器
    9. System.out.println("父类Base(String name)构造器被调用....");
    10. }
    11. //父类中提供一个public方法,返回私有属性n4
    12. public int getN4() {
    13. return n4;
    14. }
    15. //父类中提供一个public方法,调用私有方法test400
    16. public void callTest400() {
    17. test400();
    18. }
    19. //4个方法
    20. public void test100() {
    21. System.out.println("test100");
    22. }
    23. protected void test200() {
    24. System.out.println("test200");
    25. }
    26. void test300() {
    27. System.out.println("test300");
    28. }
    29. private void test400() {
    30. System.out.println("test400");
    31. }

    }

    1. ```java
    2. package student;
    3. public class Sub extends Base{//子类
    4. public Sub(String name, int age) {
    5. //1. 调用父类的无参构造器, 如下或者什么都不写,默认就是调用super()
    6. //super();//父类的无参构造器
    7. //2. 调用父类的 Base(String name) 构造器
    8. //super("hsp");
    9. //3. 调用父类的 Base(String name, int age) 构造器
    10. super("king", 20);
    11. //细节: super在使用时,必须放在构造器第一行
    12. //细节: super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
    13. //this() 不能再使用了
    14. System.out.println("子类Sub(String name, int age)构造器被调用....");
    15. }
    16. public Sub() {//无参构造器
    17. //super(); //默认调用父类的无参构造器
    18. super("smith", 10);
    19. System.out.println("子类Sub()构造器被调用....");
    20. }
    21. //当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器
    22. public Sub(String name) {
    23. super("tom", 30);
    24. //do nothing...
    25. System.out.println("子类Sub(String name)构造器被调用....");
    26. }
    27. public void sayOk(){
    28. //非私有的属性和方法可以在子类直接访问
    29. //调用属性
    30. System.out.println("n1 = " + n1 + " n2 = " + n2 + " n3 = " + n3);
    31. //n4为私有属性,无法直接访问
    32. //System.out.println(n4);//报错!!!
    33. //要通过父类提供的公共方法访问
    34. System.out.println("n4 = " + getN4());
    35. //调用方法
    36. test100();
    37. test200();
    38. test300();
    39. //test400()为私有方法,无法直接访问
    40. //test400();//报错!!!
    41. //要通过父类提供的公共方法访问
    42. callTest400();
    43. }
    44. }
    1. package student;
    2. public class TestDetails {
    3. public static void main(String[] args) {
    4. Sub sub = new Sub();
    5. sub.sayOk();
    6. }
    7. }

    image.png