3
回答
向上转型和向下转型的实现。
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
package com.syq.test;

public class Shape {

        public void draw() {
            System.out.println("绘制图形…………");
        }

        public double getPerimter() {
            return 0;
        }

        public double getArea() {
            return 0;
        }

        public void print() {
            System.out.println("这是父类的print方法");
        }

}

 

package com.syq.test;

public class Triangle extends Shape {
    private double sid1;
    private double sid2;
    private double sid3;

    public Triangle() {
    }

    public Triangle(double sid1, double sid2, double sid3) {
        this.setSid1(sid1);
        this.setSid2(sid2);
        this.setSid3(sid3);
    }

// 求三边中最长的边
    public double sidMax() {
        return (sid1 > sid2) ? sid1 : (sid2 > sid3) ? sid2 : sid1;
    }

// 重写toString方法,用于描述对象
    public String toString() {
        return "三角形周长:" + this.getPerimter() + "\n三角形面积:" + this.getArea()
                    + "\n最长的边长:"+this.sidMax();
    }

    public void draw() {
        System.out.println("绘制三角形…………三边长:"+this.getSid1()+" "+this.getSid2()+"                                 "+this.getSid3());
    }

    // 绘制三角形,返回是否符合三角形的定义
    public void draw(Triangle triangle) {
        if (this.sid1 + sid2 > sid3 & sid3 - sid1 < sid2) {
            this.setSid1(sid1);
            this.setSid2(sid2);
            this.setSid3(sid3);
            System.out.println("成功绘制三角形!");
        }else {
            System.out.println("不符合绘制三角形的条件!");
        }
    }
// 计算周长
    public double getPerimter() {
        return this.sid1 + this.sid2 + this.sid3;
    }

// 计算三角形面积
    public double getArea() {
        double p = this.getPerimter() / 2;
        double area = Math.sqrt(p * (p - sid1) * (p - sid2) * (p - sid3));
        return p;
    }

        public double getSid1() {
            return sid1;
        }

        public void setSid1(double sid1) {
            this.sid1 = sid1;
        }

        public double getSid2() {
            return sid2;
        }    

        public void setSid2(double sid2) {
            this.sid2 = sid2;
        }

        public double getSid3() {
            return sid3;
        }

        public void setSid3(double sid3) {
            this.sid3 = sid3;
        }

}

 

package com.syq.test;

public class Circle extends Shape {
        private double r;

        public Circle() {
        }

        public Circle(double r) {
            this.setR(r);
        }

// 计算圆的直径
        public double diameter() {
            return 2 * r;
        }

        public void draw() {
            System.out.println("绘制圆…………半径:"+this.getR());
        }

// 绘制圆
        public void draw(Circle circle) {
            if (this.r > 0) {
                this.setR(r);
                System.out.println("成功绘制圆!");
            }else {
                System.out.println("绘制圆条件不符合!");
            }
        }

// 重写toString方法
        public String toString() {
            return "圆的半径: " + this.r + "\n圆的周长:" + this.getPerimter() + "\n圆的面积:"
                        + this.getArea();
        }

// 计算圆的周长
            public double getPerimter() {
                return 2 * 3.1415926 * r;
            }

// 计算圆的面积
            public double getArea() {
                return r * r * 3.1415926;
            }

            public double getR() {
                return r;
            }

            public void setR(double r) {
               this.r = r;
            }

}

 

package com.syq.test;

public class Rectangle extends Shape {

        private double length;
        private double wide;

        public Rectangle() {
        }

        public Rectangle(double length, double wide) {
            this.setLength(length);
            this.setWide(wide);
        }

// 计算对角线
            public double diagonal() {
                return Math.sqrt(length * length + wide * wide);
            }

            public void draw() {
                System.out.println("绘制矩形…………长:"+this.getLength()+" 宽:"+this.getWide());
            }

// 绘制矩形
            public void draw(Rectangle rectangle) {
                 if (this.length > 0 && this.wide > 0) {
                        this.setLength(length);
                        this.setWide(wide);
                        System.out.println("成功绘制矩形!");
                } else {
                        System.out.println("绘制矩形条件不符合!");
                }
            }

// 计算周长
        public double getPerimter() {
            return 2 * (this.length + this.wide);
        }

// 计算面积
          public double getArea() {
                return this.wide * this.length;
            }

// 重写toString方法
        public String toString() {
            return "矩形的周长: " + this.getPerimter() + "\n矩形的面积: " + this.getArea()
                    + "\n矩形的对角线:" + this.diagonal();
         }

        public double getLength() {
            return length;
         }

        public void setLength(double length) {
            this.length = length;
        }

        public double getWide() {
            return wide;
        }

        public void setWide(double wide) {
            this.wide = wide;
        }

  }

 

package com.syq.test;

import java.util.Iterator;

public class TestShape {
    public static void main(String[] args) {
        Shape[] shapes = new Shape[3];

        shapes[0] = new Circle(1);
        shapes[1] = new Rectangle(1, 1);
        shapes[2] = new Triangle(1, 2, 1);

        for (int i = 0; i < shapes.length; i++) {

                 // 到这步已经可以实现向上转型:父类 父类引用变量 = 子类对象
                Shape shape = shapes[i];
                shape.draw();
                System.out.println("面积:" + shape.getArea());
                System.out.println("周长:" + shape.getPerimter());

                //System.out.println( shape.toString );
          }
    }
}    

-------------------------------------------------------------------------------

在测试类中的for循环里面(红色字体),怎么才能调用到子类的方法呢?比如调用矩形Rectangle类中的diagonal()方法。麻烦大神帮我想想指点思路。(我的思路是:想下转型前不都需要实现向上转型,那后面)在线等。


举报
Secret
发帖于6年前 3回/497阅
顶部