面向对象及实例讲解
抽象 实例
需求
:3、设计三个类,分别如下:(知识点:抽象类及抽象方法)
3.1 设计Shape表示图形类,有面积属性area、周长属性per,颜色属性color,有两个构造方法(一个是默认的、一个是为颜色赋值的),还有3个抽象方法,分别是:getArea计算面积、getPer计算周长、showAll输出所有信息,还有一个求颜色的方法getColor。
3.2 设计 2个子类:
3.2.1 Rectangle表示矩形类,增加两个属性,Width表示长度、height表示宽度,重写getPer、getArea和showAll三个方法,另外又增加一个构造方法(一个是默认的、一个是为高度、宽度、颜色赋值的)。
3.2.2 Circle表示圆类,增加1个属性,radius表示半径,重写getPer、getArea和showAll三个方法,另外又增加两个构造方法(为半径、颜色赋值的)。
3.3 在main方法中,声明创建每个子类的对象,并调用2个子类的showAll方法。
Shape 图形 抽象类
public abstract class Shape {
protected double area;
protected double per;
protected String color;
public Shape(String color) {
this.color = color;
}
public Shape() {
}
public abstract double getArea();
public abstract double getPer() ;
public abstract String getColor();
public abstract void setColor(String color);
public abstract void showAll();
}
Rectangle矩形类
public class Rectangle extends Shape{
private double width;
private double height;
/**
* 重写获取周长方法
*/
@Override
public double getPer() {
return (width+height)*2;
}
public Rectangle(String color) {
super(color);
}
public Rectangle(String color, double width, double height) {
super(color);
this.width = width;
this.height = height;
}
/**
* 重写获取面积方法
*/
@Override
public double getArea() {
return width*height;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
@Override
public void showAll() {
// TODO Auto-generated method stub
System.out.println("颜色:"+getColor()+"色"+",周长:"+getPer()+",面积:"+getArea()+",宽:"+width+",高:"+height+".");
}
@Override
public String getColor() {
// TODO Auto-generated method stub
return this.color;
}
@Override
public void setColor(String color) {
// TODO Auto-generated method stub
this.color = color;
}
}
Circle 圆类
public class Circle extends Shape {
private double radius;
public Circle(String color) {
super(color);
}
public Circle(String color, double radius) {
super(color);
this.radius = radius;
}
@Override
public double getArea() {
// TODO Auto-generated method stub
return radius*2*Math.PI;
}
@Override
public double getPer() {
// TODO Auto-generated method stub
return radius*radius*Math.PI;
}
@Override
public void showAll() {
System.out.println("颜色:"+getColor()+"色"+",周长:"+getPer()+",面积:"+getArea()+",半径:"+radius+".");
}
@Override
public String getColor() {
return this.color;
}
@Override
public void setColor(String color) {
this.color = color;
}
}
Test测试类
public class Test {
public static void main(String[] args) {
Rectangle r = new Rectangle("红",53,64);
Circle c = new Circle("黑",3);
r.showAll();
c.showAll();
}
}
运行结果
通过抽象,把父类的方法交给子类去实现,但值得注意的是,构造方法是不能进行抽象的,但要注意,一个子类只能继承一个抽象类,不能继承多个
接口 实例
5、利用接口实现动态的创建对象[选做题]
5.1 创建4个类:
苹果
香蕉
葡萄
园丁
5.2 在三种水果的构造方法中打印一句话.
以苹果类为例
class apple
{
public apple()
{
System.out.println(“创建了一个苹果类的对象”);
}
}
5.3 要求从控制台输入一个字符串,根据字符串的值来判断创建三种水果中哪个类的对象
Fruit接口
public interface Fruit {
}
Apple类
public class Apple implements Fruit {
public Apple() {
System.out.println("创建一个苹果类");
}
}
Banana
public class Banana implements Fruit{
public Banana() {
// TODO Auto-generated constructor stub
System.out.println("创建了一个香蕉类");
}
}
Pear类
public class Pear implements Fruit {
public Pear() {
// TODO Auto-generated constructor stub
System.out.println("创建了一个梨类");
}
}
Gardener类
public class Gardener {
public Fruit create(String str) {
Fruit fruit;
switch (str) {
case "apple":
fruit =new Apple();
break;
case "pear":
fruit = new Pear();
break;
case "banana":
fruit = new Banana();
break;
default:
fruit = null;
System.err.println("没有这个类");
break;
}
return fruit;
}
}
Test测试类
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Gardener e = new Gardener();
Scanner sc = new Scanner(System.in);
System.out.println("输入水果");
String fruit = sc.next();
e.create(fruit);
}
}
运行结果