赵纾寻  
a special world

实验四 类的继承

实验目的

理解抽象类与接口的使用;
了解包的作用,掌握包的设计方法。

实验要求

掌握使用抽象类的方法。
掌握使用系统接口的技术和创建自定义接口的方法。
了解 Java 系统包的结构。
掌握创建自定义包的方法。

实验内容

(一)抽象类的使用

设计一个类层次,定义一个抽象类--形状,其中包括有求形状的面积的抽象方法。 继承该抽象类定义三角型、矩形、圆。 分别创建一个三角形、矩形、圆存对象,将各类图形的面积输出。
注:三角形面积s=sqrt(p(p-a)(p-b)*(p-c)) 其中,a,b,c为三条边,p=(a+b+c)/2
2.编程技巧

(1) 抽象类定义的方法在具体类要实现;

(2) 使用抽象类的引用变量可引用子类的对象;

(3) 通过父类引用子类对象,通过该引用访问对象方法时实际用的是子类的方法。可将所有对象存入到父类定义的数组中。

(二)使用接口技术

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

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

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

1.实验源码:

package di;

abstract class Shape {
	//定义a,b,c属性
	private double a;
	private double b;
	private double c;
	//取得或修改a,b,c的属性内容
	public double getA() {
		return a;
	}
	public void setA(double a) {
		this.a = a;
	}
	public double getB() {
		return b;
	}
	public void setB(double b) {
		this.b = b;
	}
	public double getC() {
		return c;
	}
	public void setC(double c) {
		this.c = c;
	}
	//生成一个无参构造
	public Shape() {
		
	}
	//生成三种不同的构造方法
	public Shape(double a) {
		this.a=a;
	}
	public Shape(double a,double b) {
		this.a =a;
		this.b=b;
	}
	public Shape(double a,double b,double c) {
		this.a =a;
		this.b=b;
		this.c=c;
	}
	//生成一个抽象方法,area()由子类决定
	public abstract void area();

}
package di;

public class Traingle extends Shape {
    //调用父类构造方法
	public Traingle(double a,double b, double c) {
		super(a,b,c);
	}
	//覆写父类抽象方法
	public void area() {
		double p=(this.getA()+this.getB()+this.getC()/2);
        double s=Math.sqrt(p*(p-this.getA())*(p-this.getB())*(p-this.getC()));		
	    System.out.println("三角形面积为:"+s);
	}
}

package di;

public class Circle extends Shape {

	public Circle(double a) {
		super(a);
	}
	
	public void area() {
		double s=Math.pow(this.getA(), 2)*Math.PI;
		System.out.println("圆的面积为:"+s);

	}

}
package di;

public class Rectangle extends Shape {

	public Rectangle(double a,double b) {
		super(a,b);
	}
	public void area() {
		double s=this.getA()*this.getB();
		System.out.println("矩形的面积为:"+s);
	}

}
package di;

public class Test {
	public static void main(String args[]) {
	
		Shape shape1=new Traingle(1,2,3);
		shape1.area();
		
		Shape shape2=new Circle(1);
		shape2.area();
		
		Shape shape3=new Rectangle(1,2);
		shape3.area();
	}

}

实验结果:

2.实验源码:

package di1;

public interface Shape {
    //不同图形的尺寸    	
      public void size();
}
  //定义子类Line 
  class Line implements Shape{
  //覆写父类size()方法
	  public void size() {		  
		  System.out.println("直线周长为:"+10);
	  }	  
  
}
package di1;

class Circle implements Shape{
	  // 定义半径a属性
	  private double a;
	  //获取修改a属性内容
	  public double getA() {
		return a;
	}

	public void setA(double a) {
		this.a = a;
	}
    //带一个参数的构造方法
    public Circle (double a) {
         this.a=a; 
        }
    //计算面积的方法
    public double getArea() {
  	     return Math.pow(a, 2)*Math.PI;
  }
    //覆写父类size()方法
    public void size(){
         System.out.println("圆的面积为:"+this.getArea());  
	  }
}
package di1;

public class Test {

	public static void main(String[] args) {
		Shape shape=new Line();
        shape.size();
        Shape shape1=new Circle(1);
        shape1.size();
	}

}

实验结果:

实验过程:

第一题为抽象类,在父类Shape中定义子类需要用到的共同属性a,b,c,并生成三种不同的构造方法供子类调用,再生成一个由子类决定的抽象方法area()。子类将继承父类的属性,通过调用不同的构造方法及覆写父类抽象方法area()。第二题为接口,在父类中生成一个接口的方法size(),再定义不同的子类。子类通过覆写size()方法再输出。

课程总结:

抽象类(模板):父类相当于定义了一个模板,在主办法中调用的为普通/构造/抽象方法,子类只需要实现父类的抽象方法。
接口(标准):接口规定出一个标准,对具体的下面的类内容不关心
注意:

①为抽象类与接口实例化:A a=new B()。
②一个类不要去继承已实现好的类,要抽象类与接口二选一。若两者都可以使用,为避免单继承局限,要优先使用接口。
③接口不可使用构造、普通、抽象方法及变量。
④抽象类可实现多个接口,接口不能继承抽象类。
⑤两者都通过对象的多态性产生实例化对象。

学习总结:

上课的时候感觉自己懂了一点点,回来做题的时候,又出现了种种问题。原来上课听老师讲的只听进去了表面,想要真的懂,还是需要课后的多多练习。老师给出的题目都是典型的,我还是算法太弱了,没有一个大体思维。

posted on 2019-10-11 21:35  赵纾寻  阅读(214)  评论(1编辑  收藏  举报