一、abstract是什么

1、话题引入



从上面可以看出不能这样使用,为什么呢?因为abstract是关键字

2、面向对象的特征

我们面试的时候经常会被问到的问题就是面向对象的特征
那么网上公认的答案是:
1、面向对象的基本特征:封装、继承、多态
2、面向对象的特征: 封装、继承、多态、抽象
那么什么叫抽象呢?
抽象就是具体的反义词,这个没有异议吧,语文都学过
和模糊、不确定、不清晰类似
那下面我们思考什么时候会用到抽象?
当我们在声明一个类的时候,某些方法实现不清楚、或者无法给出具体实现的时候,要等到具体的子类中才能给出具体的实现,这样的方法,我们就可以声明为抽象方法
有一个最好理解的例子
我们在声明一个图形类的时候 Graphic,我们知道在图形这个事物中不管是什么图形,都有两个特征:(1)、求面积(2)、求周长
我们看下面的例子
以前我们在Graphic类里面为了语法正确不得不写一段毫无意义的代码,实际上这这段代码我们是无法给出一个清晰的解决方案的,因为你不知道它是什么图形,需要子类重写

3、抽象方法

那么这样的方法我们就完全可以声明为抽象方法
【注意】:抽象方法没有方法体

语法格式:其它修饰符 abstract 返回值类型 方法名 (形参列表);


修正如下

这样我们就提到了抽象类的概念

4、抽象类:如果一个类中包含了抽象方法,那么这个类必须是一个抽象类

抽象类和普通类有什么不同,即抽象类的特点:
(1)、抽象类不能实例化,不能直接创建对象,或者说不能创建抽象类的对象
(2)、如果子类继承了抽象类,那么必须重写父类的所有抽象方法,否则子类也得是一个抽象类
(3)、抽象类也有构造器,这个构造器不是为了创建抽象类自己的对象用的,而是为子类创建对象服务的
(4)、抽象父类与子类的对象之间可以构成多态
(5)、抽象类中也可能没有抽象方法


那么我们写一个子类去基础图形类 Graphic行不行呢?实际上直接继承也报错了,我们看报错提示

如上图,基础的什么方法其实都告诉你了 就是getArea() 方法
eclipse提供了两种解决方案

我们一般子类里面重写那么怎么重写呢?



我们手动改一下自动生成的代码

然后就是加 构造器、getset 方法这些了

最终效果如下
5、回顾
回顾一下,
(1)父类的构造器能不能被子类继承?
答:不能
(2)抽象类有构造器吗?
答:抽象类也有构造器,这个构造器不是为了创建抽象类自己的对象用的,而是为子类创建对象服务的
(4)抽象父类与子类之间可以构成多态吗
能,实际开发当中经常用的一种方式

(5)、抽象类中也可能没有抽象方法,目的是什么呢?
a、为了多态的应用
b、不希望你创建父类对象(希望你创建子类的对象)

完整代码如下:

package com.atguigu.test02.abstract_;/** 面试题:*    1、面向对象的基本特征:封装、继承、多态*  2、面向对象的特征:封装、继承、多态、抽象* * 抽象:abstract*  是具体的反义词*  和模糊,不确定,不清晰有的类似*  * 1、什么情况下会用到抽象?*  当我们在声明一个父类时,某个/些方法的实现不清楚,或者说无法给出具体的实现,*  要等到具体的子类中才能给出具体的实现,那么这样的方法,就可以声明为抽象方法。*  *  抽象方法没有方法体*  * 2、抽象方法* 语法格式:*   【其他修饰符】 abstract 返回值类型   方法名(【形参列表】); * * 3、抽象类*    如果一个类中包含了抽象方法,那么这个类必须是一个抽象类。* 语法格式:* 【其他修饰符】 abstract class 抽象类名{*        【其他修饰符】 abstract 返回值类型   方法名(【形参列表】); * }*  *  *  例如:我们声明一个图形类:Graphic*   我们知道在图形这个事物中,不管是什么图形,都有两个特征:(1)求面积(2)求周长*  * 4、抽象类的特点* (1)抽象类不能实例化,不能直接创建对象或者说,不能创建抽象类的对象* (2) 如果子类继承了抽象类,必须重写父类的所有的抽象方法,否则子类也得是一个抽象类* (3)抽象类也有构造器,这个构造器不是为了创建抽象类自己的对象用的,而是为子类创建对象服务的* (4)抽象父类与子类的对象之间可以构成多态引用* (5)抽象类中也可能没有抽象方法,目的就是不能你创建它的对象*     如果一个类中包含了抽象方法,那么这个类必须是一个抽象类。*/
public class TestAbstract {public static void main(String[] args) {//      Graphic g1 = new Graphic();//不能创建抽象类的对象Graphic g1 = new Circle(1.2);//多态引用System.out.println("面积:" + g1.getArea());}
}
abstract class Graphic{private String name;public Graphic(String name) {super();this.name = name;}public Graphic() {super();}/*public double getArea(){return 0.0;}*/public abstract double getArea();}
class Circle extends Graphic{private double radius;public Circle() {super();}public Circle(double radius) {super();this.radius = radius;}public Circle(String name, double radius) {super(name);this.radius = radius;}public double getRadius() {return radius;}public void setRadius(double radius) {this.radius = radius;}@Overridepublic double getArea() {//return 3.14 * radius * radius;return Math.PI * radius * radius;}}//像这种没有抽象方法的抽象类,存在的意义
//(1)为了多态的应用,因为父类可以管理各种子类对象
//(2)不希望你创建这个父类的对象,而是创建子类的对象
abstract class Person{}
class Woman extends Person{}
class Man extends Person{}

总结:

1、abstract 抽象的
2、可以修饰什么?
类和方法
3、修饰类的话,不能和其它的修饰符一起用
修饰类的 修饰符
public、缺省、final
abstract和final不能一起修饰类
4、修饰方法和哪些修饰符不能一起用
我们知道修饰方法除了public、private外还有4种权限修饰符,分别是static、final、abstract、native

  • (1)final,abstract不行 因为final不能被重写
  • (2)static,abstract不行 因为static不能被重写
  • (3)native,abstract不行 因为都没有方法体,不知道是什么情况,会有歧义
  • (4)private,abstract不行 因为private不能被重写
public class TestModifier {//  public native abstract void test();
}

00012.01抽象类与抽象方法(abstract)相关推荐

  1. Java面向对象(19)--抽象类与抽象方法abstract

    用abstract关键字来修饰一个类,这个类叫做抽象类. 用abstract来修饰一个方法,该方法叫做抽象方法. 抽象方法:只有方法的声明,没有方法的实现.以分号结束: 比如:public abstr ...

  2. PHP的抽象类和抽象方法 abstract

    抽象类与抽象方法的概念与特点: 抽象类: 1.抽象类的定义方法 abstract class 类名称{}: 2.抽象类,不能被实例化,只能被子类继承. 3.抽象类,中可以有多个抽象方法. 抽象方法: ...

  3. 抽象类和抽象方法 abstract类和abstract方法

    可以使用abstract来修饰一个类或者方法. 用abstract修饰的类表示这个类是一个抽象类,用abstract修饰的方法表示这个方法是一个抽象方法. 抽象类不能被实例化. 抽象方法是只有方法声明 ...

  4. java抽象类的实现_JAVA抽象类和抽象方法(abstract)

    一.抽象(abstract)的使用 当父类的某些方法不确定时,可以用abstract关键字来修饰该方法[抽象方法],用abstract来修饰该类[抽象类]. 我们都知道,父类是将子类所共同拥有的属性和 ...

  5. java 如何判断抽象类_JAVA抽象类和抽象方法(abstract)

    一.抽象(abstract)的使用 当父类的某些方法不确定时,可以用abstract关键字来修饰该方法[抽象方法],用abstract来修饰该类[抽象类]. 我们都知道,父类是将子类所共同拥有的属性和 ...

  6. JavaSE面向对象:继承、多态、Super、Object类、重写、static、final、静态成员、懒汉式、饿汉式、单例设计模式、初始化块、抽象类、抽象方法、接口

    感谢尚硅谷免费提供的视频 继承 ** 理解 ** 生活中的继承:子女继承了父母的财产或相貌或才华 java中的继承:一个类不用自己定义属性或方法,就已经具备了另一个类的属性和方法 把这种现象称为jav ...

  7. 44从零开始学Java之详解容易让初学者懵圈的abstract抽象类、抽象方法

    作者:孙玉昌,昵称[一一哥],另外[壹壹哥]也是我哦 千锋教育高级教研员.CSDN博客专家.万粉博主.阿里云专家博主.掘金优质作者 前言 经过前面几篇文章的讲解,我们现在已经对面向对象有了基本的认知, ...

  8. 【Java笔记】抽象类与抽象方法(abstract关键字)的使用

    随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用.类的设计应该保证父类和子类能够共享特征.有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类. 目录 a ...

  9. abstract 类和 abstract 方法 (抽象类与抽象方法)

    抽象一直以来都是人们所神往的艺术形式,这点从梵高,毕加索等艺术家的身上就可以看出.抽象所代表的是一种形式上的美感,颇有一种虚无缥缈只可意会不可言传的意味.但是JAVA中的抽象类与抽象方法相对而言就更加 ...

最新文章

  1. C#线程--5.0之前时代(一)--- 原理和基本使用
  2. 三菱plc编程实例3000_三菱入门PLC编程PLC系统程序包括哪些
  3. Python服务器开发三:Socket
  4. 错误之data_insertt() takes 1 positional argument but 2 were given解决方法
  5. JDBC第二篇 【PreparedStatment、批处理、处理二进制、自动主键、调用存储过程、函数】...
  6. 怎么看电脑能不能升级win10系统|检测电脑适不适合安装win10的方法
  7. 删除或添加最大化、最小化按钮 - 回复 Tommy the CAT 的问题
  8. Unit04 - 继承的意义(下) 、 访问控制 、 static和final
  9. POJ 2392 Space Elevator(多重背包变形)
  10. 目标检测java系统_5分钟!用Java实现目标检测
  11. Win32写一个极简定时关机软件的全部过程讲解
  12. 基于php网上书店存在问题及解决方案,基于PHP的网上书店系统设计与实现
  13. Soul如何让年轻人的“灵魂”心甘情愿的买单?
  14. 腾讯云数据库团队:MySQL AHI 实现解析
  15. java中choice用法,批处理中choice用法
  16. Unity获取安卓的MAC地址问题
  17. GoDEX条码打印机批量打印条码设置
  18. Linux断开usb调试命令,Android关闭USB的ADB调试和文件传输功能(禁用USB)【转】
  19. Spring aop 循环依赖 Is there an unresolvable circular reference?
  20. 货郎担问题(TSP)

热门文章

  1. php 招聘要求 转载
  2. 【C语言】初识C语言——认识第一个C语言程序
  3. 新媒体内容运营的7个核心环节
  4. Number Game(数字游戏)
  5. 嵌入式学习(二)——刷机和led实验(看门狗、c语言、icache、重定位、SDRAM)
  6. 小米双剑出鞘,红米2、小米4S所到之处尸横满地?
  7. android native方法调用
  8. 对数似然函数值/最大近然估计/log likelihood
  9. 无线安全[测试标准]
  10. java实现空格替换