一、继承
-
概念:
-
通俗来讲:父亲跟儿子的关系。父亲具有一些跟儿子相同的属性和行为,但是儿子同时也具备一些自己独有的属性和行为。
-
专业讲:有一个父类,具有一些公共的属性和方法,比如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
-