Java Q&A: 抽象类和接口 - 实战练习

java 抽象类与接口的练习 java 抽象类与接口的练习,包括代码及注释,个人笔记 立即下载

 

Java Q&A: 抽象类和接口- 实战练习

在Java中,什么时候该用抽象类,什么时候该用接口?下面的文章将通过实例,而不是从理论的角度给你一个清晰的回答,让你有可能获得醍醐灌顶般的彻悟。以下是原文翻译。

----------------------------------------------------

针对2001年4月的 "抽象类和接口" 一文,读者给予了积极的反馈。

其中经常提到的一个要求是,希望能够提供一个完整的例子,来说明到底该如何使用接口(interface)和抽象类(abstract class)。看来,我上次的回答过于理论化了。所以,在本次Java Q&A专题中,我将通过一个使用了接口和抽象类的程序实例,将这一讨论继续深化。

进行网络通信编程时,大家会发现,通信往往是通过 "成对的键和值" (key/value pair,以下称为 "键/值对")的传输来完成的。HTTP POST和HTTP GET都采用了 "键/值对" 通信。和WebMethod这样的EAI服务器通信,"键/值对" 通信也是一种选择的机制。甚至在使用Java特性时也可以看到 "键/值对"。"键/值对" 无处不在。

"键/值对" 通信之所以常见,在于它可以通过简单的机制赋予数据以含义。虽然简单,但对于每种协议来说,将 "键/值对" 数据放到线路上的方式却各不相同。如果想和Web服务器通信,你会使用URLConnection来和服务器进行HTTP连接。其它类型的通信则需要你使用其它某种方式。本专题中,我将演示如何使用接口和抽象类来生成一个程序框架,使得这个程序可以和任何支持 "键/值对" 消息的服务器通信。

对"键/值对" 通信可以提取两种抽象。第一,传送给接收者的 "键/值对" 数据构成一条Message。第二,消息是通过某种协议传送给服务器的。可以将这种协议抽象为MessageBus。所以,假如要和Web服务器通信,可以通过HTTP MessageBus传送消息。

被传送的消息以及传送消息的机制会经常变化,至少不同程序之间是这样。当你确信某个东西会经常发生变化时,它就是接口的最好选择。

下面一一分析我们的消息发送程序所需要的各个接口。

MessageBus
从下面的代码可以看到,MessageBus知道它能够将一个二维数组类型的 "键/值对" 传送给某个接收者。但要注意,这个接口并没有说如何传送或者传送给谁。相反,这些细节留给了实现这个接口的类:

public interface MessageBus {
    public String sendMessage( String [][] values ) throws BusException;
}

这个接口使用起来功能十分强大。你可以用URLConnections来实现它,以进行HTTP通信;也可以通过socket,用自定义协议来实现它;你甚至可以只是将数据记录到普通文件或数据库中。

总之,这个接口允许你建立多种不同的实现。更进一步来说,采用接口而不是某个特定的实现来进行编程,你就能够尽享多态所带来的好处,可以在你的程序中随意更换各种不同的实现。

举例来说,当想调试程序时,你可以将一个 "HTTP MessageBus实现" 替换成一个 "通信记录实现"。这种方法使得你可以轻松地改变程序的工作方式,而无需对原始程序做大量的修改。任何时候需要支持一种新的通信方式,只需简单地建立一个新的MessgaeBus实现就可以了。

Message
下面的示例代码中,Message只知道可以通过MessageBus将自己传送出去。它的具体实现才会去考虑如何得到Message的值。

注意:你不可能找到一个用于获得Message值的函数。相反,我们让Message完全包装它的数据,并且相信它可以将自己正确地放到MessageBus上:

public interface Message {
    public String send( MessageBus mb ) throws BusException;
}

MessageBus使得你可以在支持MessageBus的程序中增加新的通信机制;与此类似,Message使得你任何时候可以在程序中增加新的Message类型。

HttpMessageBus
看下面一个具体的MessageBus实现,它通过HTTP来POST消息:

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLDecoder;
import java.net.URLEncoder;
/**
* HttpMessageBus是一个MessageBus实现,
* 它采用HTTP POST来发送消息。
* @author  Tony Sintes JavaWorld Q&A
*/
public class HttpMessageBus implements MessageBus {

    private String _url;
   
    private final static String _KEY_VALUE_DELIM = "=";
    private final static String _NEW_KEY_VALUE   = "&";
    private final static String _ENCODING = "application/x-www-form-urlencoded";
    private final static String _TYPE     = "Content-Type";
    private final static int _KEY   = 0;
    private final static int _VALUE = 1;
   
    public HttpMessageBus( String url )
    {
        _url = url;
    }

    public String sendMessage( String[][] values ) throws BusException
    {
        String post = _formulatePOST( values );
        try
        {
            return _sendPOST( post );
        }
        catch( MalformedURLException exception )
        {
            throw new HttpBusException( exception.getMessage() );
        }
        catch( IOException exception )
        {
            throw new HttpBusException( exception.getMessage() );
        }
    }
   
    private String _formulatePOST( String [][] values ) {
        if( ( values == null ) || ( values.length == 0 ) )
        {
            return "";
        }
       
        StringBuffer sb = new StringBuffer();
        String new_pair = "";
       
        for( int i = 0; i < values.length; i ++ )
        {
            sb.append( new_pair );
            sb.append( URLEncoder.encode( values[i][_KEY] ) );
            sb.append( _KEY_VALUE_DELIM );
            sb.append( URLEncoder.encode( values[i][_VALUE] ) );
            new_pair = _NEW_KEY_VALUE;
        }
    
        String post = sb.toString();
        return post;
    }
   
    private String _sendPOST( String post ) throws MalformedURLException, IOException
    {   
        URLConnection conn = _setUpConnection();
        _write( post, conn );
        return _read( conn );
    }
   
    private URLConnection _setUpConnection() throws MalformedURLException, IOException
    {
        URL url = new URL( _url );
        URLConnection conn = url.openConnection();
       
        conn.setDoInput ( true );
        conn.setDoOutput ( true );
        conn.setUseCaches ( false );
        conn.setRequestProperty( _TYPE, _ENCODING );
      
        return conn;
    }
   
    private void _write( String post, URLConnection conn ) throws IOException
    {
        DataOutputStream output = new DataOutputStream ( conn.getOutputStream() );
        output.writeBytes( post );
        output.flush ();
        output.close ();
    }
   
    private String _read( URLConnection conn ) throws IOException
    {  
        BufferedReader input =
            new BufferedReader( new InputStreamReader( conn.getInputStream() ) );
        String temp_string;
        StringBuffer sb = new StringBuffer();
        while ( null != ( ( temp_string = input.readLine() ) ) )
        {
            sb.append( temp_string );
        }
        input.close ();
       
        return sb.toString();
    }
   
}

大家可以自己研究一下这段代码。关于POST,可以在Java World网站的Java Tip栏目中找到很多介绍。在此我要强调的是,在一个简简单单的MessageBus接口背后,隐藏了大量的细节。HttpMessageBus在构造时只是简单地取了一个URL;传给sendMessage()的所有值都发送到那个URL。除此之外的任何细节都隐藏在接口之后。

AbstractMessage
写过几个Message实现之后就会发现,send()可以分解为两个基本步骤:

1. 将Message的内部数据转换成二维数组。

2. 在MessageBus上发送数组值。这是通过调用MessageBus的sendMessage()并传给它二维数组参数来实现的。

每次写一个新的Message实现,都要写类似的send()。

若能合理地使用抽象类,你将能够很轻松地写出新的Message实现并消除冗余代码。看看下面这个AbstractMessage的定义:

public abstract class AbstractMessage implements Message
{

    public String send(MessageBus mb) throws BusException
    {
        String [][] values = values();
        String response = mb.sendMessage( values );
        return response;
    }
   
    protected abstract String [][] values();
   
}

从上面可以看到,AbstractMessage为send()提供了一个缺省实现。这一缺省实现带来三大好处:

· 你无需一遍又一遍地写相同的代码。相反,现在有了一个缺省实现,它可以完成前面所定义的那两步基本操作。

· 现在,你只用提供一个values()的实现就可以写出一个新的Message。这种方式下,子类只需要知道如何将自身表示为 "键/值对" 数组就可以了。子类不必关心如何在线路上传送自己。传送的动作对任何Message来说都是相同的。

继承(inheritance)的一个重要用途在于,它可以用于 "根据差异来编程" (programming by difference)的场合。根据差异去编程,也就确定了子类与它的父类如何不同。例如Message,它和父类的差异仅仅在于所包含的数据不同,在线路上传送的方式则是一样的。采用抽象类,使得我们可以干净清晰地使用继承。

· AbstractMessage实际定义了一个规范,通过子类来定义新的Message时都要遵守这一规范。这样一来,程序员在建立子类时就可以清楚地知道需要重新实现哪些函数。上面的例子虽然很简单,但采用这种编程方法使得在派生复杂的子类时,事情会变得更简单。

随着一个类越变越大,以上三点也会更趋明显。

Message示例
假设有一个网站提供股票行情服务。若想查找一支股票信息,就要对某一URL发送POST命令。除了URL之外,还要附上股票代号的名称。

股票代号的 "键/值对" 看起来象这样:

ticker=bvsn

此处的ticker是 "键",bvsn是 "值"。键告诉接收者,值bvsn是一个股票代号。

如果在Yahoo查看股票行情,你要发送这样的URL:

http://finance.yahoo.com/q

以及两对键/值:

· s - 股票代号
· d - 查看级别(基本信息,详细信息等)

所以,想要查看bvsn,需要POST下面的消息:

http://finance.yahoo.com/q?s=bvsn&d=v1

类似地,如果是Quicken的股票行情系统,你得发送这样的URL:

http://www.quicken.com/investments/quotes/

以及一对键/值:

symbol - 股票代号

所以,在Quicken查看bvsn,需要POST下面的消息:

http://www.quicken.com/investments/quotes/?symbol=bvsn

下面的代码是针对这两种Message的实现:

public class YahooStockQuote extends AbstractMessage {

    private String _ticker;
   
    private final static String _TICKER_KEY = "s";
    private final static String _D_VALUE    = "v1";
    private final static String _D_KEY      = "d";
   
    public YahooStockQuote( String ticker )
    {
        _ticker = ticker;
    }

    public void setTicker( String ticker )
    {
        _ticker = ticker;
    }
   
    protected String [][] values()
    {
        String [][] values = {
            { _TICKER_KEY, _ticker },
            { _D_KEY, _D_VALUE }
        };
        return values;
    }
}

以及:

public class QuickenStockQuote extends AbstractMessage
{

    private String _ticker;
   
    private final static String _TICKER_KEY = "symbol";
   
    public QuickenStockQuote( String ticker )
    {
        _ticker = ticker;
    }

    public void setTicker( String ticker )
    {
        _ticker = ticker;
    }
   
    protected String [][] values()
    {
        String [][] values = {
            { _TICKER_KEY, _ticker }
        };
        return values;
    }
}

这些Message只知道如何处理它们的数据以及构造二维 "键/值对" 数组。

程序示例
看看下面的股票信息示例程序:

public class QuoteGetter
{

    public final static void main( String [] args )
    {
        if( args.length != 2 )
        {
            System.out.println( "Incorrect Useage:" );
            System.out.println( "java QuoteGetter <quicken or yahoo> <TICKER>" );
            return;
        }
       
        String service = args[0];
        String ticker  = args[1];
       
        Message message = null;
        MessageBus bus  = null;
        if( service.equalsIgnoreCase( "quicken" ) )
        {
            bus =
             new HttpMessageBus( "http://www.quicken.com/investments/quotes/" );
            message = new YahooStockQuote( ticker );
        }
        else // default to yahoo
        {
            bus =
                new HttpMessageBus( "http://finance.yahoo.com/q" );
            message = new QuickenStockQuote( ticker );
        }
       
        try
        {
            String response = sendMessage( message, bus );
            System.out.println( response );
        }
        catch( Exception ignore )
        {
            System.out.println( "Lookup Failed for: " + ticker );
            ignore.printStackTrace();
        }
    }
   
    private static String sendMessage( Message message, MessageBus bus )
        throws BusException
    {
        return message.send( bus );
    }
   
}

main首先创建合适的Message和MessageBus,然后调用sendMessage()发送Message。sendMessage()是一个针对接口来进行编程的例子,而不是针对实现。如果sendMessage()只是专门支持YahooStockQuote或HttpMessageBus,你会说它是针对实现来编程的。

然而,上面的sendMessage()是针对接口来编程的。所以你可以将这个接口的任何实现作为参数传递给这个函数,使得函数更具一般性。

总结
我在日常工作中已经成功地使用了这一程序框架。通过接口,我可以将通信机制从HTTP POST无缝地转换为一个自定义的协议。我还可以使用Message接口在程序中轻松地增加新的消息。另外,只要写一次Message抽象基类,我可以更容易地写出新的函数并在其它程序中复用它们。

希望这个详尽的例子有助于深化上一次关于抽象类和接口的探讨。另外,读者可以去下载本专题所附带的源代码,它包括整个消息发送程序的所有代码以及本专题未曾提到的其它一些类的代码。

----------------------------------------------------
相关资源

· 下载本篇文章的源代码:
http://www.javaworld.com/javaworld/javaqa/2001-08/interface/03-qa-0831-interface.zip

· 和本文相关的另一篇文章 "Abstract Classes Vs. Interfaces" Tony Sintes (JavaWorld, April 2001):
http://www.javaworld.com/javaworld/javaqa/2001-04/03-qa-0420-abstract.html

 

Java基础篇_有关接口和抽象类的几道练习题(分享) 下面小编就为大家带来一篇Java基础篇_有关接口和抽象类的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 立即下载

相关推荐

TMS320F280049C 学习笔记4 Led_ex1_blinky 初始化函数及系统时钟

承接上一篇学习笔记,这次开始实际运行例程。本文概述了280049C的第一个实验 Led灯闪烁。同时也总结了系统的初始化函数和时钟配置。

whyorwhnt的专栏 7034

Java抽象类和接口

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

zyy_fighting的博客 510

Wireshark抓包实战:5个CTF比赛中高频出现的流量分析技巧(附真实案例)

本文分享了Wireshark在CTF比赛和实战渗透中的五个核心流量分析技巧。内容涵盖从宏观统计概览锁定可疑目标、深度解析ICMP与HTTP等协议、追踪重组完整会话流,到利用字符串搜索和命令行工具进行自动化分析。掌握这些高阶技巧能显著提升分析海量网络流量的效率与精准度。

rrr55的博客 261

java第十一课——抽象类和接口

一:抽象类 1.1抽象类的概念 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 例如,这里有三个类,🐕类和🐱类分别继承Animal,并重写Animal中的bark()方法。对于Animal类而言,并不会指向一个具体的动物,所以其中的bark()方法其实无需进行实现。 ...

baijaiyu的博客 1380

使用Google Earth Engine下载JRC全球水体数据

通过Google Earth Engine平台和提供的源代码,研究人员和水资源管理者可以方便地获取和利用这一重要的水资源监测数据集,从而开展相关的研究和决策支持工作。要使用Google Earth Engine下载JRC全球水体数据,首先需要在Google Earth Engine平台上进行注册和登录。JRC全球水体数据是由欧洲联合研究中心开发的高分辨率全球水体分类数据集,覆盖了整个地球的陆地和水域。下载完成后,你可以使用各种遥感数据处理软件来打开和分析这些数据,以满足不同的研究和应用需求。

LrlDebug的博客 1158

SAP_ABAP_MM_BAPI清单案例教程——采购发票校验/预制_BAPI_INCOMINGINVOICE_PARK_MIRO

SAP ABAP BAPI_INCOMINGINVOICE_PARK BAPI 采购发票预制 采购发票校验 代码模版

java_zhong1990的专栏 1964

抽象类和接口的详解(实例)

抽象类和接口在我们的代码中,生活中息息相关,与上图所示,操纵复杂,密切相关,那么问题来了,何谓抽象类,何谓接口?带着这层薄纱,慢慢揭开这层薄纱;也许在古代,新婚之夜,透过这层薄纱,你看到的或者是惊喜,或许是惊悚,不要怕,无论是惊悚还是惊喜,她都会伴你一生。 曾几何时?你还会在面试当中与面试官对答如流的解释抽象类和接口吗? 面试官:解释一下抽象类和接口的区别? me: 1、抽象类和接口都不能直

chajinglong的专栏 2万+

Camunda 7.x 系列【67】实战篇之撤销流程

撤销流程 即撤销当前已发起的流程实例。这是一个常见的需求,Camunda本身不提供直接的方法来撤销正在执行的流程,需要自定义处理逻辑。

记录知识、锤炼自我 1379

Java中的抽象类和抽象方法

1. 基础介绍 当父类的一些方法不能确定时,可以用 abstract 关键字来修饰该方法,这个方法就是抽象方法。用 abstract 来修饰该类就是抽象类,抽象类的作用是设计者设计好后,让子类继承并实现抽象类。 抽象类,是考官比较爱问的知识点,在框架和设计模式使用较多。 2. 抽象类使用细节 抽象类不能被实例化; 抽象类中不一定包含 abstract 方法,也就是说,抽象类可以没有 abstract 方法; 如果一个类中包含 abstract 方法,则该类必须声明为抽象类; abstract

zz_smallred的博客 529

信贷模型域——客户管理阶段模型(贷中模型)

本文主要探讨了信贷模型域中的客户管理阶段模型,重点聚焦于交叉销售模型。交叉销售模型不仅应用于贷中阶段,还贯穿于贷前、贷中、贷后全过程,其核心作用在于提升客户价值、增强客户粘性、降低流失率以及实现风险与收益的平衡。文中通过具体案例展示了交叉销售模型在现实业务中的应用,并指出其在贷中阶段的主要任务是提升存量客户价值、增加产品使用率,同时有效控制风险。

庄小焱 1884

19、情境理论中的信息结构解析

本文系统解析了情境理论中的信息结构,从信息元(infon)的基本概念出发,深入探讨了关系结构与简单信息结构的构建方法,分析了标准信息结构所满足的一系列公理(如A1-A14),并阐述了角色、同一性、高阶信息、循环现象、参数适当性及信息元部分性等核心性质。通过具体示例和流程图展示了信息结构的构建过程,并对比了不同公理下的结构差异,最后讨论了该理论在与其他领域融合中的发展趋势及面临的挑战。

book8的博客 80

Java 练习题 15.1 抽象类与接口

Java 练习题 15.1 抽象类与接口 第一部分:抽象类 1、定义一个Shape类: 含有属性:半径radius 包含1个方法:用于求体积的cubage(); 其中cubage方法是抽象的。 从Shape类派生出三个子类: 球类(Globe)、圆柱类(Cylinder),圆锥类(Cone),分别实现了cubage方法。 进行测试,当给出需要的数值时,求出对应的形状的体积。 package com.shangjiti.aoian; public class No1 { public static voi

Aoian的博客 2883

【YOLO11改进 - 检测头】Detect_LSCD检测头:量化的检测头,进一步提升模型的检测效率和精度

【YOLO11改进 - 检测头】Detect_LSCD检测头:量化的检测头,进一步提升模型的检测效率和精度

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 4103

Java抽象类和接口【超详细】

在打印图形例子中, 我们发现, 父类 Shape 中的 draw 方法好像并没有什么实际工作, 主要的绘制图形都是由 Shape的各种子类的 draw 方法来完成的. 像这种没有实际工作的方法, 我们可以把它设计成一个。如之前写的 Animal 例子. 此处的 Animal 中包含一个 name 这样的属性, 这个属性在任何子类中都是存在的. 因此此处的 Animal 只能作为一个抽象类, 而不应该成为一个接口。在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。

weixin_65476629的博客 3114

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Java 抽象类和接口

文章目录一、抽象类1.抽象类1.1抽象类的定义1.2抽象方法的定义方式1.3抽象类的定义方式2.抽象类和实例类的区别3.抽象类示例4.抽象类的特征二、接口1.接口1.1接口的定义1.1定义一个接口1.2 接口的使用1.3接口的注意事项2.接口示例3.接口的特征三、抽象类和接口的区别 一、抽象类 1.抽象类 1.1抽象类的定义 在Java面向对象当中,所有的对象都是用过类进行描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类没有包含足够多的信息来描述一个具体的对象,这样的类就是抽象类。 1.2抽象方法的

WYSCODER的博客 4869

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JAVA抽象类和接口

Java中抽象类和接口的介绍

weixin_64903131的博客 5101

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【java】抽象类和接口

作者还是一个萌新,如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步✊。

acm_pn的博客 1350

Java抽象类与接口:什么是抽象类与接口?JDK 8默认方法是什么?如何正确使用?

Java抽象类与接口:什么是抽象类与接口?JDK 8默认方法是什么?如何正确使用? 在Java开发中,抽象类和接口是常见的设计工具,但很多人却常常混淆它们的概念和使用场景。JDK 8中新增的接口默认方法更让初学者摸不着头脑。今天,猫头虎带你一文彻底搞懂: 抽象类与接口的核心区别 JDK 8默认方法的实现与作用 实战代码演示,如何正确使用它们?

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 3739

java:接口和抽象类练习

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

fakerth的博客 1215

【Java】抽象类和接口

本博客结合具体代码,带大家认识Java当中的抽象类和接口。

2401_88030885的博客 1329

JAVA:抽象类和接口

摘要: 本文系统讲解了Java中抽象类与接口的核心概念及应用。通过图形系统案例展示了抽象类如何实现代码复用(如Shape抽象类),并分析了其特性(无法实例化、混合成员等)。接口部分重点解析了行为契约的定义(如Flyable接口)及Java8+的默认/静态方法。对比环节明确了二者的差异:抽象类侧重IS-A关系与代码共享,接口定义CAN-DO行为并支持多继承。实战案例(电商系统)演示了混合使用技巧,最后总结了设计原则(如接口隔离)和Java17密封类新特性。全文结合代码示例,帮助开发者合理选择抽象机制。

no_rt_h_se_v_en的博客 1367

Java:抽象类和接口

⨀概念:在面向对象的概念中,所有的对象都是通过类来描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。⨀语法: 在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。⨀现在我们来用一个实例,来展示一下抽象类的概念和语法形式⨀抽象类不能直接实例化对象⨀抽象方法不能是 private 的 被private所修饰的方法在子类中是不可见的,这就导致了我们不能重

zm3rttqs9f的博客 1750

Java抽象类与接口练习题

练习题1:掌握抽象类的基本用法,通过继承实现抽象方法,理解抽象类对共性的抽取。练习题2:熟悉接口的多实现特性,区分抽象方法、默认方法和静态方法的使用方式。练习题3:综合应用抽象类和接口,通过抽象类定义基础属性和方法,通过接口扩展特定功能,体现两者在设计上的互补性。三道题逐步深入,覆盖了抽象类与接口的核心特性、实现方式和设计思想。

2501_91241024的博客 1138

Java接口和抽象类

Java中接口是很重要的

二哈喇子! 2665

Java-抽象类和接口

此篇文章主要讲解"抽象类和接口"的相关知识

爱是小小的癌的博客 1412
上一篇: CUJ C++ Experts Forum: conversation (September 2001)
下一篇: Java Q&A: 使用Observer模式
lostmouse
博客等级 码龄26年 22粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值