java语言,声明类时格式为: abstract class Db{} 说明Db类为抽象类。抽象方法是说没有方法的实现(方法体)此方法为抽象方法,只有抽象类和接口中才可以有抽象方法。简而言之,含有抽象方法的类一定是抽象类;关键字是abstract

抽象类本质

1.从类的组成上看其是抽象方法和非抽象方法的集合,还有属性(常量)。
2.从设计的角度来看,实际上抽象类定义了一套规范(抽象方法)。(规范)

使用规则

  1. 抽象类必须被继承,抽象方法必须被重写。
  2. 抽象类中的抽象方法只需声明,无需实现,没有方法体;
  3. 抽象类不能被实例化,抽象类不一定要包含抽象方法,而定义抽象方法的类必须是抽象类。
  4. 抽象类包含的抽象方法必须在其子类中被实现,否则该子类也必须是抽象类。
  5. 抽象类可以有构造方法供子类实例化对象
  6. 抽象类不能直接实例化使用,一般用的是抽象类的子类,
    A a = new B();
    A和B之间的关系,继承关系,接口实例关系。

下面逐条解释:

规则一

抽象类必须被继承,抽象方法必须被重写。

规则二

抽象类中的抽象方法只需声明,无需实现,没有方法体。
在Java中抽象类实际上是一种规范,一般在抽象类中声明方法不直接提供方法体(当然也可以提供),而是通过其子类去重写其抽象方法:

package day_12_01.abs;

/**
* @author soberw
*/
public abstract class A {
//报错,不能定义抽象属性
// abstract int a; //可以声明属性
private int a;
//可以声明一个普通方法
public void a(){ }
//报错,因为抽象方法不能有方法体,即不能去实现
// public abstract void aa(){
//
// }
//抽象方法正确格式
public abstract void aa(); //抽象方法不能是私有的private
// private abstract void bb();
}
//没有重写父类的抽象方法aa(),报错
//class B extends A{
//
//}

注意

抽象方法不能是私有的private,因为一旦私有,子类就不能重写了,但这违背了抽象方法必须被重写的原则。

规则三

抽象类不能被实例化,抽象类不一定要包含抽象方法,而定义抽象方法的类必须是抽象类。
首先,抽象类不能被实例化,当一个类实例化对象后,这个对象就可以调用类中的属性或者方法了,但在抽象类有抽象方法(没有方法体),无法调用。自相矛盾,所以无法实例化。比如,我想实例化上例中的抽象类A:

class TestA{
public static void main(String[] args) {
//报错
// A a = new A();
}
}

抽象类不一定有抽象方法,这点显而易见,但是意义不大:

//一个空的抽象类
abstract class AA{ }

然后,定义抽象方法的类必须是抽象类,这点也很好理解,一个普通的类是可以被实例化的,如果这个普通类存在抽象方法,那我是不是就可以通过对象去调用呢?当然不能。

package day_12_01.abs;

/**
* @author soberw
*/
//报错,因为抽象方法必须声明在抽象类中
//public class B {
// public abstract void b();
//}

规则四

抽象类包含的抽象方法必须在其子类中被实现,否则该子类也必须是抽象类。
还拿上述代码做例子,如果我声明了一个类B,继承于A,那B就必须重写A中的抽象方法,否则报错(因为普通类中不能有抽象方法),解决方式一:重写父类抽象方法;解决方式二:将B声明为abstract:

//解决方式一:重写父类抽象方法
class B extends A{
@Override
public void aa() { }
}
//解决方式二:将B声明为abstract
abstract class Bb extends A{ }

规则五

抽象类可以有构造方法供子类实例化对象。
这点很好理解,因为首先可以确定的是,Java中所有的类都有构造方法,即使你是抽象类,虽然我们没写,但其实系统已经默认给我们提供了一个无参的空构造器,例如下面我显示化的在抽象类中声明一个构造方法:

package day_12_01.abs;

/**
* @author soberw
*/
public abstract class Ab {
public Ab(){
System.out.println("Abs......");
}
}
class Abs extends Ab{ }
class Test{
public static void main(String[] args) {
Abs abs = new Abs();
}
}

运行结果:

证明我们在创建子类实例化对象时,父类的构造器也可实现(哪怕父类是抽象类)

规则六

抽象类不能直接实例化使用,一般用的是抽象类的子类。
抽象类不能去实例化对象,那如果我想用其中的一些非抽象方法呢,比如静态方法,比如普通方法呢或者是属性?
我们可以通过继承关系,去创建其子类的对象,形如:

A a = new B(); //其中A是父类,B是子类

package day_12_01.abs;

/**
* @author soberw
*/
public abstract class TT { String some = "hello"; public static void talk() {
System.out.println("talk...");
} public void say() {
System.out.println("say..." + some);
}
} class FF extends TT{ }
class FFTest{
public static void main(String[] args) {
TT.talk();
TT f = new FF();
f.say();
}
}

运行结果:

如果子类重写了父类的非抽象方法,那实际调用的就是子类重写后的。通过子类去调用父类的方法,即通过父类去new一个子类的对象,这实际上也是多态性的一种体现。当然了,抽象类中的静态方法是可以直接调用的(除非是私有的),实际上对任何类都一样。

浅谈Java面向对象之抽象类(abstract)的更多相关文章

  1. Java面向对象之抽象类abstract 入门实例

    一.基础概念 抽象事物,是若没有具体的信息可以描述这个事物,这个事物可以称为抽象事物. 抽象类,是不断的向上抽取而来.抽取方法声明而不确定具体的方法内容.由不同的子类来完成具体的方法内容. (一)抽象 ...

  2. 浅谈Java面向对象思想

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  3. 浅谈Java中接口与抽象类的异同

    浅谈Java中接口与抽象类的异同 抽象类和接口这两个概念困扰了我许久,在我看来,接口与抽象类真的十分相似.期间也曾找过许许多多的资料,参考了各路大神的见解,也只能是简简单单地在语法上懂得两者的区别.硬 ...

  4. 浅谈Java接口(Interface)

    浅谈Java接口 先不谈接口,不妨设想一个问题? 如果你写了个Animal类,有许多类继承了他,包括Hippo(河马), Dog, Wolf, Cat, Tiger这几个类.你把这几个类拿给别人用,但 ...

  5. 浅谈JAVA集合框架

    浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...

  6. !! 浅谈Java学习方法和后期面试技巧

    浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要 ...

  7. 浅谈Java的集合框架

    浅谈Java的集合框架 一.    初识集合 重所周知,Java有四大集合框架群,Set.List.Queue和Map.四种集合的关注点不同,Set 关注事物的唯一性,List 关注事物的索引列表,Q ...

  8. 浅谈java类集框架和数据结构(2)

    继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...

  9. 浅谈Java的默认和静态方法

    目录 浅谈Java的默认和静态方法 Java新增默认方法有啥用 Java新增的静态方法有啥用 浅谈Java的默认和静态方法 允许在接口中声明默认方法和静态方法,是JDK1.8新增的特性.存在即合理,两 ...

随机推荐

  1. 微信小程序--数据共享与方法共享

    目录 全局数据共享 Mobox npm安装及其注意事项 小程序对 npm 的支持与限制 npm 依赖包的安装与使用 Mobox 1. 全局数据共享 2. 小程序中的全局数据共享方案 3. 使用mobx ...

  2. Flask_响应(四)

    响应即视图函数的返回值,前面的例子的返回值都很简单,直接返回值.但是Flask Http协议的返回值中通常还会有以下几种不同的方式. 一.return元组 通过return一个元组构造响应信息. 语法 ...

  3. nginx中请求大小的限制的设置

    Nginx对客户端请求缓冲区大小有个默认限制,如果超过了该值(比如在上传大文件时),会报500错误. 只需要设置三个值,就可以解决该问题: 1. client_body_buffer_size: 指定 ...

  4. SYCOJ137斜线输出(1)

    题目-斜线输出(1) (shiyancang.cn) 在同一斜线上的满足方程.坐标关系计算即可. #include<bits/stdc++.h> using namespace std; ...

  5. 华为HMS Core全新推出会员转化&留存预测模型

    现在,付费学知识,付费听歌,付费看电视剧,付费享受线上购物优惠--等等场景已经成为大部分年轻人的日常. 而对于企业商家来说,付费会员作为企业差异化用户运营的手段,不仅有利于提升用户的品牌忠诚度,在当下 ...

  6. MongoDB-基础知识学习(一)

    概述 最近mongodb在互联网的活跃度直线上升,并且我们公司也使用了mongoDB 3.6 作为生产重要的数据库,我们项目组要监控mongodb的op.log日志,在此整理以前学习的知识,为以后备份 ...

  7. 论文翻译:2020_FLGCNN: A novel fully convolutional neural network for end-to-end monaural speech enhancement with utterance-based objective functions

    论文地址:FLGCNN:一种新颖的全卷积神经网络,用于基于话语的目标函数的端到端单耳语音增强 论文代码:https://github.com/LXP-Never/FLGCCRN(非官方复现) 引用格式 ...

  8. day 17 i++优先级大于 *i

    (1).有下列定义语句,int *p[4];以下选项中与此语句等价的是[C] (A).int p[4]; (B).int **P; (C).int *(p[4]); (D).int (*p)[4]; ...

  9. Linux下Julia安装

    1.找到官网,执行 wget https://julialang-s3.julialang.org/bin/linux/x64/1.4/julia-1.4.0-linux-x86_64.tar.gz ...

  10. 我以订披萨为例,给女朋友详细讲了Java设计模式的3种工厂模式

    摘要:工厂模式是将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦.从而提高项目的扩展和维护性. 本文分享自华为云社区<[Java设计模式]用 披萨订购案例 详 ...