实验内容

(一)抽象类的使用

设计一个类层次,定义一个抽象类--形状,其中包括有求形状的面积的抽象方法。 继承该抽象类定义三角型、矩形、圆。 分别创建一个三角形、矩形、圆存对象,将各类图形的面积输出。

注:三角形面积s=sqrt(p(p-a)(p-b)*(p-c)) 其中,a,b,c为三条边,p=(a+b+c)/2

2.编程技巧

(1)    抽象类定义的方法在具体类要实现;
(2)    使用抽象类的引用变量可引用子类的对象;
(3) 通过父类引用子类对象,通过该引用访问对象方法时实际用的是子类的方法。可将所有对象存入到父类定义的数组中。

抽象类:

package work;

public abstract class Shape {

    public abstract double getArea();
    public abstract void print();
}

三角形:

package work;

public class sanjiao extends Shape{

    private double side1;
    private double side2;
    private double side3;
     double sum;
    public sanjiao(double s1,double s2,double s3) {
        side1=s1;
        side2=s2;
        side3=s3;
    }
    @Override
    public double getArea() {
        sum=side1+side2+side3;
        return Math.sqrt(sum*(sum-side1)*(sum-side2)*(sum-side3));
    }
    public double getSide1() {
        return side1;
    }
    public void setSide1(double side1) {
        this.side1 = side1;
    }
    public double getSide2() {
        return side2;
    }
    public void setSide2(double side2) {
        this.side2 = side2;
    }
    public double getSide3() {
        return side3;
    }
    public void setSide3(double side3) {
        this.side3 = side3;
    }
    public void print() {
        System.out.println(this.getArea());
    }

}

矩形:

package work;

public class Rectangle extends Shape{

    private int x;
    private int y;
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    public Rectangle(int m,int n) {
        x=m;
        y=n;
    }
    public double getArea() {
        return 2*x+2*y;
    }
    public void print() {
        System.out.println(this.getArea());
    }
}

圆:

package work;

public class Circle extends Shape{
    private int radius;

    public int getRadius() {
        return radius;
    }

    public void setRadius(int radius) {
        this.radius = radius;
    }

    public Circle(int r) {
        radius=r;
    }
    public double getArea() {
        return Math.PI*Math.pow(radius, 2);
    }
    public void print() {
        System.out.println(this.getArea());
    }
}

测试类:

package work;

public class Test {

    public static void main(String[] args) {
        Shape sj=new sanjiao(1,2,3);
        Shape sj1=new Rectangle(1,2);
        Shape sj2=new Circle(2);
        //sj.getArea();
        sj.print();
        //sj1.getArea();
        sj1.print();
        //sj2.getArea();
        sj2.print();
    }

}

运行截图:

(二)使用接口技术

1定义接口Shape,其中包括一个方法size(),设计“直线”、“圆”、类实现Shape接口。分别创建一个“直线”、“圆”对象,将各类图形的大小输出。

编程技巧

(1) 接口中定义的方法在实现接口的具体类中要重写实现;

(2) 利用接口类型的变量可引用实现该接口的类创建的对象。

接口类:

package jiekou;

public interface  Shape {

    public double size();
    public void print();
}

直线:

package jiekou;

public class line implements Shape{

    private double x1;
    private double y1;
    private double x2;
    private double y2;

    public double getX1() {
        return x1;
    }
    public void setX1(double x1) {
        this.x1 = x1;
    }
    public double getY1() {
        return y1;
    }
    public void setY1(double y1) {
        this.y1 = y1;
    }
    public double getX2() {
        return x2;
    }
    public void setX2(double x2) {
        this.x2 = x2;
    }
    public double getY2() {
        return y2;
    }
    public void setY2(double y2) {
        this.y2 = y2;
    }

    public line(double x1,double y1,double x2,double y2) {
        this.x1=x1;
        this.y1=y1;
        this.x2=x2;
        this.y2=y2;
    }

    public double size() {
        return Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
    }
    public void print() {
        System.out.println("直线的大小为:"+this.size());
    }

}

圆:

package jiekou;

public class Circle implements Shape{

    private double radius;

    public double getRadius() {
        return radius;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }

    public Circle (double r) {
        radius=r;
    }
    public double size() {
        return Math.PI*Math.pow(radius, 2);
    }
    public double length() {
        return 2*Math.PI*radius;
    }

    public void print() {
        System.out.println("圆的面积为:"+this.size());
        System.out.println("圆的周长为:"+this.length());
    }
}

测试类:

package jiekou;

public class Test {

    public static void main(String[] args) {
        Shape s=new line(10,12,20,12);
        s.print();
        Shape s1=new Circle(4);
        s1.print();
    }
}

运行截图:

学习总结:

1、equals方法:

(1)equals()是Object中的方法,作用在于检测一个对象是否等于另一个对象。

(2)在Object类中equals()方法是判断两个对象是否有相同的引用 ,即是否是相同的对象。

(3)String重写equals()方法,String的equals()方法用途比较两个字符对象的字符序列是否相同

2、

定义包含一个抽象方法的类抽象方法和全局变量的集合
组成构造方法、抽象方法、普通方法、常量、变量常量、抽象方法
使用子类继承抽象类(extends)子类实现接口(implements)
关系抽象类可以实现多个接口接口不能继承抽象类,但允许继承多个接口
常见设计模式模板设计工厂设计,代理设计
局限抽象类有单继承的局限接口没有单继承的局限
实际作为一个模板是作为一个标准或不是一种能力
对象都通过对象的多态性产生实例化对象都通过对象的多态性产生实例化对象
选择如果抽象类和接口都可使用的话,优先使用接口,因为避免单继承的局限如果抽象类和接口都可使用的话,优先使用接口,因为避免单继承的局限
特殊一个抽象类中可以包含多个接口,一个接口中可以包含多个抽象类一个抽象类中可以包含多个接口,一个接口中可以包含多个抽象类

3、为抽象实例化

abstract class A{                                              //定义抽象类A
         public abstract void print();                     //定义抽象方法print()
}
class B extends A{                                           //子类通过继承抽象类
         public void print(){
              System.out.println("Hello World!!!");
      }
}
public class AbstractCaseDemo1{
   public static void main(String[] args){
     A a=newB();                                                  //通过子类为抽象类实例化
      a.print();                                                       //调用的方法是被子类覆写过的方法
     }
}

4、为接口实例化

interface A{                                                        //定义接口A
          public abstract void print();                      //定义抽象方法print()
}
class B implements A{                                       //子类实现接口
         public void print(){
               System.out.println("Hello World!!!");
     }
}
public class InterfaceCaseDemo1{
        public static void main(String[] args){
             A a=new B();                                          //通过子类为接口实例化
               a.print();
        }
}

5、toString方法

(1)toString()方法方法的用途就是为了方便操作,所以在文件操作里面可用可不用

(2)若希望将StringBuffer在屏幕上显示出来, 则必须首先调用toString方法把它变成字符串常量, 因为PrintStream的方法println()不接受StringBuffer类型的参数.

02-13 09:25