动手动脑3

调用子类构造方法问题

  在子类构造方法中要将弗雷德构造方法放在第一位,原因是构造方法起到初始化的作用,在初始化时要先初始化父类在初始化子类,其顺序不能混乱,否则编译器将报错。

方法覆盖

  1. 对于子类中覆盖的父类的方法,可以在子类覆盖的方法中运用super进行调用,也只能在子类中进行调用,无法通过实例化进行调用。
  2. 如果子类对象进行强制转换也无法调用父类被覆盖的方法,原因是在内存中还是子类,调用的还是子类的方法。
  3. 静态方法,以及被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会出现错误,前者报错的原因是父类不能当做子类的一个对象,后者报错的原因则是类型转换必须在继承层次类转换,即超类与子类之间.同级之间不能进行转换,

  有关对象的类型转换的总结

  1. 总是可以进行“父=子”之间的转换,也可以进行跨级跨层次之间的赋值,即父类可以是更高级别的父类
  2. 可以进行“子=(子)父”之间的转换,但是这种转换并不是永远可以进行,有事可以需要判断能否进行转换可以使用instanceof运算符进行判断。如果父类引用的正确的子类型,则可以执行。如果父类变量引用的是不相关的子类型,将会生成class castException异常。
  3. 决不能在不相关的任何类之间执行类的赋值或者类型转换。

代码示例:

 

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{}

 有关子类总结的问题(补充):

   如果自雷时被当作馥蕾诗用的那么,子类访问的字节段是父类的。

 

posted @ 2018-11-01 18:28  九离  阅读(214)  评论(0编辑  收藏  举报