抽象类与接口的异同
抽象类和接口的相同点:
1.都不能被实例化
2.接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能被实例化
不同点:
1.接口只有定义,其方法不能再接口中实现,只有实现接口的类才能实现接口中定义的方法,而抽象类的方法可以再抽象类中被实现。
2.接口需要用implements实现,抽象类只能被继承(extends)。
3.设计理念不同,接口是"has - a ",抽象类是"is -a "
4.接口中定义的成员变量默认修饰符为public static final(静态不能被修改),而且必须 给其赋初值。抽象类可以有自己的数据成员变量,也可以有非抽象的成员变量,而且抽象类中的成员变量默认为default(本包可见)。抽象类中的方法前面有abstract修饰,不能用private、static、synchronize、native修饰,同时方法必须以分号结尾,不带花括号。
抽象类程序题
题目
在画图软件中,可以画出不同大小或颜色的圆形、矩形等几何图形。几何图形之间有许多共同的特征,如它们可以是用某种颜色画出来的,可以是填充的或者不填充的。此外还有些不同的特征,比如,圆形都有半径,可以根据半径计算圆形的面积和周长,矩形都有宽和高,可以根据宽高来计算矩形的面积和周长。
1、编写Java程序。
(1)使用继承机制,分别设计实现抽象基类图形类,派生类圆形类、正方形类、长方形类,要求:
①抽象图形类中有属性画笔颜色、图形是否填充,有方法获取图形面积、获取图形周长等;
②使用构造方法为其成员属性赋初值;
③在每个派生类中都重写toString()方法,返回所有属性的信息;
④根据文字描述合理设计类的其他成员属性和方法。
(2)设计实现画板类,要求:
①画一个红色、无填充、长和宽分别为10.0与5.0的长方形;
②画一个绿色、有填充、半径为3.0的圆形;
③画一个黄色、无填充、边长为4.0的正方形;
④分别求三个对象的面积和周长,并将每个对象的所有属性信息打印到控制台。
程序代码
图形类
package Drawing;
/**
*
* @author 你的名字
* <p>Title:Gragh<p>
* <p>Description:定义图形类的功能和变量<p>
*/
public abstract class Gragh{
/**
* 定义变量
*/
protected double side1;//边1
protected double side2;//边2
protected double radius;//半径
protected boolean isFill;//填充
protected String PencilColor;//画笔颜色
/**
* 定义方法
* @return
*/
public abstract String fill();//是否填充
public abstract double area();//面积
public abstract double girth();//周长
public abstract String toString();
public double getSide() {
return side1;
}
public void setSide(double d) {
this.side1 = d;
}
public double getLongside() {
return side2;
}
public void setLongside(double d) {
this.side2 = d;
}
public double getRadius() {
return radius;
}
public void setRadius(double d) {
this.radius = d;
}
public boolean isFill() {
return isFill;
}
public void setFill(boolean isFill) {
this.isFill = isFill;
}
public String getPencilColor() {
return PencilColor;
}
public void setPencilColor(String pencilColor) {
PencilColor = pencilColor;
}
}
正方形
package Drawing;
/**
*
* @author 你的名字
* <p>Title:Square<p>
* <p>Description:实现正方形继承图形类的功能<p>
*/
public class Square extends Gragh{
public Square(String PencilColor,boolean isFill,double side) {
this.PencilColor=PencilColor;
this.isFill=isFill;
this.side1=side;
}
@Override
public String fill() {
if (isFill==false) {
return "无填充、";
}else{
return "有填充、";
}
}
@Override
public double area() {
return getSide()*getSide();
}
@Override
public double girth() {
return 4*getSide();
}
public String toString(){
return "画一个"+getPencilColor()+"色、"+fill()+"边长为"+getSide()+",的正方形;"+"周长为"+girth()+"面积为"+area();
}
}
长方形
package Drawing;
/**
*
* @author 你的名字
* <p>Title:Rectangle<p>
* <p>Description:实现长方形继承图形类的功能<p>
*/
public class Rectangle extends Gragh{
public Rectangle(String PencilColor,boolean isFill,double side1,double side2) {
this.PencilColor=PencilColor;
this.isFill=isFill;
this.side1=side1;
this.side2=side2;
}
@Override
public String fill() {
if (isFill==false) {
return "无填充、";
}else{
return "有填充、";
}
}
public void swap(double a[]){
double c=a[0];
a[0]=a[1];
a[1]=c;
}
@Override
public double area() {
return getSide()*getLongside();
}
@Override
public double girth() {
return 2*(getSide()+getLongside());
}
public String toString(){
/**
* 长方形有宽和长,为了能区分宽和长加入比较步骤来决定长宽
*/
double i=getSide();
double j=getLongside();
double temp;
if (getSide()>getLongside()) {
temp=i;
i=j;
j=temp;
}
return "画一个"+getPencilColor()+"色、"+fill()+"长"+j+"宽"+i+",的长方形;"+"周长为"+girth()+"面积为"+area();
}
}
圆形
package Drawing;
/**
*
* @author 你的名字
* <p>Title:Circle<p>
* <p>Description:实现圆形继承图形类的功能<p>
*/
public class Circle extends Gragh{
public Circle(String PencilColor,boolean isFill,double radius) {
this.PencilColor=PencilColor;
this.isFill=isFill;
this.radius=radius;
}
@Override
public String fill() {
if (isFill==false) {
return "无填充、";
}else{
return "有填充、";
}
}
@Override
public double area() {
return getRadius()*getRadius()*Math.PI;
}
@Override
public double girth() {
return 2*getRadius()*Math.PI;
}
public String toString(){
return "画一个"+getPencilColor()+"色、"+fill()+"半径为"+getRadius()+",的圆形;"+"周长为"+girth()+"面积为"+area();
}
}
测试类
```java
package Drawing;
/**
*
* @author 你的名字
* <p>Title:Test<p>
* <p>Description:<p>
*/
public class Test{
public static void main(String[] args){
Square s=new Square("黄", false, 5);
System.out.println(s.toString());
Rectangle r=new Rectangle("红", false, 10, 5);
System.out.println(r.toString());
Circle c=new Circle("绿", true, 3);
System.out.println(c.toString());
}
}
接口类程序题
题目
基于上题背景,设计实现以下程序:
(1)设计Comparable接口,接口中设计compareTo()方法,用来比较对象。此方法的返回值类型设计为int类型。此方法接收一个参数,参数类型为图形类。
(2)在图形类中实现compareTo()方法,用来比较两个图形的面积大小。
(3)在测试类中,创建图形类的数组,数组中存放多个圆形、正方形、长方形对象,使用compareTo()方法找出数组中面积最大的图形。
提示:比较对象时,可以将compareTo()方法的返回值设置为1、0、-1,来代表比较结果,当前对象大、两者相等或者当前对象小。再次提醒,此题涉及的代码全部展示在此题的题号下,与上一题相独立。
程序代码
修改后的图形类
package Drawing;
public abstract class Gragh implements Comparable{
/**
* 定义变量
*/
protected double side1;//边1
protected double side2;//边2
protected double radius;//半径
protected boolean isFill;//填充
protected String PencilColor;//画笔颜色
/**
* 定义方法
* @return
*/
public abstract String fill();//是否填充
public abstract double area();//面积
public abstract double girth();//周长
public abstract String toString();
public double getSide() {
return side1;
}
public void setSide(double d) {
this.side1 = d;
}
public double getLongside() {
return side2;
}
public void setLongside(double d) {
this.side2 = d;
}
public double getRadius() {
return radius;
}
public void setRadius(double d) {
this.radius = d;
}
public boolean isFill() {
return isFill;
}
public void setFill(boolean isFill) {
this.isFill = isFill;
}
public String getPencilColor() {
return PencilColor;
}
public void setPencilColor(String pencilColor) {
PencilColor = pencilColor;
}
/*
* 用于比较图形大小
* 1是大于
* 0是一样大
* -1是小于
*/
public int compareTo(Gragh gragh){
double i=gragh.area();
double j=area();
if(j>i){
return 1;
}
else if (j==i) {
return 0;
}
else{
return -1;
}
}
}
修改后的测试类
package Drawing;
/**
*
* @author 你的名字
* <p>Title:Test<p>
* <p>Description:<p>
*/
public class Test{
public static void main(String[] args){
Square s=new Square("黄", false, 5);
System.out.println(s.toString());
Rectangle r=new Rectangle("红", false, 10, 5);
System.out.println(r.toString());
Circle c=new Circle("绿", true, 3);
System.out.println(c.toString());
Gragh[] gragh=new Gragh[10];
for(int i=0;i<3;i++){
Circle c1=new Circle("绿", true, 3+i);
gragh[i]=c1;
}
for(int i=3;i<7;i++){
Square s1=new Square("黄", false, 5);
gragh[i]=s1;
}
for(int i=7;i<10;i++){
Rectangle r1=new Rectangle("红", false, 10+i, 5+i);
gragh[i]=r1;
}
System.out.println(CompareToMax(gragh));
}
public static Gragh CompareToMax(Gragh[] graghMax){
Gragh gragh=graghMax[0];
for(int i=0;i<graghMax.length;i++){
if(graghMax[i].compareTo(gragh)>0){
gragh=graghMax[i];
}
}
System.out.println("面积最大的是:");
return gragh;
}
}
主要测试的是compareTo()方法能否有用,不用太过在意数值。