高手勿喷~

抽象类:当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但有时这些方法的实现方式是无法确定的。例如定义Animal类时,shout()方法用于表示动物的叫声,但是针对不同的动物,叫声也是不同的,因此在shout()方法中无法准确描述动物的叫声。

针对上面的情况,Java允许在定义方法时不写方法体,不包含方法体的方法为抽象方法,抽象方法必须使用abstract关键字来修饰,格式如下:

abstract void shout();   //定义抽象方法shout()

abstract表示抽象的,是最重要的一个修饰符,可以修饰类和方法。它们分别叫抽象方法和抽象类,人们在认识事物的时候,会把具有相同特征和行为的事物归为一个抽象类。。  比如动物就是一个很抽线的概念。当得到动物的实例时,总是某个具体物种的实例。所以说,在需要某个抽象类的实例时,只能够用某个具体类的实例来代替。

抽象类的应用场景:

我们在描述一类事物的时候,发现该种事物确实存在着某种行为,

但是这种行为目前是不具体的,那么我们可以抽取这种行为 的声明,但是

不去实现该种行为,这时候这种行为我们称作为抽象的行为,我们就需要使用抽象类。

抽象类的好处: 强制要求子类一定要实现指定的方法。

抽象类要注意的细节:

1. 如果一个函数没有方法体,那么该函数必须要使用abstract修饰,把该函数修饰成抽象 的函数。。

2. 如果一个类出现了抽象的函数,那么该类也必须 使用abstract修饰。

3. 如果一个非抽象类继承了抽象类,那么必须要把抽象类的所有抽象方法全部实现。

4. 抽象类可以存在非抽象方法,也可以存在抽象的方法.

5. 抽象类可以不存在抽象方法的。 

6. 抽象类是不能创建对象的。

疑问:为什么抽象类不能创建对象呢?

因为抽象类是存在抽象方法的,如果能让抽象类创建对象的话,那么使用抽象的对象

调用抽象方法是没有任何意义的。

7. 抽象类是存在构造函数的,其构造函数是提供给子类创建对象的时候初始化父类的属性的。

abstract不能与以下关键字共同修饰一个方法:

1. abstract不能与private共同修饰一个方法。

2. abstract 不能与static共同修饰一个方法。

3. abstract 不能与final共同修饰一个方法。

白话解释:说到明就是不具体的总类写成抽象类就可以了,例如有个动物园,里面有着各种各样的动物,有狗,有猫等等,,,你能让它们叫吗?它们的叫声一样吗?怎么具体让什么动物叫?

这时,就应该想到abstract关键字,用来定义抽象类。。见实例1

实例1

//定义抽象类Zoo
abstract Zoo{
//定义抽象方法shout()
abstract void shout();
}

P.S.

在定义抽象类的时候要注意,包含抽象方法的类必须声明为抽象类,但是抽象类可以不包含任何抽象方法,只需使用abstract关键字即可。。  最值得注意的是:抽象类不可以被实例化的,因为抽象类中有可能包含抽象方法,抽象方法时没有方法体的,不可以被调用。如果真的想调用抽象类定义的方法,则需要创建一个子类,在子类中将抽象类中的抽象方法进行实现。     见实例2

实例2

//定义抽象类Zoo
abstract class Zoo{
//定义抽象方法shout()
abstract void shout();
}
//定义Dog类继承抽象类Zoo
class Dog extends Zoo{
String name = "狗" ;
//实现抽象方法shout()
public void shout(){
System.out.println(name+"的叫声:汪汪汪~~~");
}
}
//定义Cat类继承抽象类Zoo
class Cat extends Zoo{
String name = "猫" ;
//实现抽象方法shout()
public void shout(){
System.out.println(name+"的叫声:喵喵喵~~~");
}
}
//定义测试类
class Demo1
{
public static void main(String[] args)
{
System.out.println("welcome to Zoo");
//创建Dog类的实例对象
Dog dog = new Dog();
//调用dog对象的shout()方法
dog.shout();
//创建Cat类的实例对象
Cat cat = new Cat();
//调用cat对象的shout()方法
cat.shout();
}
}

运行结果:

从运行结果可以看出,子类实现了父类的抽线方法后,可以正常进行实例化,并通过实例化对象调用方法。。

交流学习企鹅:654249738

JAVA_SE基础——43.抽象类的更多相关文章

  1. JAVA_SE基础——44.抽象类的练习

    抽象类要注意的细节: 1. 如果一个函数没有方法体,那么该函数必须要使用abstract修饰,把该函数修饰成抽象 的函数..2. 如果一个类出现了抽象的函数,那么该类也必须 使用abstract修饰. ...

  2. JAVA_SE基础——6.标识符&关键字

    学会写helloworld之后,  我们就开始来认识标识符&关键字 一.标识符 标识符是指可被用来为类.变量或方法等命名的字符序列,换言之,标识符就是用户自定义的名称来标识类.变量或方法等.更 ...

  3. [.net 面向对象编程基础] (15) 抽象类

    [.net 面向对象编程基础] (15) 抽象类 前面我们已经使用到了虚方法(使用 Virtual修饰符)和抽象类及抽象方法(使用abstract修饰符)我们在多态一节中说到要实现类成员的重写必须定义 ...

  4. JAVA_SE基础——26.[深入解析]局部变量与成员变量的区别

    黑马程序员入学blog ... 如果这章节很难懂的话应该返回去先看  JAVA_SE基础--10.变量的作用域 定义的位置上区别: 1. 成员变量是定义在方法之外,类之内的. 2. 局部变量是定义在方 ...

  5. JAVA_SE基础——9.基本数据类型间的转换

    前面我已经教会大家基本的数据类型进行了介绍,   然后这篇文章,我来介绍下,基本数据类型的转换. Java中有两种类型转换形式,分别是自动类型转换和强制类型转换. Step1.自动类型转换. 自动类型 ...

  6. JAVA_SE基础——8.基本数据类型

    基本数据类型有:整数类型.浮点类型.字符类型.布尔类型 整数类型 整数类型用来存储整数数值,即没有小数部分的数值.与C.C++语言相同,整数在Java语言中有3种表示形式:十进制.八进制和十六进制. ...

  7. JAVA_SE基础——7.常量&变量

    上一篇,我讲了标识符&关键字    这篇我来解释下变量&常量~~~ 变量与常量这两个概念相信大家都不会感到陌生,在数学中就已经涉及了变量与常量.理解变量与常量,可以举这样一个例子: 例 ...

  8. JAVA_SE基础——5.第一个Java程序HelloWorld&注释的应用

    配置完JDK&环境变量后,我们就可以开始写程序了,那么程序怎么写呢,用什么工具呢,我建议 为了方便学习,我们最好在一个磁盘下建立一个专门的文件来写java程序,比如就在D盘下建立一个名为&qu ...

  9. JAVA_SE基础——4.path的临时配置&Classpath的配置

    这次,我来写下关于path的临时配置的心的 我来说个有可能的实例:如果你去到别人的电脑 又想写代码 又不想改乱别人的path配置的话  再说别人愿意你在别人的电脑上瞎配吗? 那该怎么办呢? 那没问题 ...

随机推荐

  1. LightOJ1259 Goldbach`s Conjecture

    题面 T组询问,每组询问是一个偶数n 验证哥德巴赫猜想 回答n=a+b 且a,b(a<=b)是质数的方案个数 Input Input starts with an integer T (≤ 30 ...

  2. angular+ionic+cordova(实战项目开发中,持续更新自己学到的和遇到的)

    最近公司开始准备做app了,大佬选择了angular+ionic+corvoda的开发结构,但是对于刚刚才开始对angular才有一点点感觉的我,就像是被一击闷棍敲了,半天没反应过来,emmm,怎么办 ...

  3. 夹缝中求生存-在一无所有的php虚拟主机环境下利用smtp发送邮件(二)

    夹缝中求生存 前言:在上一篇随笔中,以163个人邮箱作为发送邮箱地址,当收件邮箱为QQ邮箱时,极有可能会被直接扔进邮件垃圾箱里,为了解决这个问题,申请注册企业邮箱,可以减少发出的邮件被当作垃圾邮件的可 ...

  4. linux的shell学习笔记

    shell脚本第一行写明解释器的路径: #!/bin/bash运行脚本两种方式:使用bash命令运行shell文件,或授予脚本文件执行权限,可直接执行文件shell启动时,一开始执行一组命令来定义提问 ...

  5. C语言switch/case圈复杂度优化重构

    软件重构是改善代码可读性.可扩展性.可维护性等目的的常见技术手段.圈复杂度作为一项软件质量度量指标,能从一定程度上反映这些内部质量需求(当然并不是全部),所以圈复杂度往往被很多项目采用作为软件质量的度 ...

  6. 最大堆(Java数组实现)

    最大堆 data[1]开始存,data[0]空着不用.也可以把data[0]当成size来用. public class MaxHeap<T extends Comparable<? su ...

  7. Go实现海量日志收集系统(一)

    项目背景 每个系统都有日志,当系统出现问题时,需要通过日志解决问题 当系统机器比较少时,登陆到服务器上查看即可满足 当系统机器规模巨大,登陆到机器上查看几乎不现实 当然即使是机器规模不大,一个系统通常 ...

  8. 笔记:I/O流-对象序列化

    Java 语言支持一种称为对象序列化(Object Serialization)的非常通用的机制,可以将任何对象写入到流中,并在之后将其读回,首先需要支持对象序列化的类,必须继承与 Serializa ...

  9. vue技术解析二之组件通信

    --------------------------动画效果----------------------------------- <transition name="router-f ...

  10. 【Python】 压缩文件处理 zipfile & tarfile

    [zipfile] 虽然叫zipfile,但是除了zip之外,rar,war,jar这些压缩(或者打包)文件格式也都可以处理. zipfile模块常用的一些操作和方法: is_zipfile(file ...