JAVA面向对象程序设计——类的继承(继承、多态)

来源:互联网 发布:淘宝达人登陆入口 编辑:程序博客网 时间:2024/04/29 08:36

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

一、继承(上)   继承思想:多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。那么被继承了类,通常称作:超类、父类;继承类被称作:派生类、子类。   子类继承父类后,就可是使用父类的功能和属性(有些不可以),子类可以直接访问父类中的非私有的属性和方法。  继承的好处: 1、大大的提高了代码的复用性。2、类与类之间产生了新的关系,为多态提供先提条件。      继承的特点:      1、 在java中不可以多继承,只有单继承。也就是说,一个类只可以有一个父类。      2、 在java中可以多层深继承。举个例子就是, 我有一个A类最为超类;你B类可以继承我,C类也可以继承我; 而D类也可以继承B类,E类可继承C类。这样以树状图的形式延伸。      3、 子类继承父类的时候,继承了父类中的属性,和方法!构造函数是无法继承的。      4、 父类所写的构造函数重载,子类的构造函数也必须去重载(子类只能多,不能少)。      5、在父类中,被private修饰的方法和属性,子类将无法引用。        说道继承不可不说的一个类——Object         Object 是所有类的‘鼻祖’类。 但是不包含基本类型,因为基本类型没有父类和子类一说。 当你建立一个类的时候及时你没有继承某一个类,但那时JVM隐示的给你指定Object作为父类。  注意: 被final 修饰的类是无法继承的,如String 、Integer、、、;   二、继承(下)  2.1 父类子对象为什么说是父类子对象呢? 因为每一个子类的对象,都包含一个父类的对象。当你调用一个对象的方法时,这个对象会先查找自己说否有这个方法,如果有就调用,没有就找父类。 所以也就是说,你父类,为自己提供的方法,我子类可以有,也可以不写(儿子打架打不过了,叫上父亲一起上)。2.2super 关键字的使用     子类可以通过,super 关键字来访问父类子对象。也可以通过super 来调用父类的构造方法。 但是在父类中被private修饰的属性和方法,是无法被调用的。     (子类继承父类,调用子类实例,JVM 加载的顺序:1、先执行父类中,实例属性的显示初始化语句和构造代码块。2、执行父类构造器。 3、再执行子类实例属性的显示初始化语句和构造代码块 4,执行子类构造器 )     如上所述,说明一个问题:就是说,子类的构造器需要完成调用父类的构造器。不管是隐示调用还是显示调用,子类的构造器必须去调用父类的构造器。 但是,如果一个类就只有一个private构造器,那么这个类将无法继承。     Super 在什么时候必须使用?1、子类,访问父类同名属性的时候。 (必须)2、子类,访问父类相同方法的时候。   (必须)3、子类构造函数,调用父类构造函数的时候。(必须)2.3子类重写父类方法 (重点)重写:(多用于继承、接口和抽象类)在子类中写的方法,与父类中方法名参数一致就叫做重写父类方法。(被static、final、private无法被重写)重写要求:      1、子类访问级别不可以小于父类。例如:父类用public修饰,子类就只能用public修饰, 如果父类是默认修饰,子类,可默认修饰or public修饰。(父类中被private修饰的方法,子类不能重写;)    2、方法名和参数和参数类表必须与父类方法相同。    3、返回值必须是父类方法的返回值,或者是其子类的。    注意:如果子类重写了父类的方法,那么外界调用的就一定是子类的方法。    三、多态(实例讲解) (看前必读:多态不用实例来说明的话我估计大部分没基础朋友就晕了。但是写的不好的话别见怪。) 在面对象中多态性实际上是面向对象的一个最大的中最有用的特点,对于多态性在java中两种体现:   1 、方法的重载及覆写  2、对象多态性:指的父类对象和子类对象之间的转型操作(1)向上转型(子类is a 父类):父类名称 父类对象=new 子类实例;(自动完成)//父类class A { //父类属性    final int field=0;     //父类 方法    public void fun() {        System.out.println("Hello A");    }    //父类静态方法    public static void sFun() {        System.out.println("hello A");    }}//子类class B extends A {//父类已经定义了field属性,子类又定义了!所以就覆盖了父类的属性。(属性没有重写)    public int field = 20;        B(){ }    //重写了父类的方法     public void fun() {      System.out.println("Hello B");    }    //静态方法 无法重写    public static void sFun() {        System.out.println("hello B");    }}class MainApp {    public static void main(String[] args) {    //向上转型        A a1 = new B();        //B类重写了A类的方法。其实调的是,B类的fun()        a1.fun();        //静态类是无法继承的,所以调的是,A类的sFun()        a1.sFun();        //这里打印的是,A类的field,因为属性,无法重写。        System.out.println(a1.field);        }(2)向下转型(父类is a 子类)子类名称 子类对象 =(子类名称)父类实例;(强制完成)  class MainApp {    public static void main(String[] args) {    //向下转型B b=(B)new A();           System.out.println(a1.field);        }向上转型:用父类的引用指向子类引用指定的实体。这是安全的!向下转型:用子类的引用指向父类引用指向的实体。这是不安全的!多态总结 :1、所有操作方法应该要以父类所规定的方法为主,子类最好不要任意扩充。2、有了向上转型,才会有多态,所以常常会说向上转型,就是多态(不建议用向下转型)。3、实例化调用对象的时候,有实体类型来决定调用的那个方法,而不是引用类型(简单说,就是后面那个)。4、虽然调用的方法是实体类的方法,但是调用方法个数受引用类型的限制(就是说,我引用类有几个方法,我就调你实体类几个方法!)5、多态实现必须要实现的前提条件:继承(类、抽象类)或 实现(接口);重写类(接口)中 的方法;向上转型后调用重写方法(前提条件缺一不可)注意:多态只是实现了,方法的调用,属性是不可以被调用的。在多态实现中,所使用的属性由引用类型来决定,而不是实体类。 附加:(对象数组范例,网上看到的,感觉很好就收藏了 )(看前必读:这个程序写的有点问题,不可深究!只供参考) package shuZuDuiXiang;/*现在要求定义一个数组类(Array),里面定义一个整形数组,但是此整形数组属于动态分配大小,即:所有的大小 * 由程序指定,并在此基础上实现以下的两个子类: *  反转类:可以将数组的内容翻转显示 *  排序类:可以对数组进行排序的显示 * */class Array {private int num[];private int foot;//表示添加的下标public Array(int len){//通过构造方法传递数组的大小if(len>0){this.num=new int[len];//根据外部指定开辟的空间}else{this.num=new int[1];//至少维持一个大小,}      }public boolean add(int temp){//向数组中添加内容if(this.foot<this.num.length){//还有地方this.num[this.foot++]=temp;return true;}else{return false;}}public int[] getData(){//取得全部数据return this.num;}};class SortArray extends Array{//数组排序public SortArray(int len){super(len);}public int[] getData(){// 对父类数组进行排序      (API)sort对指定的int型数组按数字升序进行排序java.util.Arrays.sort(super.getData());//排序后,返回父类数组return super.getData();}};class ReverseArray extends Array{//这个类主要是实现数组互换public ReverseArray(int len){super(len);}public int[] getData(){int center=super.getData().length/2;//求出中心点int head=0;//开始点int tail=super.getData().length-1;for(int x=0;x<center;x++){//数组互换位置。int temp=super.getData()[head];super.getData()[head]=super.getData()[tail];super.getData()[tail]=temp;head++;tail--;}return super.getData();}};public class ExecDemo {public static void main(String[] args) {ReverseArray arr=new ReverseArray(4);System.out.println(arr.add(6));System.out.println(arr.add(3));System.out.println(arr.add(8));System.out.println(arr.add(1));int temp[]=arr.getData();for(int x=0;x<temp.length;x++){System.out.println(temp[x]);}}};


 

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

原创粉丝点击