请问,Java抽象类具体有什么用处?
比如这个例子abstractclassAnimal//定义抽象类{Stringstr;Animal(Strings)//定义抽象类的一般方法{str=s;}abstrac...
比如这个例子
abstract class Animal //定义抽象类
{
String str;
Animal(String s) //定义抽象类的一般方法
{
str=s;
}
abstract void eat(); //定义抽象方法
}
class Horse extends Animal //定义继承Animal的子类
{
String str;
Horse(String s)
{
super(s); //调用父类的构造方法
}
void eat() //重写父类的抽象方法
{
System.out.println("马吃草料!");
}
}
class Dog extends Animal
{
String str;
Dog(String s)
{
super(s);
}
void eat()
{
System.out.println("狗吃骨头!");
}
}
class test
{
public static void main(String args[])
{
Horse Horse1 = new Horse("马");
Dog Dog1 = new Dog("狗");
Horse1.eat();
Dog1.eat();
}
}
运行结果:
马吃草料!
狗吃骨头!
不使用抽象类也能得到一样的运行结果,为什么还要先定义抽象类呢? 展开
abstract class Animal //定义抽象类
{
String str;
Animal(String s) //定义抽象类的一般方法
{
str=s;
}
abstract void eat(); //定义抽象方法
}
class Horse extends Animal //定义继承Animal的子类
{
String str;
Horse(String s)
{
super(s); //调用父类的构造方法
}
void eat() //重写父类的抽象方法
{
System.out.println("马吃草料!");
}
}
class Dog extends Animal
{
String str;
Dog(String s)
{
super(s);
}
void eat()
{
System.out.println("狗吃骨头!");
}
}
class test
{
public static void main(String args[])
{
Horse Horse1 = new Horse("马");
Dog Dog1 = new Dog("狗");
Horse1.eat();
Dog1.eat();
}
}
运行结果:
马吃草料!
狗吃骨头!
不使用抽象类也能得到一样的运行结果,为什么还要先定义抽象类呢? 展开
3个回答
展开全部
因为这个例子根本就没有体现出多态。
现在来写一个画板程序,在一个面板上可以画多种形状,如圆形、正方形、三角形。
定义一个面板类,该类负责将形状画出来,也就是说,它有一个方法接收一个形状的参数。
public class DrawPanel {
public void draw(YuanXing yx) {
//画圆
}
}
问题来了,我要画一个正方形,难道我又要定义一个draw(ZhengFangXing zfx)这么一个方法?假设这个面板可以画几十种形状,难道你要定义几十个这样的方法?那不蛋疼啊。
正方形,圆形,三角形都是形状,所以应该抽象出一个形状的类。
public abstract class Graphics{
public abstract void draw();//形状负责把自己画出来,自己是什么样的只有自己知道
}
画板的draw方法的参数改成
public void draw(Graphics g){
g.draw();
}
什么正方形,圆形,三角形只要继承那个Graphics类就可以了,然后实现draw方法,将具体的形状传给DrawPanel的draw就可以画出对应的形状出来。
现在来写一个画板程序,在一个面板上可以画多种形状,如圆形、正方形、三角形。
定义一个面板类,该类负责将形状画出来,也就是说,它有一个方法接收一个形状的参数。
public class DrawPanel {
public void draw(YuanXing yx) {
//画圆
}
}
问题来了,我要画一个正方形,难道我又要定义一个draw(ZhengFangXing zfx)这么一个方法?假设这个面板可以画几十种形状,难道你要定义几十个这样的方法?那不蛋疼啊。
正方形,圆形,三角形都是形状,所以应该抽象出一个形状的类。
public abstract class Graphics{
public abstract void draw();//形状负责把自己画出来,自己是什么样的只有自己知道
}
画板的draw方法的参数改成
public void draw(Graphics g){
g.draw();
}
什么正方形,圆形,三角形只要继承那个Graphics类就可以了,然后实现draw方法,将具体的形状传给DrawPanel的draw就可以画出对应的形状出来。
展开全部
假设我有这么一个类,他有一个喂养动物的方法,方法的参数就是他要喂的动物,那么我可以这么写
class Man1{
void feed(Animal a){
a.eat();
}
}
如果没有这个抽象类,那就只能分开写了
class Man2{
void feed(Dog d){d.eat();}
void feed(Horse h){h.eat();}
}
想象一下,假如继续扩展动物类的实现,有更多动物了,Man1还是只要一个方法,Man2却要跟着扩展重载N多方法,这就是抽象和接口的优势
class Man1{
void feed(Animal a){
a.eat();
}
}
如果没有这个抽象类,那就只能分开写了
class Man2{
void feed(Dog d){d.eat();}
void feed(Horse h){h.eat();}
}
想象一下,假如继续扩展动物类的实现,有更多动物了,Man1还是只要一个方法,Man2却要跟着扩展重载N多方法,这就是抽象和接口的优势
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
抽象类和接口的定义,就是为了定义一个统一的调用方法的标准,所有在这个抽象类或者接口下派生的子类,都可以通过这个抽象类或接口进行统一的调用,
最典型的就是数据库接口了,现在的数据库层出不穷,现在的java.sql包下把connection statment,resultset都定义好了,新数据库出来,只要是实现了这些抽象的方法,大家写的数据库查询语句就可以一直沿用下去,不会造成新出来一个数据库就学习新类的混乱,也保证了开发知识的延续性,
其实这和现实中的好多通讯硬件一样的,就像大家一起制定了以太网的通讯协议,在协议之后不管出了多少网卡,具体里面的设计是怎样的,都是插上就可以用了,
抽象类,接口实际上就是标准,为了具体的实现定义好的标准而已
最典型的就是数据库接口了,现在的数据库层出不穷,现在的java.sql包下把connection statment,resultset都定义好了,新数据库出来,只要是实现了这些抽象的方法,大家写的数据库查询语句就可以一直沿用下去,不会造成新出来一个数据库就学习新类的混乱,也保证了开发知识的延续性,
其实这和现实中的好多通讯硬件一样的,就像大家一起制定了以太网的通讯协议,在协议之后不管出了多少网卡,具体里面的设计是怎样的,都是插上就可以用了,
抽象类,接口实际上就是标准,为了具体的实现定义好的标准而已
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询