定义抽象类Shape,抽象方法为showArea(),求出面积并显示,定义矩形类Rectangle,正方形类Square,圆类 Circle,根据各自的属性,用showArea方法求出各自的面积,在main方法中构造3个对象,调用showArea方法。(体现多态)

实现多态的三个条件:1.要有继承2.要有抽象方法重写3.用父类指针(引用)指向子类对象

重载重写重定义的区别:

1.重载:在同一个类中进行;  编译时根据参数类型和个数决定方法调用;  子类无法重载父类;

  父类同名方法被子类该方法覆盖.

2.重写:在父类和子类之间进行;  父类与子类方法有完全相同类型;

  在运行时根据具体对象类型决定方法调用;

3.在重写中有抽象方法的会产生多态;没有使用抽象方法叫重定义

以下具体代码具体分析:

package test3;
abstract class Shape{      //抽象类(一定有抽象方法,但不一定都是抽象方法)
protected double area;
abstract void showArea();    //抽象方法
}
class Rectangle extends Shape{ //类的继承
private double x,y;
Rectangle(){}
Rectangle(double x,double y){  //有参构造方法初始化
this.x=x;
this.y=y;
}
public double getX(){
return x;
}
public double getY(){
return y;
}
public void showArea(){      //计算面积并显示.showArea方法的重写
area=getX()*getY();
System.out.println(area);
}
}
class Square extends Shape{    //同上
private double x;
Square(){}
Square(double x){
this.x=x;
}
public double getX(){
return x;
}
public void showArea(){
area=getX()*getX();
System.out.println(area);
}
}
class Circle extends Shape{    //同上
private double r;
Circle(){}
Circle(double r){
this.r=r;
}
public double getR(){
return r;
}
public void showArea(){
area=3.14*getR()*getR();
System.out.println(area);
}
}
public class Test3_2 {
public static void main(String args[]){
Shape re=new Rectangle(2,3);    //多态产生的第3个条件.父类的引用指向子类的对象
fun(re);              //抽象方法重写产生多态,运行时根据具体对象类型决定方法调用
Shape sq=new Square(2);
fun(sq);
Shape ci=new Circle(2);
fun(ci);
}
public static void fun(Shape p){    
p.showArea();
}
}

时间: 2024-08-03 15:37:41

定义抽象类Shape,抽象方法为showArea(),求出面积并显示,定义矩形类Rectangle,正方形类Square,圆类 Circle,根据各自的属性,用showArea方法求出各自的面积,在main方法中构造3个对象,调用showArea方法。(体现多态)的相关文章

JavaScript中,数组和对象的遍历方法总结

循环遍历是写程序很频繁的操作,JavaScript 提供了很多方法来实现. 这篇文章将分别总结数组和对象的遍历方法,新手可以通过本文串联起学过的知识. 数组遍历 方法一:for 循环 for 循环是使用最多,也是性能优化最好的一种遍历方式. var arr = ["a", "b", "c"]; for (var i = 0; i < arr.length; i++) { console.log(arr[i]) } // a b c 同样常规

OC中保存自定义类型对象的持久化方法

OC中如果要将自定义类型的对象保存到文件中,必须进行以下三个条件: 想要把存放自定义类型的数组进行 持久化(就是将内存中的临时数据以文件<数据库等>的形式写到磁盘上)必须满足: 1. 自定义对象必须要序列化(将数据有序的存放) 2. 需要使用归档来进行持久化 3. 如果要加载持久化文件需要进行反序列化(就是将有序存放的数据读取并变成自定义对象) 第一要将自定义类型序列化以及第三步并将文件反序列化必须实现OC中的  <NSCoding>协议. 以Student类为例 @interfa

MVC4中AJAX Html页面打开调用后台方法实现动态载入数据库中的数据

之前一直用window.onload方法来调用js方法来实现,今天纠结能不能换个方法实现. 非常明显是能够的. 在html前台页面引用js代码例如以下 @Scripts.Render("~/Scripts/User/AddUser.js") 这就算引用了.看adduser.js代码假设调用后台方法 $(document).ready( function (){ $.ajax({ type: 'POST', url: "/EditUserPassWord/UserGroupQu

CorelDRAW中封套效果给对象定型的方法

利用CorelDRAW中的封套效果可以够使文本.矢量图产生丰富的变形效果.封套的边线框上有多个节点,可以移动这些节点和边线来改变对象形状. 1.首先用CorelDRAW来打开一个已经存在的对象,并且在窗口中用鼠标选择需要定形的对象. 2.用鼠标单击菜单栏中的“效果”菜单项,并从弹出的下拉菜单中选择“封套”命令,快捷键是Ctrl+7. 3.然后单击“添加封套”命令,就可放置一基本矩形封套将选择的对象包围起来.同时用“形状”工具被选定,且一个带有节点的界限出现在对象周围. 4.通过单击需要的按钮.使

MVC4中AJAX Html页面打开调用后台方法实现动态加载数据库中的数据

之前一直用window.onload方法来调用js方法来实现,今天纠结能不能换个方法实现. 很明显是可以的. 在html前台页面引用js代码如下 @Scripts.Render("~/Scripts/User/AddUser.js") 这就算引用了,看adduser.js代码如果调用后台方法 $(document).ready( function (){ $.ajax({ type: 'POST', url: "/EditUserPassWord/UserGroupQuery

子类继承父类时,子类与父类有同名变量,当使用子类对象调用父类方法使用同名变量,这个变量是子类的,还是父类的? (改)

1 public class Test4 { 2 public static void main(String[] args){ 3 Son son = new Son(); 4 son.minusOne(); 5 System.out.println(son.testValue); 6 System.out.println(son.getSuperTestValue()); 7 son.plusOne(); 8 System.out.println(son.testValue); 9 Syst

原!! java直接打印一个对象时,并不是直接调用该类的toString方法 ,而是会先判断是否为null,非null才会调用toString方法

网上看了好多java直接打印一个对象时,直接调用该类的toString方法 . 但是: Object obj=null; System.out.println(obj);//没有报错 System.out.println(obj.toString());//报空指针异常 System.out.println(obj);既然也是直接调用toString方法,为什么不报错??? 原因总结如下: 1.调用Object类的toString方法,必须保证object不是null值,否则将抛出NullPoi

定义一个类Point,代表一个点,public属性有x和y,方法有显示点坐标 show(),构造函数有两个参数分别给x,y赋值,在main方法中构造两个对象,再创建一方法(getMiddle)为取两个点构成线段的中点的坐标,参数为2个点对象,调用此方法后得到一个新的点,编写Application,显示该对象的坐标值。

这个题让我更加明白了类创建对象的实质 代码中用到:1.对象作形参;2.对象作返回值 以下用代码具体分析: 1 class Point1{ 2 public double x; 3 public double y; 4 Point1(){} 5 6 public Point1(double x,double y){ 7 this.x=x; 8 this.y=y; 9 } 10 11 public void show(){ 12 System.out.println("x="+x+&quo

reportViewer中按钮事件截止以及调用其他方法

//ReportView控件中按钮的进行时事件 private void reportViewer1_ReportExport(object sender, ReportExportEventArgs e) { //停止此按钮事件 e.Cancel = true; } //声明保存按钮,并引用其他方法 reportViewer1.ReportExport += new ExportEventHandler(sdsd);