JAVA基础教程(9)
4147 点击·0 回帖
![]() | ![]() | |
![]() | 多态与抽象类 多态是java中一个比较重要的概念,在认识和理解它之前先熟悉一下下面的几个概念. 1.成员变量的隐藏和方法的重写 成员变量的隐藏:子类可以隐藏继承的成员变量,对于子类可以从父类继承成员变量,只要子类中定义的成员变量和父类中的成员变量同名时,子类就隐藏了继承的成员变量.但不提倡这种做法,子类总是自己定义变量而隐藏父类的变量,这样会浪费很多空间. 方法的重写:子类可以隐藏已继承的方法,子类通过方法重写来隐藏继承的方法.具体是指,子类中定义一个方法,并且这个方法的名字,返回值类型,参数个数和类型与父类继承的方法完全相同. 注意:方法的重写与方法的重载要分清楚,回顾一下方法的重载的定义为方法名必须相同,参数的类型和个数必须不同. 用下面的程序好好体会一下方法的重写(还有重载) 复制代码 class Chengji { float f(float x,float y) { return x*y; } } class Xiangjia extends Chengji { float f(float x,float y) //方法的重写,方法的名字,返回值类型,参数个数和类型与父类完全相同 { return x+y ; } //float f(float,x,int y) {return x-y;}错误的语句,在方法名相同的情况下既不属于"重写"也不属于"重载" //float f(int x,int y,int z){z=x-y; return z;}方法的重写,琢磨一下定义就知道了 } public class Example { public static void main(String args[]) { Xiangjia sum; sum=new Xiangjia(); float c=sum.f(4,6);//调用的是子类里的f(),因为子类重写了父类的f() //c=sum.f(1,2,3); 这个则是调用了重载的函数;当然具体调用那个要根据实参的个数和类型来判断喽 System.out.println(c); } } 如果没有重写父类的方法,那使用父类中的方法时就正常使用,看看下面这个混合使用的例子 复制代码 class Area { float f(float r ) { return 3.14159f*r*r; } float g(float x,float y) { return x+y; } } class Circle extends Area { float f(float r) { return 3.14159f*2.0f*r;//重写 } } public class Example4_17 { public static void main(String args[]) { Circle yuan; yuan=new Circle(); float length=yuan.f(5.0f); float sum=yuan.g(232.645f,418.567f); //父类中的方法正常使用 System.out.println(length); System.out.println(sum); } } 注意:重写父类的方法时,不可以降低方法的访问权限.下面的例子中,子类重写父类的方法f,该方法在父类中的访问权限实protected级别,子类重写时不允许级别低于protected级别. 复制代码 class Chengji { protected float f(float x,float y) {return x*y;} } class Xiangjia extends Chengji { float f(float x,float y)//错误,friendly的权限低于protected {return x+y;} } class Xiangjian extends Chengji { public float f(float x,float y)//正确,public的权限高于protected {return x-y;} } | |
![]() | ![]() |