10.8动手动脑报告
P8 1.动手实验,运行TestInherits.java ,我们可以看出,先调用爷爷类的无参构造,再调用父亲的无参构造,最后调用子类的构造方法
当使用super关键字显式的调用GrandParent的构造方法时,必须要放到第一句,因为再任何情况下都会隐式或显示的调用无参
结论:通过 super 调用基类构造方法,必须是子类构造方法中的第一个语句。
如果在子类中显示的调用父类的构造方法,不放在第一句就会报错。
构造函数的作用就是初始化一个对象的数据,子类是从父类继承而来,继承了父类的属性和方法,如果在子类中先不完成父类的成员的初始化,则子类无法使用,
应为在java中不允许调用没初始化的成员。在构造器中是顺序执行的,也就是说必须在第一行进行父类的初始化。而super能直接完成这个功能。
P10 2、final关键字,用final修饰的类名就是断子绝孙类,丧失了生育能力。final修饰的类不允许继承,但本身可以继承别的非final类。
final修饰的方法,在子类中不允许重写方法
注意:当final修饰的方法用private修饰的话,子类是访问不到父类的私有方法的,在IEDA中我们也看到父类方法的final颜色变灰了
所以在这里子类的method方法并没有重写父类的方法,而是自己独有的方法,这个时候就和final无关了。
P12 当我们直接输出一个对象时,发现得到的是一个字符串,代表内存地址。通过查看源码的方式我知道了println这个方法底层实现是通过object类的tostring实现的。
当一个字符串和一个对象相加,会隐式地调用object的tostring方法,可以重写tostring方法来达到想要的目的。
此方法返回“类名 @ + hashCode”。为了返回有意义的信息,子类可以重写toString()方法。
在子类中的重写方法的方法体内可以用super关键字调用父类的方法。
总结方法覆盖的规则:1、覆盖方法允许的访问范围不能低于原方法。2、覆盖方法的异常不能多于原方法。3、final和static修饰的方法不能覆盖
三、多态、
1、语法:Animal a = new Cat( );
子类对象可以被当成基类对象使用。instance of 关键字是一个双目运算符,左边是变量名,右边是类名,代表的含义是左边的对象是否能转换为右边的类型,返回一个Boolean类型值。
父类强制转换为子类是不可以的,因为父类有可能没有子类特殊的属性方法
如图,父类的不可以通过强制转化成子类的类型的。同时狗和猫类是两个不同的类,不同类型无法进行赋值。但是子类可以通过强转,来实现类的一个提升
P30,子类和父类定义了一样的字段和方法
对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。
子类可以拥有和父类一样的字段名,在子类的方法中调用的是子类的字段名,会隐藏父类,不过可以通过super调用父类的字段名。
四、接口和抽象类
抽象类可以有非抽象方法,但有抽象方法的类必须定义为抽象类。
子类必须重写抽象类的方法,否则定义成抽象类。
java8之后接口中的方法可以有方法体了,默认的方法修饰符为public abstract 变量的修饰符为final static