深入理解Java抽象类

  基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分那一定是我讲的不够生动,记得留言提醒我。

  好了,没时间了,快上车!

  本篇内容主要讲解Java中的抽象类。那什么是抽象类呢?顾名思义嘛,就是很“抽象”的类,抽象是具体的代名词,就像老板跟你说,大家加油干,努力干活就跟你涨工资,但很多时候都只是光说不做,这就很抽象了(2333),如果要一本正经的说的话,就是带有抽象方法的类,那什么是抽象方法?就是带有abstract关键字修饰的方法,抽象方法只有声明而没有实现,只能由子类去继承实现该方法。说了这么多,不如举个小栗子:

/**
 * @author Frank
 * @create 2017/11/21
 * @description
 */
public abstract class Goods {
 abstract void print();
}

  这里我们仍用Goods类,声明了一个抽象的商品类,可以看到里面有一个被abstract关键字修饰的方法print,所以该方法为抽象方法,带有抽象方法的这个Goods类也就成了抽象类,需要使用abstract关键字修饰。

  抽象类跟普通类几乎完全一样,除了一点,抽象类不能被实例化。

  你也许会问,不能实例化的类拿来干嘛?这你就不懂了吧,显然抽象类就是为继承而生,继承了抽象类的非抽象类必须实现父类的抽象方法,否则只能定义为抽象类,那这样有什么好处呢?这里我们设置一个情景,那就是商品信息展示,需要输出各个商品的一些说明信息,如标题、价格等各种参数,而其中的某些参数并不是所有商品所共有的,比如,屏幕尺寸,续航时间,如果要先获得商品各项信息,然后统一打印显然不太容易实现,所以不如把这个打印的事情交给子类去完成,而父类只需要声明一个抽象类就行了。这就相当于父亲给儿子下达任务,“要想继承我的财产,你们就得先完成这些任务”。

  Goods类下面有手机,电视,电脑等商品,那就再定义三个类,都继承Goods类,这样就能实现对商品的统一管理了。

public class Phone extends Goods {
  //手机类输出
 @Override
 void print() {
  System.out.println("Phone print.");
 }
}
public class Computer extends Goods {
 //电脑类输出
 @Override
 void print() {
  System.out.println("Computer print.");
 }
}
public class Television extends Goods {
 //电视机类输出
 @Override
 void print() {
  System.out.println("Television print.");
 }
}

  三个类定义好了,接下来测试一下:

public class Test {
 public static void main(String[] args) {
  Goods[] goodsList = new Goods[3];
  goodsList[0] = new Phone();
  goodsList[1] = new Computer();
  goodsList[2] = new Television();

  for (Goods g:goodsList)
   g.print();

 }
}

  输出如下:

Phone print.
Computer print.
Television print.

  这个场景好像似曾相识,还记得在之前的继承与多态里的那个栗子吗?是的,所以抽象类跟普通类其实大同小异,在继承上不同的地方就是非抽象子类必须实现抽象父类的抽象方法,而对于普通父类则没有这个要求。

  所以总的来说,抽象类是某一类事物的抽象,当多个类出现相同功能,但是主体不同,这样就可以向上抽象出一个父类,就好比上面的栗子,手机,电脑,电视这些商品都需要打印信息,而这些都有一些共同属性,因此可以抽象出一个商品类,用来统一管理这些商品输出信息,而这个抽象类只是声明一个方法,具体实现由各个子类去覆盖。

  现在我们将我们上面的栗子完善一下,让它看起来不那么鸡肋。在抽象类中定义公有的属性和方法,如title,price,然后在各个子类中定义其特有的属性及方法。

package com.frank.abstractclass;

/**
 * @author Frank
 * @create 2017/11/21
 * @description
 */
public abstract class Goods {
 //定义各个类共有的属性
 private String title;
 private Double price;

 //定义构造器
 public Goods(String title, Double price) {
  this.title = title;
  this.price = price;
 }

 //定义设置器和访问器
 public String getTitle() {
  return title;
 }

 public void setTitle(String title) {
  this.title = title;
 }

 public Double getPrice() {
  return price;
 }

 public void setPrice(Double price) {
  this.price = price;
 }

 //声明抽象打印方法
 abstract void print();
}
ackage com.frank.abstractclass;

/**
 * @author Frank
 * @create 2017/11/21
 * @description
 */
public class Phone extends Goods {
 //定义私有的属性
 private Double screenSize;//屏幕大小
 private Double batteryLife;//续航时间

 //重载构造器
 public Phone(String title, Double price,Double screenSize,Double batteryLife) {
  super(title, price);
  this.screenSize = screenSize;
  this.batteryLife = batteryLife;
 }

 //定义子类特有的方法
 public Double getScreenSize() {
  return screenSize;
 }

 public void setScreenSize(Double screenSize) {
  this.screenSize = screenSize;
 }

 public Double getBatteryLife() {
  return batteryLife;
 }

 public void setBatteryLife(Double batteryLife) {
  this.batteryLife = batteryLife;
 }

 //手机类输出
 @Override
 void print() {
  System.out.println("Phone print------");
  System.out.println("Title:"+getTitle());
  System.out.println("Price:$"+getPrice());
  System.out.println("ScreenSize:"+getScreenSize()+" inches");
  System.out.println("BatteryLife:"+getBatteryLife()+" h");
 }
}
package com.frank.abstractclass;

/**
 * @author Frank
 * @create 2017/11/21
 * @description
 */
public class Television extends Goods {
 //定义子类特有属性
 private Double screenSize;//屏幕尺寸
 private String resolution;//分辨率

 //重载构造器
 public Television(String title, Double price, Double screenSize, String resolution) {
  super(title, price);
  this.screenSize = screenSize;
  this.resolution = resolution;
 }

 public Double getScreenSize() {
  return screenSize;
 }

 public void setScreenSize(Double screenSize) {
  this.screenSize = screenSize;
 }

 public String getResolution() {
  return resolution;
 }

 public void setResolution(String resolution) {
  this.resolution = resolution;
 }

 //电视机类输出
 @Override
 void print() {
  System.out.println("Television print------");
  System.out.println("Title:"+getTitle());
  System.out.println("Price:$"+getPrice());
  System.out.println("ScreenSize:"+getScreenSize()+" inches");
  System.out.println("Resolution:"+getResolution());
 }
}

  接下来测试一下:

package com.frank.abstractclass;

/**
 * @author Frank
 * @create 2017/11/21
 * @description
 */
public class Test {
 public static void main(String[] args) {
  Goods[] goodsList = new Goods[3];
  goodsList[0] = new Phone("IphoneX",9688.00,5.8,24.0);
  goodsList[1] = new Computer("Alienware15C-R2738",17699.00,"i7-7700HQ","GTX1060");
  goodsList[2] = new Television("SAMSUNG UA78KU6900JXXZ",21999.00,78.0,"4K");

  for (Goods g:goodsList)
   g.print();

 }
}

  输出如下:

Phone print------
Title:IphoneX
Price:$9688.0
ScreenSize:5.8inches
BatteryLife:24.0h
Computer print------
Title:Alienware15C-R2738
Price:$17699.0
CPU:i7-7700HQ
GraphicsCard:GTX1060
Television print------
Title:SAMSUNG UA78KU6900JXXZ
Price:$21999.0
ScreenSize:78.0inches
Resolution:4K

  想必现在对于抽象类有了更好的理解了吧。  

  现在做一个小小的总结:

  1,抽象方法一定在抽象类中。

  2,抽象方法和抽象类都必须被abstract关键字修饰。
  3,抽象类不可以用new创建对象,因为存在抽象方法,抽象方法没有具体实现,无法执行。
  4,抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。
  至此,抽象类讲解完毕,欢迎大家继续关注!

以上就是深入理解Java抽象类的详细内容,更多关于Java抽象类的资料请关注我们其它相关文章!

(0)

相关推荐

  • 详解Java中AbstractMap抽象类

    jdk1.8.0_144 下载地址:http://www.jb51.net/softs/551512.html AbstractMap抽象类实现了一些简单且通用的方法,本身并不难.但在这个抽象类中有两个方法非常值得关注,keySet和values方法源码的实现可以说是教科书式的典范. 抽象类通常作为一种骨架实现,为各自子类实现公共的方法.上一篇我们讲解了Map接口,此篇对AbstractMap抽象类进行剖析研究. Java中Map类型的数据结构有相当多,AbstractMap作为它们的骨架实现实

  • Java抽象类的构造模板模式用法示例

    本文实例讲述了Java抽象类的构造模板模式用法.分享给大家供大家参考,具体如下: 一 点睛 模板模式的一些简单规则. 抽象父类可以只定义需要使用的某些方法,而不能实现的部分抽象成抽象方法,留给子类去实现. 父类中可能包含需要调用其他系列方法的方法,这些被调方法既可以由父类实现,也可以由其子类实现.父类里提供的方法只是定义了一个通用算法,其实现也许并不完全由自身实现,而必须依赖器子类的辅助. 二 实战 1 父类 public abstract class SpeedMeter { // 转速 pr

  • Java的抽象方法和抽象类实例详解

    本文实例讲述了Java的抽象方法和抽象类.分享给大家供大家参考,具体如下: 一 点睛 抽象方法是只有方法签名,没有方法实现的方法. 抽象方法和抽象类必须使用abstract修饰符来定义,有抽象方法的类只能被定义为抽象类,抽象类里可以没有抽象方法. 抽象类和抽象方法的规则: 抽象类必须使用abstract修饰符来修饰,抽象方法必须使用abstract修饰符来修饰,抽象方法不能有方法体. 抽象类不定被实例化.即使抽象类里不包含抽象方法,这个抽象类也不能创建实例. 抽象类可以包含成员变量.方法(普通方

  • Java抽象类原理与用法实例详解

    本文实例讲述了Java抽象类原理与用法.分享给大家供大家参考,具体如下: 一.抽象类的基本概念 普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法.普通方法.static方法.常量和变量等内容.而抽象类是指在普通类的结构里面增加抽象方法的组成部分. 那么什么叫抽象方法呢?在所有的普通方法上面都会有一个"{}",这个表示方法体,有方法体的方法一定可以被对象直接使用.而抽象方法,是指没有方法体的方法,同时抽象方法还必须使用关键字abstract做修饰. 而拥

  • 浅谈java IO流——四大抽象类

    IO所谓的四大抽象类就是: InputStream.OutputStream.Reader.Writer InputStream:字节输入流的父类,数据单位为字节. 常用方法: int read();    从输入流中读取下一个字节 void close();   关闭流  OutputStream:字节输出流的父类,数据单位为字节. 常用方法: void write(int b);  将一个integer数组长度写入此流  void flush();   刷新此流  void close();

  • JAVA抽象类和抽象方法(abstract)实例分析

    本文实例讲述了JAVA抽象类和抽象方法(abstract).分享给大家供大家参考,具体如下: 一.抽象(abstract)的使用 当父类的某些方法不确定时,可以用abstract关键字来修饰该方法[抽象方法],用abstract来修饰该类[抽象类]. 我们都知道,父类是将子类所共同拥有的属性和方法进行抽取,这些属性和方法中,有的是已经明确实现了的,有的还无法确定,那么我们就可以将其定义成抽象,在后日子类进行重用,进行具体化.这样,抽象类也就诞生了. 例如,定义了"动物"父类,其中&qu

  • Java抽象类的概念讲解

    简单来说 抽象类通常用来作为一个类族的最顶端的父类,用最底层的类表示现实中的具体事物,用最顶层的类表示该类族所有事物的共性.用abstract关键字类修饰一个类,该类叫做抽象类. 有抽象类那么肯定也有抽象方法,什么是抽象方法呢? 抽象方法就是有名字,形参列表,返回值,没有方法体的方法就做抽象方法. 抽象方法和抽象类的关系? 凡是没有方法体的方法必须使用关键字abstract修饰为抽象方法. 凡是含有抽象方法的类必须声明为抽象类. abstract class A{ abstract public

  • 详解JAVA 抽象类

    在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量.成员方法和构造方法的访问方式和普通类一样. 由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用.也是因为这个原因,通常在设计阶段决定要不要设计抽象类. 父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法. 在Java中抽象类表示的是

  • Java中接口和抽象类的区别详解

    需求:接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承实体类(concrete class)?抽象类中是否可以有静态的main方法? 先说明二者的定义,然后聊聊需求,最后分析二者的区别. 含有abstract修饰符的类即为抽象类,抽象类不能创建实例对象.含有抽象方法的类必须定义为abstract class.在abstract class中,方法不必是抽象的,但是抽象方法必须在具体子类中实现,所以,不能有抽象构造方法或抽象静态方法.子类如果没有实现抽象父类中的所

  • 深入理解Java抽象类

    基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分那一定是我讲的不够生动,记得留言提醒我. 好了,没时间了,快上车! 本篇内容主要讲解Java中的抽象类.那什么是抽象类呢?顾名思义嘛,就是很"抽象"的类,抽象是具体的代名词,就像老板跟你说,大家加油干,努力干活就跟你涨工资,但很多时候都只是光说不做,这就很抽象了(2333),如果要一本正经的说的话,就是带有抽象方法的类,那什么是抽象

  • 深入理解JAVA抽象类和接口的比较与异同

    目录 一.理解抽象类 二.从语法定义层面看抽象类和接口 三.从编程的角度看抽象类和接口 四.从设计理念层面看抽象类和接口 五.总结 抽象类(abstract class)和接口(interface)是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力.抽象类和接口之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于抽象类和接口的选择显得比较随意.其实,两者之间还是有很大的区别的,对于它们的

  • 浅谈Java抽象类和接口的个人理解

    今天来说一波自己对Java中抽象类和接口的理解,含参考内容: 一.抽象类 1.定义: public abstract class 类名{} Java语言中所有的对象都是用类来进行描述,但是并不是所有的类都是用来描述对象的.我所理解的抽象类其实就是对同一类事物公共部分的高度提取,这个公共部分包括属性和行为.比如牛.羊.猪它们的公共属性是都有毛,公共行为是都哺乳,所以我们可以把公共部分抽象成一个哺乳类,含有属性毛和行为哺乳,当牛.羊.猪继承了哺乳类后也就有了哺乳的功能,至于怎么完成这个功能就需要自己

  • Java深入数据结构理解掌握抽象类与接口

    目录 abstract abstract修饰方法 抽象类的匿名子类对象 final关键字 接口 接口相关规则 接口的特性 抽象类和接口的异同 内部类 总结 abstract abstract介绍:可以用于修饰:类(抽象类).方法(抽象方法) abstract修饰类: ①此类不能实例化(也就是不能创建这个类的对象) ②虽然自己不能实例化,但是子类会调用父类的构造器,所以抽象类中一定有构造器 abstract修饰方法 ①抽象方法只有方法的声明没有方法体,所在的类一定是抽象类.因为如果类不是抽象的,那

  • 深入理解Java 对象和类

    Java作为一种面向对象语言.支持以下基本概念: •多态 •继承 •封装 •抽象 •类 •对象 •实例 •方法 •消息解析 本节我们重点研究对象和类的概念. •对象:对象是类的一个实例,有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有:摇尾巴.叫.吃等. •类:类是一个模板,它描述一类对象的行为和状态. Java中的对象 现在让我们深入了解什么是对象.看看周围真实的世界,会发现身边有很多对象,车,狗,人等等.所有这些对象都有自己的状态和行为. 拿一条狗来举例,它的状态有

  • 深入理解Java中的接口

    一. 为什么要使用接口 假如有一个需求:要求实现防盗门的功能.门有"开"和"关"的功能,锁有"上锁"和"开锁"的功能. 分析:首先防盗门是一个门,门有开门和关门的功能,还有一把锁,锁有开锁和上锁,按照面向对象的编程的思想,我们会将门和锁都作为一个类而单独存在,但是,不能让防盗门继承自门的同时又继承自锁,防盗门不是锁,不符合继承中is a的关系,在java中支持单继承.那么我们如何来解决这一问题,这时就要用到接口. 二. 什么是

  • 深入理解java三种工厂模式

    适用场合: 7.3 工厂模式的适用场合 创建新对象最简单的办法是使用new关键字和具体类.只有在某些场合下,创建和维护对象工厂所带来的额外复杂性才是物有所值.本节概括了这些场合. 7.3.1 动态实现 如果需要像前面自行车的例子一样,创建一些用不同方式实现同一接口的对象,那么可以使用一个工厂方法或简单工厂对象来简化选择实现的过程.这种选择可以是明确进行的也可以是隐含的.前者如自行车那个例子,顾客可以选择需要的自行车型号:而下一节所讲的XHR工厂那个例子则属于后者,该例中所返回的连接对象的类型取决

  • java 抽象类与接口的区别总结

    java 抽象类与接口的区别总结 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于 abstract class和interface 选择显得比较随意. 其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的 理解

  • 深入理解Java反射

    要想理解反射的原理,首先要了解什么是类型信息.Java让我们在运行时识别对象和类的信息,主要有2种方式:一种是传统的RTTI,它假定我们在编译时已经知道了所有的类型信息:另一种是反射机制,它允许我们在运行时发现和使用类的信息. 1.Class对象 理解RTTI在Java中的工作原理,首先需要知道类型信息在运行时是如何表示的,这是由Class对象来完成的,它包含了与类有关的信息.Class对象就是用来创建所有"常规"对象的,Java使用Class对象来执行RTTI,即使你正在执行的是类似

  • 深入理解Java编程线程池的实现原理

    在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 在Java中可以通过线程池来达到这样的效果.今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPoolExecutor类中的方法讲起,

随机推荐