1.
代码:
class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } public Grandparent(String string) { System.out.println("GrandParent Created.String:" + string); } } class Parent extends Grandparent { public Parent() { super("Hello.Grandparent."); System.out.println("Parent Created"); // super("Hello.Grandparent."); } } class Child extends Parent { public Child() { System.out.println("Child Created"); } } public class TestInherits { public static void main(String args[]) { Child c = new Child(); } }
修改之前的运行结果
修改之后
在Java语言中,调用子类的构造方法之前,会先行调用父类的无参构造函数,而子类的构造方法会通过super()方法语句调用父类当中的特别的构造函数,而且必须写在第一行,否则会报错
思索:
在Java中子类是通过父类继承,所以子类有父类的所有非私有的属性和方法,如果不调用父类的构造方法,那么不能初始化父类中定义的属性,就给父类的属性分配内存空间 ,如果父类的属性没有分配内存空间,那么子类访问父类的属性,就会报错。
2.
代码如下:
public class Fugai { public static void main(String[] args) { Son x=new Son(); x.add(); } } class Father//父类 { public void add() { System.out.println("父亲"); } } class Son extends Father//子类继承与父类 { public void add() { super.add(); System.out.println("儿子"); } }
结果截图
在Java中,子类如果想要调用父类之中的函数可以引用super()
下面总结覆盖方法的四点性质
(1)覆盖方法所抛出的异常不能比原方法更多。(2)覆盖方法的访问范围不能超出元方法的范围(3)声明为final方法不允许覆盖。例如,Object的getClass()方法不能覆盖。(4)不能覆盖静态方法。
3有关于类型转化的问答
m=d;正确,子类的对象可与i直接赋值给基类变量
d=m; 错误,基类对象要赋给子类对象变量,必须执行类型转换,引用语句的格式为(子类对象变量=(子类名)基类对象名;)
d=(Dog)m;正确,进行了类型转化
d=c; 错误,不同子类之间不能进行赋值操作
c=(Cat)m 错误,m已经转化成dog类型,不能再进行赋值给cat的操作
4.
程序运行之后的结果
Parent.printValue(),myValue=100//父类打印数字
Child.printValue(),myValue=200//子类打印数字
Child.printValue(),myValue=200//父类对象访问子类成员,调用相同的函数名的函数属于子类的;父类的变量进行相关的原算,但是,如果这时父类变量指向子类对象,继续调用得方法和变量仍然是子类覆盖后的新的变量和方法的
Child.printValue(),myValue=200//任然调用的被覆盖后的子类数字
Child.printValue(),myValue=201//将父类强制转化为子类进行输出,调用的是子类的成员函数以及方法
将代码修改之后,会出现不同的结果
黑色进行标注的地方时进行修改之后的代码,在进行输出之后程序结果不同