00012.01抽象类与抽象方法(abstract)
一、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)相关推荐
- Java面向对象(19)--抽象类与抽象方法abstract
用abstract关键字来修饰一个类,这个类叫做抽象类. 用abstract来修饰一个方法,该方法叫做抽象方法. 抽象方法:只有方法的声明,没有方法的实现.以分号结束: 比如:public abstr ...
- PHP的抽象类和抽象方法 abstract
抽象类与抽象方法的概念与特点: 抽象类: 1.抽象类的定义方法 abstract class 类名称{}: 2.抽象类,不能被实例化,只能被子类继承. 3.抽象类,中可以有多个抽象方法. 抽象方法: ...
- 抽象类和抽象方法 abstract类和abstract方法
可以使用abstract来修饰一个类或者方法. 用abstract修饰的类表示这个类是一个抽象类,用abstract修饰的方法表示这个方法是一个抽象方法. 抽象类不能被实例化. 抽象方法是只有方法声明 ...
- java抽象类的实现_JAVA抽象类和抽象方法(abstract)
一.抽象(abstract)的使用 当父类的某些方法不确定时,可以用abstract关键字来修饰该方法[抽象方法],用abstract来修饰该类[抽象类]. 我们都知道,父类是将子类所共同拥有的属性和 ...
- java 如何判断抽象类_JAVA抽象类和抽象方法(abstract)
一.抽象(abstract)的使用 当父类的某些方法不确定时,可以用abstract关键字来修饰该方法[抽象方法],用abstract来修饰该类[抽象类]. 我们都知道,父类是将子类所共同拥有的属性和 ...
- JavaSE面向对象:继承、多态、Super、Object类、重写、static、final、静态成员、懒汉式、饿汉式、单例设计模式、初始化块、抽象类、抽象方法、接口
感谢尚硅谷免费提供的视频 继承 ** 理解 ** 生活中的继承:子女继承了父母的财产或相貌或才华 java中的继承:一个类不用自己定义属性或方法,就已经具备了另一个类的属性和方法 把这种现象称为jav ...
- 44从零开始学Java之详解容易让初学者懵圈的abstract抽象类、抽象方法
作者:孙玉昌,昵称[一一哥],另外[壹壹哥]也是我哦 千锋教育高级教研员.CSDN博客专家.万粉博主.阿里云专家博主.掘金优质作者 前言 经过前面几篇文章的讲解,我们现在已经对面向对象有了基本的认知, ...
- 【Java笔记】抽象类与抽象方法(abstract关键字)的使用
随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用.类的设计应该保证父类和子类能够共享特征.有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类. 目录 a ...
- abstract 类和 abstract 方法 (抽象类与抽象方法)
抽象一直以来都是人们所神往的艺术形式,这点从梵高,毕加索等艺术家的身上就可以看出.抽象所代表的是一种形式上的美感,颇有一种虚无缥缈只可意会不可言传的意味.但是JAVA中的抽象类与抽象方法相对而言就更加 ...
最新文章
- C#线程--5.0之前时代(一)--- 原理和基本使用
- 三菱plc编程实例3000_三菱入门PLC编程PLC系统程序包括哪些
- Python服务器开发三:Socket
- 错误之data_insertt() takes 1 positional argument but 2 were given解决方法
- JDBC第二篇 【PreparedStatment、批处理、处理二进制、自动主键、调用存储过程、函数】...
- 怎么看电脑能不能升级win10系统|检测电脑适不适合安装win10的方法
- 删除或添加最大化、最小化按钮 - 回复 Tommy the CAT 的问题
- Unit04 - 继承的意义(下) 、 访问控制 、 static和final
- POJ 2392 Space Elevator(多重背包变形)
- 目标检测java系统_5分钟!用Java实现目标检测
- Win32写一个极简定时关机软件的全部过程讲解
- 基于php网上书店存在问题及解决方案,基于PHP的网上书店系统设计与实现
- Soul如何让年轻人的“灵魂”心甘情愿的买单?
- 腾讯云数据库团队:MySQL AHI 实现解析
- java中choice用法,批处理中choice用法
- Unity获取安卓的MAC地址问题
- GoDEX条码打印机批量打印条码设置
- Linux断开usb调试命令,Android关闭USB的ADB调试和文件传输功能(禁用USB)【转】
- Spring aop 循环依赖 Is there an unresolvable circular reference?
- 货郎担问题(TSP)