【11】java之抽象类
一、抽象类基本概念
1.1 抽象类
抽象类:是指在普通类的结构里增加抽象方法的组成部分,抽象类要使用 abstract 声明。
抽象方法:没有方法体且必须使用 abstract 关键字进行定义。
拥有抽象方法的类一定是抽象类。
抽象类的使用原则如下:
- 抽象类必须有子类,即每一个抽象类一定要被子类所继承;
- 抽象类的子类(子类不是抽象类)必须要覆写抽象类里的抽象方法;
- 抽象类的对象实例化需要依靠子类完成,采用向上转型的方式处理。
范例:正确使用抽象类
abstract class A{
public void print(){
System.out.println("A、print()");
}
public abstract void fun();
}
class B extends A{
public void fun(){
System.out.println("B、fun()");
}
}
public class TestDemo{
public static void main(String args[]){
A a = new B();
a.fun();
}
}
1.2 总结
1、抽象类继承子类里会有明确的方法覆写要求,而普通类没有;
2、抽象类只比普通类多了一些抽象方法的定义,其他的组成部分和普通类完全一样;
3、普通类对象可以直接实例化,但是抽象类必须经过向上转型后才能实例化。
虽然一个子类可以去继承任何一个普通类,但是从开发的实际要求来讲,普通类不要去继承另外一个普通类,只能继承抽象类 或 接口。
二、抽象类的相关限制
1、抽象类中有构造方法吗?
有。抽象类会存在一些属性,那么在抽象类之中一定会存在构造方法,目的:为属性初始化,并且子类对象实例化的时候依然满足于先执行父类构造,再调用子类构造的情况。
2、抽象类能使用 final 定义吗?
不能。因为 final 定义的类不能被继承,而抽象类必须有子类,所以不能。
3、抽象类能用 static 定义吗?
外部抽象类不允许使用 static 声明,而内部的抽象类可以使用 static 声明。
使用 static 声明的内部类就相当于是一个外部抽象类,继承的时候使用“外部类.内部类”的形式表示类名称。
4、抽象类能否有 static 修饰的方法,此类是否需要被继承?
任何情况下,如果要执行类中的 static 方法的时候,都可以在没有对象的时候直接调用,对于抽象类也是一样。
此时可以没有子类。
5、有些时候,由于抽象类只需要一个特定的系统子类操作,所以可以忽略掉外部子类。
abstract class A{
public abstract void print();
private class B extends A{
public void print(){
System.out.println("Hello World!");
}
}
public static A getInstance(){
return new B();
}
}
public class TestDemo{
public static void main(String args[]){
A a = A.getInstance();
a.print();
}
}
这样的设计在系统类库之中会比较常见,目的是为用户隐藏不需要知道的子类。
对于之前有一个遗留的问题,那么下面看一段代码,分析代码的执行结果:
abstract class A{
public A(){
this.print();
}
public abstract void print();
}
class B extends A{
private int num = 100;
public B(int num){
this.num = num;
}
public void print(){
System.out.println("num = " + this.num);
}
}
public class TestDemo{
public static void main(String[] args){
new B(30);
new B(30).print();
}
}
执行结果:num = 0 和 num = 0 、 num = 30。
分析:在任何一个类的构造执行完之前所有属性的内容都是其对应数据类型的默认值,而子类构造执行之前一定先执行父类构造,那么此时子类构造没有执行完,所以 num 为 0。
三、抽象类应用——模板设计
例如,现在有三类事物:
- 机器人:充电、工作;
- 人:吃饭、工作、睡觉;
- 猪:吃饭、睡觉。
要求可以实现以上的操作控制,即可以任意的控制人、机器人、猪的操作行为(吃、工作、睡觉)。
【分析】
**这三类事物有一个共通的表现:行为。**具备相同的行为。
行为是抽象的概念,可以通过 abstract 描述。
abstract class Action{
public static final int EAT = 1;
public static final int WORK = 5;
public static final int SLEEP = 7;
abstract void eat();
abstract void work();
abstract void sleep();
public void command(int flag){
switch(flag){
case EAT:
this.eat();
break;
case WORK:
this.work();
break;
case SLEEP:
this.sleep();
break;
case EAT + WORK:
this.eat();
this.work();
break;
}
}
}
class Robot extends Action{
public void eat(){
System.out.println("机器人在充电。");
}
public void work(){
System.out.println("机器人在工作。");
}
public void sleep(){}
}
class Human extends Action{
public void eat(){
System.out.println("人在吃饭。");
}
public void work(){
System.out.println("人在工作。");
}
public void sleep(){
System.out.println("人在睡觉。");
}
}
class Pig extends Action{
public void eat(){
System.out.println("猪在吃饭。");
}
public void work(){
}
public void sleep(){
System.out.println("猪在睡觉。");
}
}
public class TestDemo{
public static void main(String args[]){
fun(new Robot());
fun(new Human());
fun(new Pig());
}
public static void fun(Action action){
action.command(Action.EAT);
action.command(Action.WORK);
action.command(Action.SLEEP);
}
}
这些不同的类型最终都在行为上成功的进行了抽象,即如果要想使用行为操作,那么就必须按照Action类的标准来实现子类。
模板设计思路:基类提供多个抽象方法和1个公共的普通方法,这个公共的普通方法会根据用户发出的请求不同,调用不同的抽象方法功能(并且每个子类有不同的实现)。
四、总结
1、如果要使用类继承,那么就使用抽象类(20%的情况下可能这样使用);
2、抽象类强制规定了子类必须要做的事情,而且可以与抽象类的普通方法相配合;
3、不管抽象类如何努力都有一个天生最大的问题:单继承局限。
【11】java之抽象类的更多相关文章
- JAVA:抽象类VS接口
JAVA中抽象类和接口的区别比较,以及它们各自的用途. 1.JAVA抽象类: 抽象类除了不能实例化以外,跟普通类没有任何区别.在<JAVA编程思想>一书中,将抽象类定义为“包含抽象方法的类 ...
- 转:二十一、详细解析Java中抽象类和接口的区别
转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...
- 关于JAVA中抽象类和接口的区别辨析
今天主要整理一下新学习的有关于Java中抽象类和接口的相关知识和个人理解. 1 抽象类 用来描述事物的一般状态和行为,然后在其子类中去实现这些状态和行为.也就是说,抽象类中的方法,需要在子类中进行重写 ...
- [ Java学习基础 ] Java的抽象类与接口
一.抽象类 1. 抽象类 Java语言提供了两种类:一种是具体类:另一种是抽象子类. 2. 抽象类概念: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的 ...
- java中抽象类的定义和使用
java虽然比较简单,但是细节的知识点还是很多的,现在,介绍一下抽象类的定义和实现基础. 指的是在类中定义方法,而不去实现它,而在它的子类中去具体实现,继承抽象类的子类必须实现父类的抽象方法,除非子类 ...
- Java基础-抽象类和接口
抽象类与接口是Java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 抽象定义: 抽象 ...
- JAVA的抽象类和接口
抽象类 在面向对象的概念中,所有的对象都是通过类来描述的,但是反过来,并不是所有的类都是用来描述对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类除了不能实例化对 ...
- 【Java】-NO.11.Java.1.Log4j.1.001-【Log4j Manual】-
1.0.0 Summary Tittle:[Java]-NO.11.Java.1.Log4j.1.001-[Log4j2 Manual]- Style:Java Series:Log4j Since: ...
- Java-Runoob-高级教程-实例-方法:11. Java 实例 – enum 和 switch 语句使用
ylbtech-Java-Runoob-高级教程-实例-方法:11. Java 实例 – enum 和 switch 语句使用 1.返回顶部 1. Java 实例 - enum 和 switch 语句 ...
- Java-Runoob-高级教程-实例-数组:11. Java 实例 – 删除数组元素
ylbtech-Java-Runoob-高级教程-实例-数组:11. Java 实例 – 删除数组元素 1.返回顶部 1. Java 实例 - 删除数组元素 Java 实例 以下实例演示了如何使用 ...
随机推荐
- 自研ORM框架 实现类似EF Core Include 拆分查询 支持自定义条件、排序、选择
Baozi, I'm Mr.Zhong I like to brush TikTok, I know that anchors like to call it that, haha!Recently, ...
- css实习滤镜效果(背景图模糊)
模糊实例 图片使用高斯模糊效果: img { -webkit-filter: blur(5px); /* Chrome, Safari, Opera */ filter: blur(5px); } c ...
- IDEA中给源码添加自己注释——private-notes插件安装使用
一.前言 我们在空闲之余喜欢研究一些经典框架的源码,发现没办法把自己的注释添加上. 会给出提示:File is read-only 很烦,但是为了安全考虑也是没有办法的! 这是一个大佬就写了一个IDE ...
- MSIC总结取证分析——日志分析
MSIC总结取证分析 一.日志分析: 1.常见日志分析类型: 2.常见一些考点: (1)还原特定IP攻击手段(SQL注入.暴力破解.命令执行等),或还原最初攻击时间: (2)寻找flag或者特定文件解 ...
- &#127538;Eclipse通过jdbc连接数据库制作简单登陆界面【新手必看】
一.前言: 做网站开发,要求有多种搭配方式,前台技术可以使用PHP.ASP.JSP.ASP.NET.CGI等任何一种: 需要用到的基础语言用的最多的就是HTML/CSS.JS.JAVA.XML这些了, ...
- Volcano 社区 v1.7.0 版本正式发布 | 云原生批量计算
摘要:北京时间2023年1月9日,Volcano社区v1.7.0版本正式发布. 本文分享自华为云社区<Volcano 社区 v1.7.0 版本正式发布 | 云原生批量计算>,作者:华为云云 ...
- 结构型模式 - 代理模式Proxy
学习而来,代码是自己敲的.也有些自己的理解在里边,有问题希望大家指出. 代理模式的定义与特点 代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问.这时,访问对象不 ...
- immutable.js学习笔记(八)----- immutable.js对象 和 原生对象的相互转换
一.原生对象转换为immutable.js对象 fromJS 栗子一: 栗子二: 如果数组里面有对象,对象里面有数组,怎么转换呢 复杂结构的转换 二.immutable.js对象转换为原生对象 toJ ...
- Flex布局专题
Flex布局专题 参照 https://www.runoob.com/w3cnote/flex-grammar.html 下面是自己看代码的一下 小结,和认识,加笔记,加原文 认识容器 flex布局需 ...
- Downie V4.6.4 for Mac 视频下载工具
前言 Downie是Mac下一个简单的下载管理器,可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们. ![在这里插入图片描述](https://p3-jue ...