标签:
public class ClassExtends { public static void main(String[] args) { Animal w = new Wolf(); try { w.getAge(); } catch (IOException e) { e.printStackTrace(); } } } class Animal{ private String name; private int age; public Animal(String name){ System.out.print("Animal 带一个参数的构造函数:动物名字叫:"+name+","); } public Animal(String name,int age){ this(name); System.out.println("今年:"+age+"岁了!"); } // private void getAge(){ // System.out.println("My age is 6!"); // } public Object getAge() throws IOException{ getAge();
return null; } } class Wolf extends Animal{ public Wolf() { super("灰太狼",6); System.out.println("Wolf 的无参构造函数!"); }
@Override public String getAge()throws Exception{ System.out.println("My age is "+2);
return null; } }
2.子类方法的访问级别不能低于父类相应方法的访问级别:如果Wolf中的 getAge()为private, Animal中的getAge()为public,ClassExtends 类这个类编译的时候不会有什么问题,但是运行时,根据多态运行机制 w.getAge()调用的是 Wolf的getAge()方法,但是这个方法为private ,虚拟机访问不到,所以会报错(编译时Wolf类的getAge()方法会报错)
3.子类方法的返回值必须是父类方法返回值的子类或者和父类一样:如 Wolf的 getAge() 返回String类型,Animal的getAge()返回Object类型,这个也是子类重写父类方法
4.最好不要在父类构造函数中调用要被重写的方法;因为当类加载的时候,总是先加载父类,如果运行时类型是子类对象,在父类构造函数中调用了被重写的方法,则该方法其实运行的是子类重写后的方法,这个方法可能会用到子类的成员变量,而这时子类的成员变量还没有初始化,可能会 引起空指针;
标签:
原文地址:http://www.cnblogs.com/happy-rabbit/p/4938931.html