Java学习笔记 —— 2.继承

160 阅读2分钟

1.继承

  • 1. 子类能继承父类非私有成员

也就算说除了private修饰的方法或变量都可以继承

父类A

public class A {
    //公开变量
    public int i;
    public void print1(){
        System.out.println("===print1===");
    }
    //私有变量
    private int j;
    private void print2(){
        System.out.println("===print2===");
    }
}

子类B

public class B extends A{
    //B类私有变量
    private int k;
    //子类继承A父类公开成员
    public void print3(){
     System.out.println(i);
     print1();
    // System.out.println(j); // 报错
    // print2(); // 报错
    }
}
出现错误,无法继承父类私有变量
image.png
  • 2.子类对象创建实质上是通过子父类共同完成的

看构造函数是否共同实现可以得出
//构造函数A
public A() {
    System.out.println("A");
}
//构造函数B
public B() {
    System.out.println("B");
}
结果:
image.png
由此可以得出先通过A父类的实现,再到B子类的实现,是由二者共同完成的
  • 3.Java只能是单继承 但可以多层继承

单继承

class C extends A{} //单继承
// class C extends A, B{} //多继承 会报错

多层继承

class B extends A{}
class C extends B{}

特别的:Object类是Java中所有类的祖宗类,也就是说所有的类都是间接或直接的与Object类相关 是子类或孙子类

  • 4.重写

就是把父类中要重写的方法,在子类中把父类的方法名字,参数重写一遍,方法具体实现部分重写,如:

父类A

public void print111(int a, int b){
    System.out.println("111");
}

子类B

@Override
public void print111(int a, int b){
    System.out.println("666");
}

重写后调用执行得,而不是111

image.png
  • 5.构造器与变量访问问题

就近原则 活用this super

public class B extends A{
    //构造函数
    public B(){
        this(1);
        System.out.println("B()");
    }
    public B(int b){
        super();
        System.out.println("B(int b)");
    }
}

无参实例化

public static void main(String[] args) {
    B b = new B();
}

结果:

image.png

解析:无参实例化首先调用的是“子类B中无参的构造函数”,第一行是this(1)即”子类B中的有参构造函数“,进入到B(int b),顺序执行到super()即”父类A的无参构造函数“打印出”A()“,然后执行打印语句,打印出"B(int b)",this(1)执行完毕,最后在子类B无参构造函数中执行打印语句,打印出"B()"。

PS: this(...)和super(...)都只能放在构造器的第一行 不写默认在子类构造器中写上super()

此处有待补充