黑马程序员技术交流社区
标题:
关于抽象类的继承问题
[打印本页]
作者:
yan
时间:
2013-8-4 19:01
标题:
关于抽象类的继承问题
例:
abstract class Animal
{
String name;
String color;
public void sleep()
{
System.out.println(name+"打呼噜.....");
}
public abstract void eat();
}
class Dog extends Animal
{
public void eat()
{
System.out.println(name+"骨头.....");
}
public void lookHome()
{
System.out.println(name+"看家.....");
}
}
class Cat extends Animal
{
public void eat()
{
System.out.println(name+"鱼头.....");
}
public void catchMouse()
{
System.out.println(name+"抓老鼠.....");
}
}
class AbstractDemo1
{
public static void main(String[] args)
{
Cat c = new Cat();
c.name="kitty";
c.color="花猫";
c.eat();
c.catchMouse();
c.sleep();
Dog d = new Dog();
d.name="旺财";
d.color="黑色";
d.eat();
d.lookHome();
c.sleep();
}
}
抽象类里的方法子类里面具体化了,
就等于是子类的方法覆盖了抽象类里的方法,那么这个方法应该就相当于子类的个性
抽象类里面为什么抽象类里还要定义这个抽象的方法,
这样不想当于重复了吗?浪费空间,抽象不就是可有可无了吗?一直不能转过这个弯,希望能得到详细的回答
作者:
夜空闪亮
时间:
2013-8-5 00:40
抽象类里边定义抽象方法目的就是为了让子类去实现,因为子类可能对于同一个方法的实现内容会不一样,比如说学生类里边有个学习的方法,但小学生,初中生,高中生,大学生虽然都是学生类的子类,但他们学习的内容显然不相同,这样父类里边有学习这个方法,却无法具体实现,只能由其子类根据自己的需要来实现。至于你所说的抽象方法定义的多余,浪费空间,这个根本不是设计抽象类的重点,抽象类的出现是为了简化编程,缩短代码,其实就是为了多态,还能方便与程序的扩展。尤其是使用父类引用指向子类对象这种用法(这就是多态),非常有利与缩短代码,编写程序。下边的这个例子就是一个证明。
class Student //学生类的父类
{
String name; //姓名
int age; //年龄
//学习方法
public void study()
{
}
//度假方法
public void goVacation()
{
}
//自我介绍方法
public void introduce()
{
System.out.println("我叫"+name+",我今年"+age+"岁!");
}
}
class BaseStudent extends Student
{
BaseStudent(String name,int age)
{
this.name = name;
this.age = age;
}
//重写父类的study()方法
public void study()
{
System.out.println("base study");
}
//重写父类的度假方法
public void goVacation()
{
System.out.println("BaseStudent go vacation");
}
}
class AdvStudent extends Student
{
AdvStudent(String name ,int age)
{
this.name = name;
this.age = age;
}
//重写父类的study()方法
public void study()
{
System.out.println("advance study");
}
//重写父类的度假方法
public void goVacation()
{
System.out.println("AdvStudent go vacation");
}
}
class ExtendsDemo
{
public static void main(String[] args)
{
Student s1 = new BaseStudent("李四",20);
Student s2 = new AdvStudent("张三",21);
stuDoSomething(s1);
stuDoSomething(s2);
}
//定义方法让学生做事
public static void stuDoSomething(Student s)
{
s.introduce();
s.study();
s.goVacation();
}
}
复制代码
而如果要是没有这种多态性,main函数里边调用子类就要这样写
public static void main(String[] args)
{
BaseStudent s1 = new BaseStudent("李四",20);
AdvStudent s2 = new AdvStudent("张三",21);
s1.introduce();
s1.study();
s1.goVacation();
s2.introduce();
s2.study();
s2.goVacation();
复制代码
这样的话由多态情况下的每个对象只需要一句调用变成了没有多态情况下的3句调用,这样程序会显得非常繁琐,如果创建的子类对象更多,代码将会变得非常臃肿,而多态情况下这种情况会得到大大的好转!
希望能帮助楼主理解抽象类的作用以及应用!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2