Java学习第13天

多态练习:

  • 一、设计一个绘图系统:支持画矩形,圆,等边三角形。
    功能:计算周长,面积,画图
package org.mobiletrain;

import java.awt.Color;
import java.awt.Graphics;

/**
 * 图形(抽象类)
 * @author apple
 *
 */
public abstract class Shape{

    protected Color color;
    protected int centerX;
    protected int centerY;
    
    /**
     * 构造器
     * @param centerX 中心点的横坐标
     * @param centerY 中心点的纵坐标
     * @param color   画笔颜色
     */
    public Shape(int centerX,int centerY,Color color) {
        this.centerX = centerX;
        this.centerY = centerY;
        this.color = color;
    }

    /**
     * 计算周长
     * @return 图形的周长
     */
    public abstract double perimeter();
    
    /**
     * 计算面积
     * @return 图形的面积
     */
    public abstract double area();
    
    /**
     * 绘图
     * @param g 画笔(绘图的上下文环境)
     */
    public  void draw(Graphics g){
        g.setColor(color);
        g.drawString(String.format("周长:%.2f", perimeter()), centerX, centerY);
        g.drawString(String.format("面积:%.2f", area()), centerX, centerY + 20);
    }
    
    
}
package org.mobiletrain;

import java.awt.Color;
import java.awt.Graphics;

/**
 * 矩形
 * @author apple
 *
 */
public class Rectangle extends Shape{

    protected int height;
    protected int width;
    
    public Rectangle(int centerX,int centerY,Color color,int width,int height) {
        super(centerX, centerY, color);
        this.width = width;
        this.height = height;
    }

    @Override
    public double perimeter() {
        
        return (height + width) * 2;
    }

    @Override
    public double area() {
        
        return height * width;
    }


    @Override
    public void draw(Graphics g) {
        super.draw(g);
    g.drawRect(centerX  - width / 2 - 40, centerY - height / 2 - 40, width, height);        
    }
}
package org.mobiletrain;

import java.awt.Color;
import java.awt.Graphics;

/**
 * 圆
 */
public class Circle extends Shape{

    private int radius;
    
    public Circle(int centerX,int centerY,Color color,int radius) {
        super(centerX, centerY, color);
        this.radius = radius;
    }

    @Override
    public double perimeter() {

        return 2 * Math.PI * radius;
    }

    @Override
    public double area() {

        return Math.PI * radius * radius;
    }

    @Override
    public void draw(Graphics g) {
        super.draw(g);
        g.drawOval(centerX - radius, centerY - radius, 2 * radius, 2 * radius);
    
    }   
}
package org.mobiletrain;

import java.awt.Color;
import java.awt.Graphics;

public class Triangle extends Shape{

    private int length;
    
    public Triangle(int centerX,int centerY,Color color,int length) {
        super(centerX, centerY, color);
        this.length = length;
    }

    @Override
    public double perimeter() {
        
        return length * 3;
    }

    @Override
    public double area() {
        
        return Math.sqrt(perimeter() / 2 * (perimeter() - length) *
                             (perimeter() - length) * (perimeter() - length));
    }

    @Override
    public void draw(Graphics g) {
        super.draw(g);
        int x1 = centerX;
        int y1 = (int) (centerY - length / 2 / Math.cos(Math.PI / 6));
        int x2 = centerX - length / 2;
        int y2 = (int) (centerY + Math.tan(Math.PI / 6) * length / 2);
        int x3 = centerX + length / 2;
        int y3 = y2;
        g.setColor(color);
        g.drawLine(x1, y1, x2, y2);
        g.drawLine(x2, y2, x3, y3);
        g.drawLine(x3, y3, x1, y1);
        
    }

}
package org.mobiletrain.ui;

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import org.mobiletrain.Circle;
import org.mobiletrain.Rectangle;
import org.mobiletrain.Triangle;;

@SuppressWarnings("serial")
public class ShapeFrame extends JFrame {

    
    private Circle circle = new Circle(600, 300, Color.green, 100);
    private Rectangle rectangle = new Rectangle(300, 450, Color.red, 300, 200);
    private Triangle triangle = new Triangle(300, 200, Color.blue, 200);
    
    /**
     * 构造器,设置窗口
     */
    public ShapeFrame(){
        this.setTitle("我的绘图应用");
        this.setSize(800, 600);
        //窗口大小是否可以改变
        this.setResizable(false);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        
    }

    //系统自动调用的方法,对窗口进行渲染
    @Override
    public void paint(Graphics g) {
        super.paint(g);//相当于先画出了窗口,如果删除,窗口会出现残影
        circle.draw(g);
        rectangle.draw(g);
        triangle.draw(g);
    }
    
    public static void main(String[] args) {
        new ShapeFrame().setVisible(true);
    }
}
  • 二、 租车系统
package org.mobiletrain;

/**
 * 车类(抽象类)
 * @author apple
 *
 */
public abstract class Vehicle {

    protected String brand;//车的品牌
    
    public Vehicle(String brand){
        this.brand = brand;
    }
    
    /**
     * 获得车的品牌
     * @return 品牌
     */
    public String getBrand() {
        return brand;
    }
    
    //模板方法模式(GoF设计模式 - 23种)
    /**
     * 获得日租金(抽象方法)
     * @return 日租金
     */
    public abstract int rentPerDay();
    
    /**
     * 计算总租金
     * @param days 天数
     * @return 总租金
     */
    public int calcRent(int days){
        return days * rentPerDay();
    }
}
package org.mobiletrain;

/**
 * 汽车类
 * @author apple
 *
 */
public class Car extends Vehicle {

    private boolean nomal;//判断是普通车还是商务车
    
    /**
     * 构造器
     * @param brand 品牌
     * @param normal 判断是普通车还是商务车
     */
    public Car(String brand,boolean normal) {
        super(brand);   
        this.nomal = normal;
    }

    @Override
    public int rentPerDay() {
        return nomal ? 400 : 600;
    }
}
package org.mobiletrain;

/**
 * 卡车类
 * @author apple
 *
 */
public class Truck extends Vehicle {

    private double load;//载重
    
    /**
     * 构造器
     * @param brand 品牌
     * @param load 载重
     */
    public Truck(String brand,double load) {
        super(brand);
        this.load = load;
    }

    @Override
    public int rentPerDay() {
        if (load < 10) {
            return 1200;
        }
        else if (load < 20) {
            return 2000;
        }
        else {
            return 2500;
        }
    }

}

package org.mobiletrain.ui;

import org.mobiletrain.Car;
import org.mobiletrain.Truck;
import org.mobiletrain.Vehicle;

public class CarRentTest {

    public static void main(String[] args) {
        Vehicle v1 = new Car("奔驰", false);
        System.out.println(v1.calcRent(5));
        
        Vehicle v2 = new Truck("东风", 8);
        System.out.println(v2.calcRent(1));
        
    }
}
  • 三、国际象棋窗口
package org.mobiletrain.ui;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class Chess extends JFrame{

    private Image knightImage;//骑士
    private Image rookImage;//城堡

    public Chess() {
        this.setTitle("国际象棋");
        this.setSize(800, 800);
        this.setResizable(false);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        try {
            knightImage = ImageIO.read(this.getClass().getClassLoader().getResource("22.png"));
            rookImage = ImageIO.read(this.getClass().getClassLoader().getResource("21.png"));
        } 
        catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void paint(Graphics g) {     
        super.paint(g);
        g.setColor(Color.gray);
        g.fillRect(0, 0, 800, 800);
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                g.setColor((i + j) % 2 == 0 ? new Color(210, 220, 162) : new Color(179, 56, 89));
                g.fillRect(40 + j * 90, 60 + i * 90, 90, 90);
            } 
        }
        g.drawImage(knightImage, 130, 60, 90, 90,null);
        g.drawImage(rookImage, 40, 60, 90, 90,null);
    }

}
package org.mobiletrain;

import org.mobiletrain.ui.Chess;

public class ChessTest{

    public static void main(String[] args) {
        new Chess().setVisible(true);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容