javaOOP面向对象 基础测试:一定要按照步骤编写
(一)在base包中
编写动物(Animal)接口,定义抽象方法
eat(),sleep(),show()
package base;
public interface Animal
{
public void eat();
public void sleep();
public void show();
}
定义一个抽象类 哺乳动物 Mammal,实现Animal接口(但是暂不实现它的三个抽象方法),在这个抽象类中增加milk吃奶的抽象方法
package base;
public abstract class Mammal implements Animal
{
public abstract void milk();
}
定义一个抽象类 爬行动物 Reptile ,实现Animal接口(但是暂不实现它的三个抽象方法),在这个抽象类中增加crawl 爬行的抽象方法。
package base;
public abstract class Reptile implements Animal
{
public abstract void crawl();
}
(二)在utility包中
定义 Person,Monkey,Cat,Dog,继承Mammal,实现其所有方法,每个类中定义两个属性,提供两个构造函数,提供打印输出的方法show(),输出动物的属性;
Person
package utility;
import base.Mammal;
public class Person extends Mammal
{
int age;
int height;
public Person()
{
}
public Person(int age,int height)
{
this.age=age;
this.height=height;
}
public void eat()
{
System.out.println("Person eat");
}
public void sleep()
{
System.out.println("Person sleep");
}
public void show()
{
System.out.println("i am Person"+ " AND "+ "im "+ age + "years old"+ " AND im " + height +"tall" );
}
public void milk()
{
System.out.println("Person eat milks");
}
}
Monkey
package utility;
import base.Mammal;
public class Monkey extends Mammal
{
int age;
int height;
public Monkey()
{
}
public Monkey(int age,int height)
{
this.age=age;
this.height=height;
}
public void eat()
{
System.out.println("Monkey eat");
}
public void sleep()
{
System.out.println("Monkey sleep");
}
public void show()
{
System.out.println("i am Monkey"+ " AND "+ "im "+ age + "years old"+ " AND im " + height +"tall" );
}
public void milk()
{
System.out.println("Monkey eat milks");
}
}
Cat
package utility;
import base.Mammal;
public class Cat extends Mammal
{
int age;
int height;
public Cat()
{
}
public Cat(int age,int height)
{
this.age=age;
this.height=height;
}
public void eat()
{
System.out.println("Cat eat");
}
public void sleep()
{
System.out.println("Cat sleep");
}
public void show()
{
System.out.println("i am Cat"+ " AND "+ "im "+ age + "years old"+ " AND im " + height +"tall" );
}
public void milk()
{
System.out.println("Cat eat milks");
}
}
Dog
package utility;
import base.Mammal;
public class Dog extends Mammal
{
int age;
int height;
public Dog()
{
}
public Dog(int age,int height)
{
this.age=age;
this.height=height;
}
public void eat()
{
System.out.println("Dog eat");
}
public void sleep()
{
System.out.println("Dog sleep");
}
public void show()
{
System.out.println("i am Dog"+ " AND "+ "im "+ age + "years old"+ " AND im " + height +"tall" );
}
public void milk()
{
System.out.println("Dog eat milks");
}
}
定义 Snake,Crocodile,继承Reptile,实现其所有方法,每个类中定义两个属性,提供两个构造函数。提供打印输出的方法show(),输出动物的属性。
Snake
package utility;
import base.Reptile;
public class Snake extends Reptile
{
int age;
int height;
public Snake()
{
}
public Snake(int age,int height)
{
this.age=age;
this.height=height;
}
public void eat()
{
System.out.println("Snake eat");
}
public void sleep()
{
System.out.println("Snake sleep");
}
public void show()
{
System.out.println("i am Snake"+ " AND "+ "im "+ age + "years old"+ " AND im " + height +"tall" );
}
public void crawl()
{
System.out.println("Snake crwal");
}
}
Crocodile
package utility;
import base.Reptile;
public class Crocodile extends Reptile
{
int age;
int height;
public Crocodile()
{
}
public Crocodile(int age,int height)
{
this.age=age;
this.height=height;
}
public void eat()
{
System.out.println("Crocodile eat");
}
public void sleep()
{
System.out.println("Crocodile sleep");
}
public void show()
{
System.out.println("i am Crocodile"+ " AND "+ "im "+ age + "years old"+ " AND im " + height +"tall" );
}
public void crawl()
{
System.out.println("Crocodile crwal");
}
}
(三)在javastudy包中,定义一个类Test1,
定义一个长度为6的Animal数组,分别存放以上的每一种动物,循环取出每个动物,调用其方法。要求所有方法都要被调用到【eat,sleep,show,milk,crawl】,其中要用到instanceof,把代码写到精简。
阅读以下以下文档,了解instanceof 关键字的用法,在循环中进行类型转换,调用Mammal和Reptile特有的方法。
instanceof的用法请参照下面的文档【参考文档:(一定要看)】
http://rodney.cnblogs.com/archive/2005/08/18/instanceof.html
http://blog.csdn.net/jal198958/article/details/8251465
主函数写法
package javastudy;
import base.Animal;
import base.Mammal;
import base.Reptile;
import utility.Cat;
import utility.Crocodile;
import utility.Dog;
import utility.Monkey;
import utility.Person;
import utility.Snake;
public class Test1
{
public static void main(String[] args)
{
//定义数组并装入装入6个对象
Animal a[]=new Animal[6];
a[0]=new Person(1,1);
a[1]=new Monkey(2,2);
a[2]=new Cat(3,3);
a[3]=new Dog(4,4);
a[4]=new Snake(5,5);
a[5]=new Crocodile(6,6);
//循环取出每个动物并调用其方法,所有方法都eat,sleep,show,milk
for(int i=0;i<6;i++)
{
a[i].eat();
a[i].sleep();
a[i].show();
if(a[i] instanceof Mammal)
{
Mammal b=(Mammal)a[i];
b.milk();
}else
{
Reptile b=(Reptile)a[i];
b.crawl();
}
}
}
}
最后总结提示一下课程中没有讲到的内容
Animal作为一个接口,两个抽象类Mammal和Reptile继承于Animal,
然后4个类Person,Monkey,Cat,Dog继承与Mammal
2个类继承于Reptile,分别是Snake,Crocodile
第一点Animal a[]=new Animal[6],所有的a[]都是Animal,也就是最大的父类,我们知道抽象类是不能实例化的,但是为什么能够这么写?
那么很明显,不能实例化指的是不能作为构造函数
也就是不能这么写:
第二点拿Mammal来说,
我们回到instanceof的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。
我们知道子类有6个,父类有2个,父类的父类有1个,最后一题要求强制类型转换,我们特定的方法是定义在父类里,如果Dog只是Dog的实例,而不是Mammal的实例也不是Animal的实例,那将是一件非常痛苦的事情,这意味着我们要写6个if,如果a instanceof Mammal,我们只要写两个if,那我们的代码将会非常好看,接下来我们做个试验,看看下面三个的输出结果
System.out.println(a instanceof Dog);
System.out.println(a instanceof Mammal);
System.out.println(a instanceof Animal);
完整程序如下
package javastudy;
import base.Animal;
import base.Mammal;
import utility.Dog;
public class TestIt
{
public static void main(String[] args)
{
Animal a=new Dog();
System.out.println(a instanceof Dog);
System.out.println(a instanceof Mammal);
System.out.println(a instanceof Animal);
}
}
结果如下
true
true
true
这两句话的输出结果都是true,也就是说Dog即是Dog实例化的,也是他的父类,和父类的父类的实例化。
这样我们的变成就很好解决了