JAVA之抽象类与抽象方法

抽象方法:在类中没有方法体的方法,就是抽象方法。
抽象类:含有抽象方法的类就叫抽象类。
|||||||||抽象类不能被实例化(new)
为什么要使用抽象方法?
(以下是个人观点)

为在面向对象的编程的思想中,任何事物都可以看做是一个类。例如:每个动物都需要休息,都要睡觉(sleep),而不同的动物有不同的睡觉方法,如,蝙蝠
是倒挂在树上睡,小狗是爬着睡,蛇是盘着睡……等等。由此可以看出,每种动物的睡觉的方式都不一样,但转过头来思考,他们又确实都是在做着同一件事情
(sleep)。因此,在JAVA中引入了抽象类这个概念。就是说,父类中的某些方法不包含任何逻辑(例如上面例子中的sleep方法),并且需要由子类
重写(例如蝙蝠是挂着睡……)。在这种情况下,我们就应该把这些具有共同特征的方法抽象出来,由子类负责这些抽象方法的实现细节。而父类仅提供此方法的名
称和声明、没有方法的主体。因此子类负责重写此方法。所以这就是为什么要使用抽象方法!(个人观点,不知道对不对?)
============================================
如下代码:
-----------------------------
class boar
{
abstract void sleep();
}
-----------------------------
这段代码中的类boar里面有个抽象(abstract)方法sleep(),可以看到这个方法后面没有方法体,而是用一个“;”号结束。那么这种方法就叫做抽象方法。
如果编译这段代码的话,会提示如下错误:
----------------------------------------------------------------
boar.java:1: boar 不是抽象的,并且未覆盖 boar 中的抽象方法 sleep()
class boar
^
1 错误
----------------------------------------------------------------
意思是说:boar这个类不是抽象的。为什么呢?因为前面在给抽象类下定义的时候就说过,含有抽象方法的类就叫抽象类。因此,boar这个类必须也是抽象的!
所以应改为如下代码:
-----------------------------
abstract class boar
{
abstract void sleep();
}
-----------------------------
如果这次编译的话,就不会提示任何错误了。
============================================
来看如下代码:
-------------------------------------------------------------------
abstract class allsleep
{
abstract void sleep();
}
class owl extends allsleep
{
void sleep()
{
    System.out.println("我是猫头鹰,我是站在树上睡的");
}
}
class bat extends allsleep
{
void sleep()
{
    System.out.println("我是蝙蝠,我是倒挂在树上睡的");
}
}
public class newsleep
{
public static void main(String[] sl)
{
    owl objowl=new owl();
    bat objbat=new bat();
    objowl.sleep();
    objbat.sleep();
}
}
-------------------------------------------------------------------
编译不会出错,打印的结果为:
----------------------------
我是猫头鹰,我是站在树上睡的
我是蝙蝠,我是倒挂在树上睡的
----------------------------
但如果把代码改为如下:
-------------------------------------------------------------------
abstract class allsleep
{
abstract void sleep();
}
class owl extends allsleep
{
/*void sleep()
{
    System.out.println("我是猫头鹰,我是站在树上睡的");
}*/
}
class bat extends allsleep
{
/*void sleep()
{
    System.out.println("我是蝙蝠,我是倒挂在树上睡的");
}*/
}
public class newsleep
{
public static void main(String[] sl)
{
    /*owl objowl=new owl();
    bat objbat=new bat();
    objowl.sleep();
    objbat.sleep();*/
}
}
-------------------------------------------------------------------
编译的时候JVM会提示如下:
--------------------------------------------------------------------------
newsleep.java:5: owl 不是抽象的,并且未覆盖 allsleep 中的抽象方法 sleep()
class owl extends allsleep
^
newsleep.java:12: bat 不是抽象的,并且未覆盖 allsleep 中的抽象方法 sleep()
class bat extends allsleep
^
2 错误
--------------------------------------------------------------------------
意思是说:owl类和bat类都没有实现allsleep中的sleep()方法,而只是麻木的继承了过来
因此得到结论:抽象类中的抽象方法必须被实现!
那么为了证实这个结论,再写一段代码,如下:
---------------------------------------------
abstract class allsleep
{
void eat()
{
    System.out.println("我会吃");
}
}
class owl extends allsleep
{
}
class bat extends allsleep
{
}
---------------------------------------------
从上面的代码我们可以看到抽象类allsleep中没有抽象方法,而我们在子类中也没有实现allsleep类中的eat()方法,因此,这便证实了我们上面的结论:抽象类中的抽象方法必须被实现!
=====================================================
话说回来,如果一个子类没有实现父类中的抽象方法呢?
来做个实验吧:
-------------------------------
abstract class allsleep
{
abstract void sleep();
}
class owl extends allsleep
{
}
class bat extends allsleep
{
}
-------------------------------
我们编译这段代码的结果会是怎样的呢?
其实这个实验已经做过了,在上上一个例子里,把owl类和bat类中的内容都屏蔽了,跟这个是一个效果。也就是说:抽象类中的抽象方法必须被实现!
那么如果我们不想实现的话该怎么办呢?很简单,只要把子类也声明为一个抽象类就OK了!
因此我们得到结论:如果一个子类没有实现父类中的抽象方法,则子类也成为了一个抽象类!
最后来总结下:
----------------------------------------------------------------
抽象方法:在类中没有方法体的方法,就是抽象方法。
抽象类:含有抽象方法的类就叫抽象类。
抽象类中的抽象方法必须被实现!
如果一个子类没有实现父类中的抽象方法,则子类也成为了一个抽象类!
抽象类中的普通方法,可以不必实现。

时间: 2024-09-30 06:26:07

JAVA之抽象类与抽象方法的相关文章

关于Java 实现抽象类的抽象方法的特性的利用---面向切面

今天看工作看代码突然有了以下设想: /** * Created by zq on 2017/5/25. * 抽象类 */ public abstract class AbstractC { public void C(){ D(); System.out.println("C_1"); E(); } public abstract void D(); // { // System.out.println("C_1"); // } public abstract vo

java中抽象类和抽象方法到底什么关系?请举例说明!

抽象类和抽象方法什么关系?抽象类中可能有抽象方法,也可能没有抽象方法.(视频下载) (全部书籍)那位说,就跟没说一样,那抽象类和抽象方法都叫抽象,他们必定有关系,那关系是什么呢?如果一个类中有抽象方法,它必须得是抽象类. An abstract class may have no abstract method,such as the following class Car. 马  克- t  o --wi n: At this time,the only point and the meani

【JAVA】抽象类,抽象方法

抽象类不能被实例化,有两个特点: 必须继承才有它的用途: 不能描述对象: 抽象方法: 具体实现由子类决定,最终子类必须实现: 没有方法体: 说明: 抽象类不一定包含抽象方法,抽象方法一定是抽象类.

java的抽象类和抽象方法(注意查看如何调用抽象类中的非抽象方法)

抽象类就是不能使用new方法进行实例化的类,即没有具体实例对象的类.抽象类有点类似“模板”的作用,目的是根据其格式来创建和修改新的类.对象不能由抽象类直接创建,只可以通过抽象类派生出新的子类,再由其子类来创建对象.当一个类被声明为抽象类时,要在这个类前面加上修饰符abstract. 在抽象类中的成员方法可以包括一般方法和抽象方法.抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型.方法名称和所需的参数,没有方法体,也就是说抽象方法只需要声明而不需要实现.当一个方法为抽象方法时

Java中抽象类和抽象方法的区别

抽象方法:在类中没有方法体的方法,就是抽象方法. 抽象类:含有抽象方法的类就叫抽象类. 抽象类中的抽象方法必须被实现! 如果一个子类没有实现父类中的抽象方法,则子类也成为了一个抽象类! 抽象类中的普通方法,可以不必实现. 1.用abstract来修饰一个类时,这个类叫做抽象类:用abstract来修饰一个方法时,该方法叫做抽象方法.例如 : 抽象类: abstract class Animal { //用abstract来定义一个Animal为抽象类} 抽象方法: public abstract

java抽象类和抽象方法

抽象类: java中定义没有方法体的方法,该方法有由其子类来具体的实现. 该没有方法体的方法我们称为抽象方法,含有抽象方法的类为抽象类. 抽象方法的特点: 1.只有方法头没有方法体的方法 2.抽象方法用abstract修饰 3.抽象方法代表一种不确定的操作或行为 4.抽象方法不能被调用 抽象类的特点: 1.定义中含有抽象方法的类叫抽象类 2.抽象类用abstract修饰 3.抽象类代表一种抽象的对象类型 4.抽象类不能实例化 5.抽象类可以有具体的方法,可以没有抽象方法 //公司所有员工都有工号

二、Java面向对象(14)_抽象类和抽象方法

2018-05-06 抽象类和抽象方法 一.抽象的使用 当父类的某些方法不确定时,可以用abstract关键字来修饰该方法[抽象方法],用abstract来修饰该类[抽象类]. 我们都知道,父类是将子类所共同拥有的属性和方法进行抽取,这些属性和方法中,有的是已经明确实现了的,有的还无法确定,那么我们就可以将其定义成抽象,在后日子类进行重用,进行具体化.这样,抽象类也就诞生了. 例如,定义了"动物"父类,其中"动物名称"和"动物年龄"属性已经明确了

Java 抽象类和抽象方法

包含抽象方法的类叫抽象类,如果一个类中包含一个或多个抽象方法,该类必须被限定为抽象的,否则编译器会报错,抽象类不可创建对象,创建抽象类的对象编译器会报错 如果从一个抽象类继承,并想创建该新类的对象,那么必须为基类中的所有抽象方法提供方法定义,如果不这样做(可以选择不做),那么导出类便也是抽象类,且编译器会强制我们用abstract关键字来限定这个类.. 可以创建没有任何抽象方法的抽象类,创建抽象类和抽象方法非常有用,因为我们可以使类的抽象性明确起来,并告诉用户和编译器打算怎么去使用它们,抽象类还

java抽象类和抽象方法之间的关系

抽象类和抽象方法之间的关系有抽象方法的类,一定是抽象类:抽象类不一定有抽象方法当子类继承抽象类时,必须要将抽象类中的抽象方法全部实现(或者称为重写),否则子类依然是抽象类因为子类是继承父类全部内容,所以也就相当于子类中也有了抽象方法,通过重写,可以将抽象方法覆盖. 抽象类的特点:必须有abstract关键字修饰,不可以通过new来创建对象,抽象方法不可以写函数体(非抽象方法必须写函数体) 关键字小总结:不想让别的类重写的方法,用final:内容不确定的方法,用abstract(子类中用法不一样)