UML 图 —— 类之间的关系
UML-Unified Module Language
统一建模语言,可以很方便的用于描述类的属性,方法,以及类和类之间的关系
解释UML-类图
解释UML-接口图
解释UML-继承关系
带箭头的实线,表示 Spider,Cat, Fish都继承于Animal这个父类.
解释UML-实现关系
表示 Fish实现了 Pet这个接口
1. 创建Animal类,它是所有动物的抽象父类。2. 声明一个受保护的整数类型属性legs,它记录动物的腿的数目。3. 定义一个受保护的构造器,用来初始化legs属性。4. 声明抽象方法eat。5. 声明具体方法walk来打印动物是如何行走的(包括腿的数目)。
package animal;
public abstract class animal {
protected int legs;
String name;
protected animal() {
System.out.println("创建一个无腿的动物");
}
protected animal(int legs) {
this.legs = legs;
System.out.println("创建了一个有" + legs+"的动物");
}
public abstract void eat();
public void walk() {
System.out.println("该动物是用"+this.legs+"行走的");
}
public void what_is_playing(Pet A)
{
A.play();
}
}
1. Spider继承Animal类。2. 定义默认构造器,它调用父类构造器来指明所有蜘蛛都是8条腿。3. 实现eat方法
package Animals;
public class Spider extends Animal
{
/*构造函数*/
protected Spider()
{
super(8);
System.out.println("每个蜘蛛都是8条腿");
}
/*重写父类方法*/
@Override
public void eat()
{
System.out.println("蜘蛛正在吃东西");
}
}
根据UML类创建pet(宠物)接口1. 提供getName() 返回该宠物的名字2. 提供setName(String name) 为该宠物命名3. 提供 play()方法
package Animals;
public interface Pet
{
public String getName();
public void setName(String name);
public void play();
}
1. 该类必须包含String属性来存宠物的名字。2. 定义一个构造器,它使用String参数指定猫的名字;该构造器必须调用超类构造器来指明所有的猫都是四条腿。3. 另定义一个无参的构造器。该构造器调用前一个构造器(用this关键字)并传递一个空字符串作为参数4. 实现Pet接口方法。5. 实现eat方法。
package Animals;
public class Cat extends Animal implements Pet
{
private String name;
/*构造函数*/
public Cat()
{
this("");
System.out.println("该猫不起名字");
}
public Cat(String name)
{
super(4);
this.name = name;
}
/*重写父类和接口的方法*/
@Override
public String getName()
{
return this.name;
}
@Override
public void setName(String name)
{
System.out.println("You are to change your cat "+this.name+" to "+name);
this.name = name;
}
@Override
public void play()
{
System.out.println("Cat:"+this.name+" is playing with you");
}
@Override
public void eat()
{
System.out.println("Cat:"+this.name+" is eating");
}
}
1. 创建Fish类,它继承Animal类2. 重写Animal的walk方法以表明鱼不能走且没有腿。3. 实现Pet接口4. 无参构造方法5. 提供一个private 的name属性
package Animals;
public class Fish extends Animal implements Pet
{
private String name;
/*构造函数*/
public Fish()
{
;
}
/*改写父类和接口方法*/
@Override
public String getName()
{
return this.name;
}
@Override
public void setName(String name)
{
System.out.println("You are to change your fish "+this.name+" to "+name);
this.name = name;
}
@Override
public void play()
{
System.out.println("Fish:"+this.name+" is playing with you");
}
@Override
public void eat()
{
System.out.println("Fish:"+this.name+" is eating");
}
public void walk()
{
System.out.println("鱼没有腿,不能走路");
}
}
/*--------------------------test.java---------------------这是个测试样例哦*/
package Animals;
public class test
{ //测试Animal类
public static void main(String[] args)
{
/*测试蜘蛛*/
Spider S = new Spider();
S.eat();
S.walk();
System.out.println(S.legs);
/*测试猫*/
Cat T1 = new Cat(); //没名字
Cat T2 = new Cat("coffee");
//T2.name; //私有成员无法访问
System.out.println(T1.getName()); //输出一行空白
System.out.println(T2.getName());
T1.setName("orange"); //修改没名字的猫
System.out.println(T1.getName());
T1.eat();
T2.play();
T1.walk(); //猫走路
/*测试鱼*/
Fish F = new Fish();
System.out.println(F.getName());
F.setName("gold");
System.out.println(F.getName());
F.play();
F.walk();
F.eat();
/*采用匿名类测试多态*/
Animal A =
new
Animal()
{
@Override
public
void
eat()
{
;
}
};
A.what_is_playing(F);
//调用fish的play
A.what_is_playing(T1);
//调用cat的play
//A.what_is_playing(S); //没有集成pet接口的spider无法使用
}
}