调用子类构造方法问题
在子类构造方法中要将弗雷德构造方法放在第一位,原因是构造方法起到初始化的作用,在初始化时要先初始化父类在初始化子类,其顺序不能混乱,否则编译器将报错。
方法覆盖
- 对于子类中覆盖的父类的方法,可以在子类覆盖的方法中运用super进行调用,也只能在子类中进行调用,无法通过实例化进行调用。
- 如果子类对象进行强制转换也无法调用父类被覆盖的方法,原因是在内存中还是子类,调用的还是子类的方法。
- 静态方法,以及被final修饰的方法不能被覆盖,但是对于静态方法可以进行重载;
实例代码:
public class ExplorationJDKSource { public static void main(String[] args) { // TODO Auto-generated method stub B a=new B(); System.out.println(a.show()); System.out.println(((A)a).show()); } } class A{ public String show() { return "this is A"; } } class B extends A{ public String show() { return "this is B"; } } 显示结果: this is B this is B
public class ExplorationJDKSource { public static void main(String[] args) { // TODO Auto-generated method stub display(); display("静态方法重载"); } public static void display() { System.out.println("this is a static method"); } public static void display(String s) { System.out.println("this is a static method"+s); } } 结果输出: this is a static method this is a static method静态方法重载
类型转换
这个段代码中的d=m,和d=c会出现错误,前者报错的原因是父类不能当做子类的一个对象,后者报错的原因则是类型转换必须在继承层次类转换,即超类与子类之间.同级之间不能进行转换,
有关对象的类型转换的总结:
- 总是可以进行“父=子”之间的转换,也可以进行跨级跨层次之间的赋值,即父类可以是更高级别的父类
- 可以进行“子=(子)父”之间的转换,但是这种转换并不是永远可以进行,有事可以需要判断能否进行转换可以使用instanceof运算符进行判断。如果父类引用的正确的子类型,则可以执行。如果父类变量引用的是不相关的子类型,将会生成class castException异常。
- 决不能在不相关的任何类之间执行类的赋值或者类型转换。
代码示例:
public class ExplorationJDKSource { public static void main(String[] args) { // TODO Auto-generated method stub Mammal m = new Mammal(); Dog d=new Dog(); Cat c=new Cat(); //m=d; //d=m; d=(Dog)m; //d=c; //c=(Cat)m; } } class Mammal{ } class Dog extends Mammal {} class Cat extends Mammal{}
有关子类总结的问题(补充):
如果自雷时被当作馥蕾诗用的那么,子类访问的字节段是父类的。