精华内容
下载资源
问答
  • 具体事物抽出、概括出它们共同的方面、本质属性与...抽象方法:抽象方法就是以 abstract修饰的方法,这种方法只声明返回的数据类型,方法名称所需要的参数,没有方法体,也就是说抽象方法只需要声明,当一个方法...

    3e8a16387856d396e5a0cd6aa427cf12.png

    从具体事物抽出、概括出它们共同的方面、本质属性与关系等,而将个别的、非本质的方面、属性与关系舍弃,这种思维过程,称为抽象。

    抽象类:

    不能使用new方法进行实例化的类,即没有具体实例对象的类,只可以通过抽象类派生出新的子类,再由其子类来创建对象;

    抽象方法:

    抽象方法就是以 abstract修饰的方法,这种方法只声明返回的数据类型,方法名称和所需要的参数,没有方法体,也就是说抽象方法只需要声明,当一个方法为抽象方法时,意味着这个方法必须被子类的方法所重写,否则其子类的该方法仍然是抽象的;

    抽象类的特点:

    A:抽象类和抽象方法必须用abstract关键字修饰;

    B:抽象类中不一定有抽象方法,但是有抽象方法的类必须定义为抽象类;

    C:抽象类不能直接实例化;(可以通过子类(重写方法后的子类)的多态方式实例化);它不是具体的;

    抽象类有构造方法,用于子类访问父类数据的初始化;

    D:抽象类的子类;如果不想重写抽象方法,该子类必须是抽象类;

    成为具体类则必须重写所有的抽象方法;

    下面给出一个抽象类的实例:public class AbstractDemo {

    public static void main(String[] args) {

    //Tree t = new Tree();//抽象的子类不能实例化;Error!

    Grass g = new Grass();//非抽象类的子类实例化

    g.grow();

    System.out.println("-------------");

    Plant p = new Grass();//多态的方式

    p.grow();

    }

    }

    abstract class Plant{

    public abstract void grow();

    }

    /*

    * 1.子类是抽象类;

    */

    abstract class Tree extends Plant{

    Tree(){

    System.out.println("tree");

    }

    }

    /*

    * 2.子类不是抽象类,则必须重写所有抽象方法;

    */

    class Grass extends Plant{

    Grass(){

    System.out.println("grass");

    }

    public void grow(){

    System.out.println("grass growing");

    }

    }

    抽象类的成员的特点:

    A:成员变量

    既可以是变量,也可以是常量;

    B:构造方法

    用于子类访问父类数据的初始化;

    C:成员方法

    既可以是抽象的,也可以是非抽象的;

    抽象类成员方法特性:

    A:抽象方法

    强制要求子类做的事情;

    B:非抽象方法

    子类继承的事情,提高代码复用性;

    下面给出一个抽象类的成员的实例:public class AbstractMember {

    public static void main(String[] args){

    Phone p = new Vivo(); //这里是多态;(用来实例化抽象类)

    p.height = 1460; //1600 -> 1460

    System.out.println(p.height);

    System.out.println(p.width);

    System.out.println("-----------");

    p.call(); //vivo call

    p.method(); //vivo method

    }

    }

    abstract class Phone{

    public int height = 1600;

    public final int width = 960;

    public Phone(){}

    public Phone(String name,int count){}

    /*成员方法*/

    public abstract void call();//抽象成员方法;

    public void method(){ //非抽象成员方法;

    System.out.println("phone method");

    }

    }

    //非抽象子类,重写抽象父类的抽象方法:

    class Vivo extends Phone{

    public void call(){

    System.out.println("vivo call");

    }

    public void method(){

    System.out.println("vivo method");

    }

    }

    展开全文
  • 对于面向对象编程来说,抽象是它的一大特征。在Java中,可以通过两种形式来体现OOP的抽象抽象接口。...抽象方法是种特殊的方法:它只有声明,没有具体实现。抽象方法声明格式如下:abstract vo...

    对于面向对象编程来说,抽象是它的一大特征。在Java中,可以通过两种形式来体现OOP的抽象:抽象类和接口。这两者有太多向内的地方,又有太多不同的地方。很多人在初学的时候以为它们可以随意互换使用,但是实际则不然。今天我们就一起学习以下Java中的抽象类和接口。

    抽象类

    在了解抽象类之前,我们先了解以下抽象方法。抽象方法是种特殊的方法:它只有声明,没有具体实现。抽象方法声明格式如下:

    abstract void get();

    抽象方法必须用abstract关键字修饰。如果一个类中含有抽象方法,则称这个类为抽象类,抽象类必须使用abstract关键字修饰。因为抽象类中含有没有具体实现的抽象方法,所以不能用抽象类创建对象。

    抽象类特点:

    抽象类中可以有成员函数,可以是变量,也可以是常量。

    抽象类中可以有抽象方法,也可以有普通方法,还可以有静态方法。

    有抽象方法的类必须声明为抽象类,抽象类中不一定有抽象方法。

    抽象类可以有构造函数,但是不能创建对象,构造函数用于子类访问父类数据的初始化。

    抽象类的子类要么是一个抽象类,如果是一个具体类必须重写抽象类中的抽象方法。

    抽象类和普通类区别

    抽象类的方法必须为public或者protected,缺省情况下默认为public(因为如果是private,则不被子类继承,子类无法实现该方法)。

    抽象类不能用来创建对象。

    如果一个类继承一个抽象类,则该类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将该子类定义为抽象类。

    接口

    接口,英文称作interface,在软件工程中,接口泛指供别人调用的方法或者函数。从这里,我们可以体会到Java语言设计的初衷,它是行为的抽象,在Java中,定义接口的形式如下:

    public interface Phone{

    }

    接口特点:

    接口中可以有变量,但是变量会被隐式的指定为public static final变量,也就是常量(如果用private修饰,编译会报错),一般不在接口中定义变量。

    接口中方法只能是抽象方法,全部会被隐式的指定为public abstract,(如果用private、protected、static、final修饰,编译会报错)

    接口没有构造函数

    抽象类与接口的区别

    成员区别

    关系区别

    设计理念区别

    抽象类:

    强调的是is a关系,抽象类中定义的是共性特征。

    接口:

    强调的是like a关系,接口中定义的是扩展功能。

    小结

    抽象类是具体类的公因式,接口是为了将一些不相关的类“杂凑”成一个共同的群体。通常我们平时开发中就是多用接口,毕竟Java是单继承。但是需要使用抽象类的时候还是可以用的,要是没把握还是用接口。

    展开全文
  • 抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:abstract void fun();抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用...

    著作权归作者所有。

    商业转载请联系作者获得授权,非商业转载请注明出处。

    作者:海子

    来源:博客园

    一.抽象类

    在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:

    abstract void fun();

    抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。

    下面要注意一个问题:在《JAVA编程思想》一书中,将抽象类定义为“包含抽象方法的类”,但是后面发现如果一个类不包含抽象方法,只是用abstract修饰的话也是抽象类。也就是说抽象类不一定必须含有抽象方法。个人觉得这个属于钻牛角尖的问题吧,因为如果一个抽象类不包含任何抽象方法,为何还要设计为抽象类?所以暂且记住这个概念吧,不必去深究为什么。

    [public] abstract class ClassName {

    abstract void fun();

    }

    从这里可以看出,抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。

    包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:

    1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。

    2)抽象类不能用来创建对象;

    3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

    在其他方面,抽象类和普通的类并没有区别。

    二.接口

    接口,英文称作interface,在软件工程中,接口泛指供别人调用的方法或者函数。从这里,我们可以体会到Java语言设计者的初衷,它是对行为的抽象。在Java中,定一个接口的形式如下:

    [public] interface InterfaceName {

    }

    接口中可以含有 变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。

    要让一个类遵循某组特地的接口需要使用implements关键字,具体格式如下:

    class ClassName implements Interface1,Interface2,[....]{

    }

    可以看出,允许一个类遵循多个特定的接口。如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法。

    三.抽象类和接口的区别

    四.1.语法层面上的区别

    1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;

    2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;

    3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;

    4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。

    2.设计层面上的区别

    1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。那么在设计的时候,可以将飞机设计为一个类Airplane,将鸟设计为一个类Bird,但是不能将 飞行 这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。此时可以将 飞行 设计为一个接口Fly,包含方法fly( ),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。然后至于有不同种类的飞机,比如战斗机、民用飞机等直接继承Airplane即可,对于鸟也是类似的,不同种类的鸟直接继承Bird类即可。从这里可以看出,继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口。

    2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。什么是模板式设计?最简单例子,大家都用过ppt里面的模板,如果用模板A设计了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,如果它们的公共部分需要改动,则只需要改动模板A就可以了,不需要重新对ppt B和ppt C进行改动。而辐射式设计,比如某个电梯都装了某种报警器,一旦要更新报警器,就必须全部更新。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。

    下面看一个网上流传最广泛的例子:门和警报的例子:门都有open( )和close( )两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念:

    abstract class Door {

    public abstract void open();

    public abstract void close();

    }

    或者:

    interface Door {

    public abstract void open();

    public abstract void close();

    }

    但是现在如果我们需要门具有报警alarm( )的功能,那么该如何实现?下面提供两种思路:

    1)将这三个功能都放在抽象类里面,但是这样一来所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;

    2)将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close( ),也许这个类根本就不具备open( )和close( )这两个功能,比如火灾报警器。

    从这里可以看出, Door的open() 、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。

    interface Alram {

    void alarm();

    }

    abstract class Door {

    void open();

    void close();

    }

    class AlarmDoor extends Door implements Alarm {

    void oepn() {

    //....

    }

    void close() {

    //....

    }

    void alarm() {

    //....

    }

    }

    展开全文
  • 类是一个范畴的东西,你是一个人,还是一个动物,是一个具体的什么动物,猫还是狗,这就是类。顶层的动物是抽象的东西,而底层的猫啊狗啊是具体的东西。...怎么理解呢?我不管你属于什么类,猫啊,狗啊之类的,...

    类是一个范畴的东西,你是一个人,还是一个动物,是一个具体的什么动物,猫还是狗,这就是类。顶层的动物是抽象的东西,而底层的猫啊狗啊是具体的东西。也就是说类是属于某个范畴的东西,这个范畴相对明确,虽然也有一定的抽象。

    7ed5b78309388bc633eac995e64dde89.png

    而接口呢,是一个标准,一个规范,实现了这个接口,就意味着肯定有了相应的功能。这就是我们经常提到的实现一个接口,必须要实现接口中的所有方法。怎么理解呢?我不管你属于什么类,猫啊,狗啊之类的,你只要实现了我的alive(活着)接口,我就知道你肯定有吃eat(),喝drink(),拉crap,撒pee()这些方法。接口不关系你是什么类,它关心的是只要是实现了这个接口,肯定会实现接口中的方法,也就是说有了相应的功能。

    说了这么多,在具体实践中如何运用呢?我举个实际例子来说吧,JDBC驱动,数据库有好多种,mysql,oracle,等等,那么作为程序员连接不同的数据库,是不是写的代码不一样呢?比如连接mysql用方法connectMysql()而连接oracle用方法connectOracle?这时候,接口的作用就体现出来了。我刚才说,接口是一种规范,一种标准,那么我定义一系列的接口,别管你什么mysql,oracle之类,要连接数据库,都需要实现我定义的接口,并实现connect方法;包括取数据库之类的,也是一样的。用接口来处理这种标准,不管具体的数据库是什么。

    在看看jdk自身的类,HashMap和HashTable,他们不是一个范畴:一个是Map,一个是Dictionary,但是他们都实现了Map接口,所以他们的功能或者能力基本相同。

    那么回到问题本身,类继承干嘛用的呢。其实这源于一种设计思想:面向抽象编程,比如我刚才提到的,你的程序中有狗,猫,还有 人这些类,他们肯定有相识的东西,你如果面向具体编程,那么猫和狗肯定有些功能或者代码是重复的,比如吼叫bellow(),那么完全可以抽象出来,把bellow这个方法放到猫和狗的父类,避免代码重复或者耦合,你要考虑如果有100个猫或者狗之类的类,如果不 放到父类中,修改这个bellow方法可能涉及100个类。

    展开全文
  • 贴一个对抽象类Shapes具体化的例子,其中Shapes是一个抽象类,有计算面积周长的抽象方法。还有一些数据成员,用以之后的复用import java.awt.*;import java.applet.*;abstract class Shapes{protected in...
  • 什么时候用抽象类?什么时候用接口?怎么理解抽象类?怎么理解接口? 一、百度解释抽象类和接口的区别 总而言之就是一句话:抽象类可以包含具体实现,接口只能...二、观察者模式体会接口和抽象类的区别 观察者模
  • 今天华清Java学院就来大家分享一下Java中的接口怎么理解。 什么是Java接口?Java通过interface来定义接口,通过implements来实现接口的具体代码,Java中的接口常用来跟抽象类做对比。在软件中接口是一种规...
  • 抽象工厂 大白话:一个最大的抽象工厂,它里面不仅有生产手机的工厂,也有生产家用电器的工厂,工厂里面套...就按照这个例子,有一家抽象工厂,它可以有生产手机生产电器的工厂,它的工厂有具体的实现类(小米...
  • 接口和抽象类有什么区别

    千次阅读 热门讨论 2018-08-26 21:32:21
    接口和抽象类来两个东西很抽象,很相似,但是二者之间到底有何关系,有了抽象类可以满足编程的基本需求了,为什么又会出现抽象类,接下来是小编的一些个人理解! java,C#等高级语言都是不支持继承多个父类的,因为...
  • 抽象接口的区别

    2019-09-11 14:29:52
    1:什么是抽象接口? ①抽象类: 官方: 抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。 个人理解: 类用来描述对象,是对象的模版...
  • 告诉子类应该做什么,具体怎么做,不同的子类有不同的实现 4.不能私有、静态、final 抽象类使用规则 1.被abstract修饰的类是抽象类 2.抽象类中可以有抽象方法,也就是被abstract修饰的方法,也可以
  • 数据结构和抽象数据类型

    千次阅读 2016-01-15 16:41:31
    这两个概念,尤其是第一个都是特别抽象的概念,没什么具体可对应的实体可以给你举例,我就粘贴复制了,说说我的理解吧。数据结构呢,我们总是为了完成一个功能或者目的写程序,但不管什么程序、代码实际上都是一些...
  • 项目解密 你或许是还没毕业的大学生或者刚工作的职场新人,但对... 项目是一个抽象的概念,只有具体化才会更好的理解。举个例子:厨师做饭数据挖掘都是一个项目,下面我就用对比的方式来介绍这两个项目。 项目名...
  • 但还没确定怎么去实现它的具体一点的子方法,那我就可以用抽象类或接口。具体怎么用,要做什么,我不用关心,由使用的人自己去定义去实现。 封装:  属性可用来描述同一类事物的特征,方法可描述一类事物可...
  • 前言先介绍下类实例面向对象最重要的概念就是类(class)实例(instance),类时抽象的模板,比如学生这个抽象的事物,可以用一个student类来表示。而实例时根据类创建出来的一个个具体的“对象”,每一个对象都从类...
  • 有不少的文章在描述这两者,但好象都没有怎么从初学者的浅显角度来看。其实这两者有很多相识之处,当然也有很多不同之处。要理解它们,应该先从面向对象思想开始。面向对象思想里面,最基本的就是封装,继承多态。...
  • java中的抽象接口

    2014-03-12 15:59:51
    1.首先怎么理解抽象类 在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是...
  • 如果有java编程经验的同学可能会发现,接口倒是经常写,但是抽象类好像并不怎么熟悉,这两者的具体作用到底是什么呢?有什么区别呢? 先说对这两个概念的理解 我们先说抽象类,其实抽象类的设计理念是“is-a”关系,...
  • 但还没确定怎么去实现它的具体一点的子方法,那我就可以用抽象类或接口。具体怎么用,要做什么,我不用关心,由使用的人自己去定义去实现。封装:属性可用来描述同一类事物的特征,方法可描述一类事物可做的操作。...
  • 其本质是以建立模型体现出来的抽象思维过程面向对象的方法 面向对象:将功能封装进对象,强调具备了功能的对象 ---》面向过程---》功能行为 一切皆对象 打开关闭电脑是种行为,这过程是面向过程。 而电脑是对象...
  • 导语:最近的一次面试中,面试官问到如何理解java面向对象编程?这种问题千人千语,这里简单记录一下我的看法 面向过程:就是遇到一个问题时,将解决问题的方法拆分成一个个函数数据,然后按一定的顺序执行完。这...
  • 面向对象最重要的概念就是类(Class)实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。仍以Student类为...
  • 在面向对象一文中,我们说了多态的一个功能是将“做什么”怎么做”分离开来,所采用的方法是将不同的具体实现放在不同的子类中,然后向接口中传入一个父类对象的引用。而本篇博客要说的内容则为接口(此处"接口...
  • 2.抽象方法:其名为抽象,很好理解,其不能提供具体的实现,只是一个可重写的(隐性的)虚方法的(可以理解为接口)模版。 3.这两个方法都是为了再次重写实现,所以都不能密封     C#的重载:普通的重载是...
  • C#创建接口定义抽象类(一)

    千次阅读 2019-06-11 20:35:59
    我们可以这么理解,接口告诉了我们“有什么”,也就是方法的名称,具体怎么做”,接口是不会去管的,所以接口只提供方法的名称,但它是不提供方法的实现,就好比电脑的USB插口,我们知道它可以插各种USB线,但我们...
  • 如果有java编程经验的同学可能会发现,接口倒是经常写,但是抽象类好像并不怎么熟悉,这两者的具体作用到底是什么呢?有什么区别呢?1.先说对这两个概念的理解我们先说抽象类,其实抽象类的设计理念是“is-a”关系,...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 352
精华内容 140
关键字:

具体和抽象怎么理解