JavaSE学习总结(六)——接口与抽象类

一、不需要实例化的原因

看一个示例:

package com.zhangguo.chapter5.s1;

/**动物园*/
public class Zoo {
    public static void main(String[] args) {
        Animal animal=new Animal();
        animal.eat();

        /**new谁调谁*/
        /**LSP*/
        Animal dog=new Dog();
        dog.eat();
    }
}

/**动物*/
class Animal {
    /**吃*/
    public void eat(){
        System.out.println("动物吃东西");
    }
}

class Cat extends Animal{
    /**重写吃*/
    public void eat(){
        System.out.println("猫吃鱼");
    }
}

class Dog extends Animal{
    /**重写吃*/
    public void eat(){
        System.out.println("狗吃骨头");
    }
}

结果:

问题:

从上面的示例可以看出Animal是抽象的父类,其实现实中并不存在一种叫动物的实际对象,而动物仅仅是一个被抽象的概念。

既然这样,Animal就不应该实例化,只能作为父类,在面向对象中(OOP)充当这种角色的类型有:抽象类,接口。

抽象类与接口是一种比类更加抽象的类型。

一、不能实例化的类型

从上面的概念中可以得知有些类型是不应该实例化的,没有意义。

java中抽象类更利于代码的维护和重用。

1.因为抽象类不能实例化对象,所以必须要有子类来实现它之后才能使用。这样就可以把一些具有相同属性和方法的组件进行抽象,这样更有利于代码和程序的维护。

2.当又有一个具有相似的组件产生时,只需要实现该抽象类就可以获得该抽象类的那些属性和方法。

在面向对象方法中,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。

(1)、接口

(2)、抽象类

(3)、构造方法的访问权限为私有

package com.zhangguo.chapter5.s1;

/** 吃 接口 */
interface Ieatable {
    void eat();
}

/** 动物 抽象类 */
abstract class Animal {
    /** 吃 抽象方法 */
    public abstract void eat();
}

/** 学生 普通类 */
class Student {
    /** 私有构造方法 */
    private Student() {
    }
}

public class NoInstance {

    public static void main(String[] args) {
        Ieatable obj1 = new Ieatable(); // 错误 不能实例化接口
        Animal obj2 = new Animal(); // 错误 不能实例化抽象类
        Student obj3 = new Student(); // 错误 不能实例化私有构造方法类
    }
}

有些语言中静态类也不能实例化,如C#

意义:越抽象,越稳定。抽象的可以定义上层结构,规范顶层设计。抽象不会也不应该随意变化。

二、抽象类

2.1、语法定义

抽象类定义,抽象类前使用abstract关键字修饰,则该类为抽象类。

2.2、用途

a、在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法
(抽象类约束子类必须有哪些方法,但并不关注子类怎么去实现这些方法。)

b、从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。

2.3、意义

限制规定子类必须实现某些方法,但不关注实现细节。

2.4、特点

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

2,抽象方法和抽象类都必须被abstract关键字修饰

3,抽象类不可以用new创建对象。因为调用抽象方法没意义4,抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。

如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。

5、抽象方法没有方法体,以分号结束

示例:

package com.zhangguo.chapter5.s2;

import java.util.Scanner;

/** 动物 */
public abstract class Animal {
    /** 名称 */
    public String name;

    /** 抽象方法,无方法体,必须被子类实现(重写) */
    public abstract void eat();

    /**测试*/
    public static void main(String[] args) {
        //LSP 里氏替换原则
        Animal dog=new Dog();
        dog.name="博美";
        //int i=1;
        //Scanner input=new Scanner(System.in);
        dog.eat();
    }

    /**抽象类中可以有非抽象方法,可以有静态方法*/
    public void show(){};
}

/**抽象类动物(Animal)的子类,必须实现父类未实现的方法*/
class Dog extends Animal {
    //注解
    @Override
    public void eat() {
        System.out.println(this.name+"狗在吃骨头");
    }
}

运行结果:

三、接口

接口是一组没有实例的标准与规范。

没有接口的电脑是怎样的?

3.1、为什么需要接口

继承:描述事物的自然属性和行为的复用。

接口:描述事物的社会属性和行为的复用。

1、重要性:在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。

2、简单、规范性:如果一个项目比较庞大,那么就需要一个能理清所有业务的架构师来定义一些主要的接口,这些接口不仅告诉开发人员你需要实现那些业务,而且也将命名规范限制住了(防止一些开发人员随便命名导致别的程序员无法看明白)。

3、维护、拓展性:比如你要做一个画板程序,其中里面有一个面板类,主要负责绘画功能,然后你就这样定义了这个类。

4、安全、严密性:接口是实现软件松耦合的重要手段,它描叙了系统对外的所有服务,而不涉及任何具体的实现细节。这样就比较安全、严密一些(一般软件服务商考虑的比较多)。

因为类具有“单根性”,所有的类只能有一个直接父类,通过可以实现一个类有多个父类,可以实现多重继承。

package com.zhangguo.chapter5.s2;

/**usb接口*/
public interface IUSB {
    /**未实现的方法,发送数据*/
    void sendData();
}

/**网线接口*/
interface IRJ45
{
    /**未实现的方法,接收数据*/
    void receiveData();
}

/**设备*/
class Device{

}

/**电脑*/
/**一个类只能继承一个类,但可以实现多个接口*/
class Computer extends Device implements IUSB,IRJ45{

    @Override
    public void receiveData() {
        System.out.println("接收数据");
    }

    @Override
    public void sendData() {
        System.out.println("发送数据");
    }

    interface IA{}
    interface IB{}
    /**接口可以继承其它他口*/
    interface IC extends IA,IB{}

    class CC{}
    /**继承需要写在实现接口前*/
    class DD extends CC implements IC {}
}

测试:

package com.zhangguo.chapter5.s2;

public class ComputerClient {

    public static void main(String[] args) {
        Computer ln=new Computer();
        ln.sendData();
        ln.receiveData();

        /**接口是一种类型*/
        IUSB usb=new Computer();

        /**一个对象可以有多个不同的类型*/

    }

}

3.2、接口的特点

1)、接口中的方法可以有参数列表和返回类型,但不能有任何方法体。

2)、接口中可以包含字段,但是会被隐式的声明为static和final。

3)、接口中的字段只是被存储在该接口的静态存储区域内,而不属于该接口。

4)、接口中的方法可以被声明为public或不声明,但结果都会按照public类型处理。

5)、当实现一个接口时,需要将被定义的方法声明为public类型的,否则为默认访问类型,Java编译器不允许这种情况。

6)、如果没有实现接口中所有方法,那么创建的仍然是一个接口。子类必须实现接口中未实现的方法,除非子类也是接口。

7)、扩展一个接口来生成新的接口应使用关键字extends,实现一个接口使用implements。

8)、接口中的方法是抽象方法(abstract),不能是静态方法(static))、接口的所有方法都是抽象的,而抽象方法是没有static,有static的方法是不能override的,所以这样定义接口才有意义。

接口中的字段是默认为:static final ,通俗说就是常量

四、Final(最终的)

4.1、final修饰类

  final修饰的类不允许被继承。

  一个类不能既是final的,又是abstract的。因为abstract的主要目的是定义一种约定,让子类去实现这种约定,而final表示该类不能被继承,两者矛盾。

4.2、final修饰方法

  final修饰方法,表示该方法不能被子类中的方法覆写Override。不能被重写

4.3、final修饰变量

  final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

  当final修饰一个原生数据类型时,表示该原生数据类型的值不能发生变化;

  如果final修饰一个引用类型时,表示该引用类型不能再指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。

  本质上是一回事,因为引用的值是一个地址,final要求值,即地址的值不发生变化。

  final修饰一个成员变量(属性),必须要显示初始化。

  这里有两种初始化方式,一种是在变量声明的时候初始化;第二种方法是在声明变量的时候不赋初值,但是要在这个变量所在的类的所有的构造函数中对这个变量赋初值。

  当函数的参数类型声明为final时,说明该参数是只读型的。

五、视频与示例下载

上课示例下载

B站视频在线观看

六、面试题

1、Java中有那些不能实例化的类型?

2、抽象类有何特点?

3、接口有何特点?

时间: 2024-09-18 10:03:47

JavaSE学习总结(六)——接口与抽象类的相关文章

接口和抽象类,哪个更好呢?

问题描述 个人认为接口好,可以实现多重派生:) 解决方案 解决方案二:只要不定义属性,尽量用接口解决方案三:接口和抽象类无好坏之分,两者有不同的用途只能按需去用想学习何时用谁的最佳实践看看java设计模式相关的书另:如果有需要实现类方法,则不能用接口解决方案四:无意义的帖子,可删之解决方案五:没有哪个更好只有什么时候更适合用哪个解决方案六:引用4楼happysmhzp的回复: 没有哪个更好只有什么时候更适合用哪个 是的解决方案七:视情况而定解决方案八:合适最好

深入理解Java的接口和抽象类

对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类.下面是本文的目录大纲: 一.抽象类 二.接口 三.抽象类和接口的区别 若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法:它只有声明,而没有具体的实现.抽象

Java接口和抽象类实例分析

  本文实例讲述了Java的接口和抽象类.分享给大家供大家参考.具体分析如下: 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类. 若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法:它只有声明,而没有具体

Java接口和抽象类的区别深入剖析_java

本文剖析了Java学习中接口和抽象类的区别,对于初学者深入学习并准确掌握Java程序设计的理念至关重要.详情如下: Java初学者往往容易提出这样的问题:接口和抽象类有什么区别?你选择使用接口和抽象类的依据是什么? 接口和抽象类的概念不一样.接口是对动作的抽象,抽象类是对根源的抽象.抽象类表示的是,这个对象是什么.接口表示的是,这个对象能做什么.比如,男人,女人,这两个类(如果是类的话--),他们的抽象类是人.说明,他们都是人. 人可以吃东西,狗也可以吃东西,你可以把"吃东西"定义成一

深入理解Java的接口与抽象类_java

对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类.下面是本文的目录大纲: 一.抽象类 二.接口 三.抽象类和接口的区别 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法:它只有声明,而没有具体的实现.抽象方法的声明格式为:    abstract void

Java接口和抽象类实例分析_java

本文实例讲述了Java的接口和抽象类.分享给大家供大家参考.具体分析如下: 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类. 若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法:它只有声明,而没有具体的实

《.NET程序员面试秘笈》----面试题10 接口和抽象类该如何取舍

面试题10 接口和抽象类该如何取舍 .NET程序员面试秘笈[考点]抽象类的理解,抽象类和接口的区别. [出现频率] [解答] 接口和抽象类非常相似,两者都无法实例化,并且未实现部分都由派生类实现,其应用模型如图1.14所示. 结合图1.14可知,接口与抽象类的主要区别有以下几点: (1)抽象类只能派生类,而接口可以派生类和结构. (2)抽象类的派生类也可以是抽象类,即抽象成员在派生类中不一定被完全实现.而接口要求其派生类或结构必须完全实现其成员. (3)抽象类可以包含已经实现的成员,可以包含字段

对抽象编程:接口和抽象类

1. 引言 在我之前的一篇post <抽象类和接口的谁是谁非 >中,和同事管伟的讨论,得到很多朋友的关注,因为是不成体系的论道,所以给大家了解造成不便,同时关于这个主题的系统性理论,我认为也有必要做以总结,因此才有了本篇的新鲜出炉.同时,我将把上贴中的问题顺便也在此做以交代. 2. 概念引入       什么是接口? 接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称.参数和返回值.接口方法不能包含任何实现,clr 允许接口可以包含事件.属性.索引器.静态方法.静态字段.静态构造函数以及

一起谈.NET技术,对抽象编程:接口和抽象类

1. 引言 在我之前的一篇post <抽象类和接口的谁是谁非 >中,和同事管伟的讨论,得到很多朋友的关注,因为是不成体系的论道,所以给大家了解造成不便,同时关于这个主题的系统性理论,我认为也有必要做以总结,因此才有了本篇的新鲜出炉.同时,我将把上贴中的问题顺便也在此做以交代. 2. 概念引入       什么是接口? 接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称.参数和返回值.接口方法不能包含任何实现,CLR 允许接口可以包含事件.属性.索引器.静态方法.静态字段.静态构造函数以及