Java 继承

来源:互联网 发布:js调用servlet 编辑:程序博客网 时间:2024/06/15 10:18

     见:构造方法
     子类继承父类的成员变量
          1)能够继承父类的public和protected成员变量;不能够继承父类的private成员变量;
          2)对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
          3)对于子类可以继承的父类成员变量,如果在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。
     子类继承父类的方法
          1)能够继承父类的public和protected成员方法;不能够继承父类的private成员方法;
          2)对于父类的包访问权限成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
          3)对于子类可以继承的父类成员方法,如果在子类中出现了同名称的成员方法,则称为覆盖,即子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类中同名成员方法,需要使用super关键字来进行引用。
      注意:隐藏和覆盖是不同的。隐藏是针对成员变量和静态方法的,而覆盖是针对普通方法的。(后面会讲到)
     构造方法
          子类是不能够继承父类的构造器,但是要注意的是,如果父类的构造器都是带有参数的,则必须在子类的构造器中显示地通过super关键字调用父类的构造器并配以适当的参数列表。如果父类有无参构造器,则在子类的构造器中用super关键字调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器。
     

publicclassTestExtendsV2 {
       publicstaticvoidmain(String[]args)  {
        Shapeshape=newCircle();
//        System.out.println(shape.name);
       shape.printType();
       shape.printName();
    }
}
classShape {
   publicStringname="shape";
    
   publicShape(){
        System.out.println("shape constructor");
    }
    
   publicvoidprintType() {
        System.out.println("this is shape");
    }
    
   publicstaticvoidprintName() {
        System.out.println("shape");
    }
}
 
classCircleextendsShape {
   publicStringname="circle";
    
   publicCircle() {
        System.out.println("circle constructor");
    }
    
   publicvoidprintType() {
        System.out.println("this is circle");
    }
    
   publicstaticvoidprintName() {
        System.out.println("circle");
    }
}

输出为:
shape constructor
circle constructor
//shape
this is circle
shape

上面代码关键词:多态,继承,隐藏和覆盖。
覆盖只对非静态方法起作用。
隐藏对成员变量和静态方法起作用。
原理:覆盖受RTTI(Runtime type identification)约束的,而隐藏却不受该约束。也就是说只有覆盖方法才会进行动态绑定,而隐藏是不会发生动态绑定的。在Java中,除了static方法和final方法,其他所有的方法都是动态绑定。
0 0
原创粉丝点击