
Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。比如可以分隔符先定义一个类叫车,车有以下属性:车体大小,颜色,方向盘,轮胎,而又由车这个类派生出轿车和卡车两个类,为轿车添加一个小后备箱,而为卡车添加一个大货箱。
类和类之间的继承关系可以用UML符号表示,其中父类又叫超类或基类,子类又叫派生类。父类是子类的一般化,子类是父类的特化(具体化)。
JAVA不支持多继承,单继承使JAVA的继承关系很简单,一个类只能有一个父类,易于管理程序,同时一个类可以实现多个接口,从而克服单继承的缺点。
在面向对象程序设计中运用继承原则,就是在每个由一般类和特殊类形成的一般——特殊结构中,把一般类的对象实例和所有特殊类的对象实例都共同具有的属性和 *** 作一次性地在一般类中进行显式的定义,在特殊类中不再重复地定义一般类中已经定义的东西,但是在语义上,特殊类却自动地、隐含地拥有它的一般类(以及所有更上层的一般类)中定义的属性和 *** 作。特殊类的对象拥有其一般类的全部或部分属性与方法,称作特殊类对一般类的继承。
继承所表达的就是一种对象类之间的相交关系,它使得某类对象可以继承另外一类对象的数据成员和成员方法。若类B继承类A,则属于B的对象便具有类A的全部或部分性质(数据属性)和功能( *** 作),我们称被继承的类A为基类、父类或超类,而称继承类B为A的派生类或子类。
继承避免了对一般类和特殊类之间共同特征进行的重复描述。同时,通过继承可以清晰地表达每一项共同特征所适应的概念范围——在一般类中定义的属性和 *** 作适应于这个类本身以及它以下的每一层特殊类的全部对象。运用继承原则使得系统模型比较简练也比较清晰。
package extend/**
* 圆类
* @author 枫雅
* 2019年3月21日
*/
public class Circle {
private double r
public final static double PI = 3.14
public Circle(double r) {
this.r = r
}
public double Circumference(double r) {
return 2*PI*r
}
public double Area(double r) {
return PI*r*r
}
} package extend
/**
* 圆柱类,继承自圆类
* @author 枫雅
* 2019年3月21日
*/
public class Cylinder extends Circle{
private double h
public Cylinder(double r, double h) {
super(r)
this.h = h
}
public double CeArea(double r, double h) {
return super.Circumference(r)*h
}
public double Volume(double r, double h) {
return super.Area(r)*h
}
} package extend
/**
* 圆锥类,继承自圆柱类
* @author 枫雅
* 2019年3月21日
*/
public class Cone extends Cylinder{
public Cone(double r, double h) {
super(r, h)
}
public double CeArea(double r, double h) {
return super.CeArea(r, h)/2
}
public double Volume(double r, double h) {
return super.Volume(r, h)/3
}
} package extend
/**
* 测试类
* @author 枫雅
* 2019年3月21日
*/
public class Test {
public static void main(String[] args) {
double r = 3
double h = 2
Circle circle = new Circle(r)
System.out.println("半径为:" + r + " 圆的周长为:" + circle.Circumference(r))
System.out.println("半径为:" + r + " 圆的面积为:" + circle.Area(r))
Cylinder cylinder = new Cylinder(3, 2)
System.out.println("底部半径为:" + r + ",高为:" + h + " 圆柱的侧面积为:" + cylinder.CeArea(r, h))
System.out.println("底部半径为:" + r + ",高为:" + h + " 圆柱的体积为:" + cylinder.Volume(r, h))
Cone cone = new Cone(3, 2)
System.out.println("底部半径为:" + r + ",高为:" + h + " 圆锥的侧面积为:" + cone.CeArea(r, h))
System.out.println("底部半径为:" + r + ",高为:" + h + " 圆锥的体积为:" + cone.Volume(r, h))
}
}
当然有fathera=newson是属于父类引用指向了子类对象,java把这种把子类对象赋给父类引用变量称之为向上转型
区别:给你举个例子
比如,father类有一个eat()方法,son类继承了father类,也就拥有了eat()方法,并同时定义了自己的方法drink().如果是fathera=newson,则你只能调用属于father的方法eat(),而不能调用son的方法drink().也就是说虽然变量a指向了对象son,但由于它编译时的类型是father,所以它不能调用属于son的方法,尽管变量a运行时的类型是son.
而sona=newson中的a则可以调用属于它自己的方法drink().和它继承的方法eat(),因为a这个引用变量编译时的类型和运行时的类型都是son.
再说的大众些,fathera=newson是以父亲的角度看儿子,由于父子之间有继承关系,你是创造了一个儿子对象并把它当父亲用,所以你只能调用属于父亲的方法,而sona=newson就是你是创造了一个儿子对象并把它当儿子,所以你可以调用属于儿子的方法和他所继承父亲的方法
以后你理解了多态以后,就好理解这个问题了
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)