黑马程序员技术交流社区
标题:
第一个贴错了,抽象类的继承问题
[打印本页]
作者:
yan
时间:
2013-8-4 19:13
标题:
第一个贴错了,抽象类的继承问题
本帖最后由 杨兴庭 于 2013-8-5 18:43 编辑
例:
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-4 19:28
如果继承一个抽象类,就必须重写抽象类里所有的方法,要不然,你这个类也是一个抽象类,抽象类就好像一个规则,你继承了,就必须重写,
作者:
taotao
时间:
2013-8-4 19:39
这样考虑,如果需求中要求,dog和cat 必须要体现eat()这个方法,那么如果不在抽象类animal中定义抽象方法eat(),你很可能有意或无意的没有在子类中定义该方法!这样也不会报错。
其实在抽象类animal中定义eat(),就是
强制
你必须在定义子类的时候体现eat()!因为如果子类中没有实现抽象类中的抽象方法,编译通不过!
作者:
昨夜星风
时间:
2013-8-4 20:21
在此定义一个抽象类是对象 Dog和 Cat进行分析后 在这两个对象中出现了相同的功能,但是功能的主体不同,
这时向上抽取了功能的定义 ,所以定义抽象类abstract class Animal
这样就可以对符合此抽象类功能的对象进行调来复用,如果不这样,那么在主函数中会重复对对象中相同功能代码的重写,
如果对象过多,编译相同的代码重复过多,所以向上抽取,定义一个抽象类,这是我个人的理解 希望能帮到你。
作者:
张云杰
时间:
2013-8-4 20:36
我给你背下抽象类的概念吧.. 首先抽象类什么特点, 它相当于一个普通的java类, 他具有普通java类的操作功能,同时 他也有一个或者多个抽象方法, 如果子类继承了抽象类 那么抽象方法必须被实现, 然后抽象类是单继承的, 抽象类和抽象方法都是被 abstract所修饰,
abstract 不能和private static final 共存
作者:
yan
时间:
2013-8-4 20:56
我明白什么情况下用,只是不明白,既然子类里面有这个方法,还能覆盖抽象方法,那么抽象方法写在那里就没有意义啊,就相当于摆设
作者:
草帽
时间:
2013-8-4 22:19
抽象方法是只生命而未实现的方法,所有的抽象方法必须使用abstract关键字声明,包含抽象方法的类也必须使用abstract class声明。
1,抽象类和抽象方法都必须用abstract关键字来修饰
2,抽象类不能被直接实例化,也不能直接用new关键字去产生对象
3,抽象方法只需声明,而不需实现
4,含有抽象方法的类必须被声明为抽象类,抽象类的子类必须覆写所有抽象方法后才能被实例化,否则这个类还是抽象类
抽象类专门用来当作父类,我觉得既然是父类就是子类对逻辑共性的抽取,通过继承它实现多态,后期绑定,可以为将来要实现的东西做好接口,实现重用性。
说到这儿,楼主又要注意接口的特性了
作者:
xuaner0719
时间:
2013-8-4 22:37
1 抽象类
|-- 抽象,说不清楚的
|-- 抽象方法,是没有方法体的方法,必须abstract修饰
|-- 抽象方法,必须存在于抽象类,类需要抽象修饰
2. 抽象类的特点
|-- 抽象类,不能创建对象,不能实例化,不允许 new
|-- 需要定义子类,继承抽象类,并覆盖抽象类的全部抽象方法,建立子类对象
|-- 如果子类,覆盖一部分抽象方法,子类还是一个抽象类
|-- 抽象类中,可以有静态方法,但是static不能和abstract一起使用
|-- 抽象类有强制性,强制子类,必须重抽象写方法
|-- 抽象类,是这个继承体系中的最共性内容
3. 抽象类和接口的区别 |-- 抽象类需要子类继承后,覆盖全部抽象方法,建立子类对象 |-- 接口,需还子类实现,覆盖全部抽象方法,建立子类对象
|-- 抽象类中,有普通方法,子类继承后直接使用 |-- 接口中,没有普通方法,全部是抽象的方法,子类必须全部覆盖
|-- 抽象类中有构造方法,可以给体系中的子类实现成员变量的赋值 |-- 接口中定义的都是全局常量,直接调用使用
|-- 抽象类是这个继承体系的最共性内容 |-- 接口是这个体系以外的扩展内同
|-- 一个类只能继承一个类,有局限性 |-- 接口的多实现,避免了单继承的局限性
作者:
王松松
时间:
2013-8-4 23:52
只说重点。
抽象类中方法存在的意义是从不同类中抽取的具有相同性质,但是却有不同之处的方法。那么就需要这些类继承这个抽象类,覆盖该方法,书写属于自己的方法体。
作者:
丁永志
时间:
2013-8-5 09:32
本帖最后由 丁永志 于 2013-8-5 09:33 编辑
yan 发表于 2013-8-4 20:56
我明白什么情况下用,只是不明白,既然子类里面有这个方法,还能覆盖抽象方法,那么抽象方法写在那里就没有 ...
怎么会是摆设。。
作者:
心灵之歌
时间:
2013-8-5 10:14
抽象类定义抽象的方法,目的在于子类继承这个抽象类的时候,就必须要从写这个抽象方法。否则子类也是抽象的。这种是非常有必要的!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2