day08-java继承

day08-继承

一、继承

  • 概念:

    • 通俗来讲:父亲跟儿子的关系。父亲具有一些跟儿子相同的属性和行为,但是儿子同时也具备一些自己独有的属性和行为。

    • 专业讲:有一个父类,具有一些公共的属性和方法,比如Person类,有name,age,sex等属性,eat(), sleep()等行为,又有一个Student类,他也具有Person类的相同属性和方法,那么Student类就可以继承Person类,而不用再去定义那些相同的name,age等等属性和方法;同时student类又可以拥有自己的特有属性和方法,比如有成绩grade属性,学习study()方法等,这些是父类Person不具备的,所以此时子类Student 他就具备Person中的内容+自己特有内容。

    • 子类继承父类的都是非private内容,父类中private修饰的是继承不了的

  • 内存分析

  • Person p = new Person(); 
    Student s = new Student(); ​ 
    s = p;//此时会编译报错,但是加上 s =(Student)p,强转后,编译无措,但是运行时候,子类调用自己的方法时候就会报java.lang.ClassCastException,
    因为此时子类要访问自己的内容时候,你父类中根本没有,就报错,看下图,子类的范围会大于父类。
    • 在创建一个单纯的父类对象时候,内存中就开辟一块空间给父类的Person

    • 但在创建一个子类的对象的时候,在内存中也同样开辟一块空间给Student,但是这块空间中,先会给一部分给父类的Person,然后才是自己的Student。

    • 当把父类的引用传递给子类时候,就会报错,原因子类访问不到自己特有内容了,此时父类的引用指向中只有父类自己的共性内容。

  • 覆盖

    • 当父类中有声明一些共有的方法时候,Person中比如eat( )  sleep( )等方法,但是这些都是固定的,每个子类都可以有自己不同的eat( )和sleep( )表现形式,这个时候就可以在子类中覆盖父类的同名方法,调用时候优先考虑子类中的方法。

    • 当出现继承时候,子类创建实例时候,比如 Student s = new Student();此时是先创建一个父类的Person对象,将Person加载完毕后,才会来创建子类的Student对象,这样就很好解释,为什么父类调用同名方法时候,会是子类覆盖后的,因为先加载完父类后,在加载子类,此时子类已经将此方法重写了,你再使用的肯定是覆盖后的方法。

      下面的结果就是zi show  0    和 zi  show  8

 

猜你喜欢

转载自www.cnblogs.com/zhiai007/p/9357148.html