抽象类 [Java]
抽象类
抽象方法的概念
- 抽象的反义词是具体,抽象也就是不能具体
抽象方法就是指不能具体实现的方法,抽象方法没有方法体且要使用abstract关键字修饰
抽象方法使用时的语法格式
访问权限修饰符 abstract 返回值类型 方法名();
- 没有方法体
eg:public abstract void cry;
(如上就是描述了一个动物叫声的抽象方法)
抽象类的概念
抽象类就是不能具体实例化的类,也就是不能创建对象,并且要使用abstract关键字修饰
关于抽象类的注意事项
1.抽象类中可以定义成员变量,成员方法和构造方法.
2.抽象类中可以有抽象方法也可以没有抽象方法
3.有抽象方法的类一定是抽象类
注意:严格来说,只有具有抽象方法且用abstract关键字修饰的类才是真正的抽象类
抽象类不能创建对象是因为担心新手程序员通过创建对象而去调用抽象类中的抽象方法(因为抽象方法没有方法体,也就是没有实际意义,所以调用了也没有用)
实际意义
抽象类的实际意义不在于创建对象,而在于"被继承",当一个继承抽象类之后,要么重写这个抽象类中的抽象方法,要么这个继承的类也要定义为抽象类(也就是抽象类对子类有强制性和规范性)
- 强制性:强制性就是这里的子类必须要重写抽象类的抽象方法,或者这个类就也要变成抽象类
- 规范性:规范性就是子类要重写抽象类中的抽象方法,所以就要遵守方法重写的规范
方法重写的规范:
1.权限修饰符可以不变,也可以换成访问权限更高的权限修饰符
2.返回值类型也要相同或者是返回子类类型
3.方法名一样
4.参数列表相同
模板设计模式
出现抽象类的场合我们就叫模板设计模式
多态的使用场合:
场合一:通过参数的传递来实现多态,也就是实参给形参的传递形成多态
public Shape{
…
…
…
}
publi Circle extends Shape{
…
…
public static void show(Shape s){
s.print();
}
}
public TextShape{
public static void main(String[] args){
/*
这里就使用了多态,通过将实参new Circle()传递给了形参s而达到了Shape s=new Circle();
也就是父类的引用指向了子类的对象,也就是完成了多态,
*/
Shape.show(new Circle());
}
}
场合二:
在方法体中直接使用父类的引用指向子类的对象而完成多态的使用
eg:
public Shape{
public staitc void main(String[] args){
/*
这里在方法体中使用父类的引用指向了子类的对象,也就是使用了多态
*/
Shape s=new Circle();
}
}
经验分享:
在以后我们使用继承的时候(包括抽象类的使用,因为抽象类就是为了继承),我们一般有两种创建对象的方式:
/*
前提:public SubAbstract extends Abstract{
}
也就是SubAbstract是 Abstract的子类
*/
方式一(基础创建方式):
SubAbstract sub=new SubAbstract();
这种方式就是使用子类的引用指向了子类的对象
方式二(进阶版创建方式):
Abstract abs=new SubAbstract();
这种方式就是使用父类的引用指向了子类的对象(也就是使用了多态)
- 在以后的使用当中我们推荐使用第二种创建对象的方式,也就是使用多态创建的方式,
使用第二种创建方式的优点:
因为当父类的引用指向了子类的对象时父类所调用的子类的所有方法都一定是父类都有的方法,那么要调用另一个子类的同一种方法时我们只需要修改new关键字之后的部分即可,也就是修改new后面对应子类的构造方法即可调用另一个子类的方法了,而其他地方则无需修改,“从而提高了代码的可维护性”
使用第二种创建方式的缺点:
当要调用子类所独有的方法时就要进行向下转型(也就是引用类型的转换)
抽象类 [Java]相关推荐
- 字符流的抽象类 java
字符流的抽象类 java 使用字节流读取汉字出现的问题 字符流的抽象类
- 字节流抽象类 java
字节流抽象类 java
- 抽象类java启动线程_java 线程复习笔记
1. 线程基本概念 1.1 线程与进程 当一个程序进入内存运行时,即变成一个进程.进程是系统进行资源分配和调度的一个独立单元. 线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须有一个父进程 ...
- java person抽象类,Java中的抽象类
象类.内部抽象类的抽象方法与外部抽象类的抽象方法无关.当前直接继承哪个抽象类,就覆写其抽象方法.(若直接继承外部抽象类,则只需要覆写外部抽象类的所有抽象方法即可)注意:尽量不要直接继承实现好的类,而要 ...
- JAVA的abstract修饰符 接口interface用法 抽象类和interface的差别
转自:http://blog.csdn.net/zhandoushi1982/article/details/8458081 abstract修饰符可以修饰类和方法. (1)abstract修饰类,会 ...
- Java:抽象方法和抽象类,抽象类应用模板方法模式,接口及使用
一.抽象类概念和作用 抽象类 Java中可以定义没有方法体的方法,该方法由子类来具体实现. 该没有方法体的方法我们称之为抽象方法,含有抽 ...
- java虚成员函数_Java常见知识点汇总(④)——虚函数、抽象函数、抽象类、接口...
一. Java虚函数 虚函数的存在是为了多态. 它虚就虚在所谓"推迟联编"或者"动态联编"上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的. ...
- Java接口和Java抽象类有什么不同
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstract class和inte ...
- Java 的抽象特性:抽象类与接口深度解析
要点: 抽象类 接口 抽象类与接口的差别 一. 抽象 对于面向对象编程来说,抽象是它的四大特征之中的一个. 在Java中,能够通过两种形式来体现OOP的抽象:接口和抽象类. 接口和抽象类为我们提供了一 ...
最新文章
- prolog_如何通过观看权力的游戏学习Prolog
- caffe的python接口学习(6):用训练好的模型(caffemodel)来分类新的图片
- python 中的pickle库
- python内置模块有哪些_python中那些小众但有用的内置模块
- 使用Spring AOP重试方法执行
- 贪心算法求解背包问题
- vue axios封装以及登录token过期跳转问题
- mysql百万数据生成
- java必学的技术,终于有人把Java程序员必学知识点整理出来了,令人有如醍醐灌顶...
- 学python必备的英语单词(终身受益)
- antdvue 表格插入自定义行
- 黑客的google运用技巧
- 串口总线舵机之舵机命令
- 单片机学习——存储器详解(程序存储器、片内RAM、拓展RAM、EEPROM)
- 表格与合并之Excel如何快速合并多个表格数据
- 【Lintcode】1645. Least Subsequences
- 免费搜索引擎登陆入口
- 推荐10个值得一听的国外技术播客
- sklearn 逻辑回归Increase the number of iterations (max_iter) or scale the data as shown in解决方案
- PAT练习 客似云来