在java的类体系中,有两个比较特殊的抽象体--抽象类和接口。抽象体并不可以拥有具体的对象(而且接口甚至不是类),但是它们却是在java设计领域非常重要的两个概念,很多优秀的设计模式都是基于这两个概念的,尽管我们在进行应用开发时可能用的比较少,但是在真正的大型项目的架构开发中,他们是用来确定整个项目的整体框架的,是必不可少的。下面对抽象类以及接口的一些基本语法知识进行整理,用以备忘。

一、什么是抽象类?什么是接口?

  首先,前面也说了,抽象类和接口都不可直接实例化,它很多时候只是在声明引用的时候拿来实现多态。

  1、抽象类。

    抽象类,具体的声明语法如下:

//这是一个抽象类,通过abstract声明
abstract class AbstractClass{
//抽象类里面可以有非抽象方法
public void method1(){
//这是个非抽象方法,在子类中(子类为非抽象类时)可以直接拿来用
System.out.println("我在抽象类里,但是我是非抽象方法");
}
//下面的是抽象方法,它没有方法实体,只有声明
public abstract void method2();//如果子类不是抽象类,则必须实现该方法
//private abstract void meethd3();//抽象类中的方法不可被private修饰
}

  

  显然:抽象类内部可以有非抽象方法(就算所有方法是非抽象方法也符合语法规则),子类继承抽象类后,如果子类不是抽象类,则必须实现所有抽象方法而且内部不能有抽象方法的声明。另外,抽象类的方法不能声明为private;其实这也很好理解:抽象方法本来就应该能被子类访问得到,如果设置为private,则子类访问不了,则它存在的意义就没有了。

  2、接口。

   接口,不是java的类,它只是声明了该接口(interface)所需要的抽象方法。具体的语法知识可以看下面的代码说明:

//这是一个接口,通过interface关键字进行声明
interface InterfaceTest{
//这是一个接口内的方法,它类似抽象类的抽象方法,没有具体的实现,只有方法的声明部分(public可以省略)
public void method1();
//下面这种写法也是可以的,不过,接口的方法默认就是public和abstract而且必须是public 和 abstract
abstract void method2();
//下面的方法声明有问题
//private void method3();//注意方法修饰必须为public或者默认
}

  显然:接口的语法具有以下要求:默认修饰符是public和abstract,而且必须只能由这两个修饰符修饰(当然,这里是指权限修饰以及是否抽象修饰),这也很好理解:接口本来就需要被实现的,而且接口出现本来就是为了多态操作,只有保证外界代码可以访问到接口中的方法,方可实现多态,接口才是有意义的。

二、抽象类与接口的具体用处

  1、多态与抽象类、接口。首先,抽象类和接口都是为了在组织架构时实现代码良好的解耦而产生的概念,它们最终目的就是保证程序的可扩展性,使程序块在不同外界环境(传入对象参数不同)下,相同方法显示出多种不同的行为特征。具体看以下代码:

//抽象类与接口的多态说明代码
//这是个动物抽象类,现实中没有正真动物这个实体的,只不过是好像猫,狗等动物的抽象体罢了
abstract class Animal{
public abstract void eat();
public abstract void sleep();
}
//这个是飞的行为的接口,由于动物中不是所有动物都会飞,所以考虑将它独立成接口,需要的动物实现接口就可以
interface FlyAction{
void fly();
}
//这个是狗类,它继承了动物类
class Dog extends Animal{ public void eat() {
System.out.println("我是dog的eat方法,我喜欢边吃边拉");
}
public void sleep() {
System.out.println("我是dog的sleep方法,我喜欢边睡觉边流口水");
}
}
//这个是鸟类,它继承了animal的类,同时也实现了FlyAction的接口
class Bird extends Animal implements FlyAction{ public void fly() {
System.out.println("我是鸟,我会飞,而且飞得很快");
} public void eat() {
System.out.println("我是鸟,我吃得很少");
} public void sleep() {
System.out.println("我是鸟,我睡觉的姿势很酷");
} }
//这个是飞机类,它也会飞,但是它不是动物
class Airplane implements FlyAction{ public void fly() {
System.out.println("我是飞机,我飞得又高又快");
} }
//下面这个是测试类
public class Test{
FlyAction somethingCanFly = null;
Animal animal = null;
public void setSomethingCanFly(FlyAction somethingCanFly) {
this.somethingCanFly = somethingCanFly;
}
public void setAnimal(Animal animal) {
this.animal = animal;
}
//这个是具体应用类,通过操作接口便可操作对应对象的方法,实现多态
public void fly(){
somethingCanFly.fly();
}
//这个是具体应用类,通过操作抽象父类操作方法,可以轻易实现多态
public void eat(){
animal.eat();
}
public static void main(String[] args) {
AbstractInterface test = new AbstractInterface();
test.setAnimal(new Bird());//这里如果换成传进来的是飞机对象,则非的方式变是飞机飞的方式
test.fly();//这里便是鸟的飞,具体怎么飞是上一句传进来的参数控制的,接口实现了多态
test.setAnimal(new Dog());//这里如果换成传进来的是鸟的对象,则吃的方式便是鸟吃的方式,抽象类实现了多态
test.eat();//这个是animal的吃,具体的吃也是由传进来的对象参数觉得的,抽象类实现了多态
} }

  观察代码,其实抽象类和接口都体现了这样一种思想:通过操作抽象的引用,便可在具体执行过程表现出不同的方法行为,这就是多态的具体表现。

  更多多态方面的知识,之后的设计模式方面的整理会提到,这里大概就将这么多啦。

  2、接口or抽象类(继承or实现接口)?

    上面的代码估计大家也看到了,接口和抽象类都可以实现多态,他们的作用大体上都是通过抽象的引用操作实际的不同对象,很多时候在显式中,可能两种方式都可以达到目的,那该如何抉择呢?

    其实,很容易想到,java并不支持多继承,但是可以利用接口实现类似多继承的效果。所以,抽象类,它可以复用代码,但是却不可以多继承,而接口却很多时候承担着类似于多继承的使命,但是显然它所有方法都是抽象的,代码并不能达到复用的效果。所以,抽象类还是接口,还是要回到架构设计上来:如果子类和对应的抽象类有从属关系(狗是一种动物),则采用继承吧,因为继承要求父类所有方法对子类都是有用的;但是如果好像类似上面的例子:飞机和鸟都会飞,但是他们是两种本质不同的东西,但恰恰他们都有共同的特点:飞的这个行为,所以这是使用接口是合理的,因为,很多时候接口充当类似于一个附加功能或者行为的概念。

  好吧,具体更多面向接口和抽象的编程在设计模式中再具体总结吧!

java类与对象基础--抽象类和接口的更多相关文章

  1. JAVA基础第三章-类与对象、抽象类、接口

    业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...

  2. JAVA 类和对象基础知识详解

    /*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 1978702969@qq.com*/ 和C++一样,JAVA也是一门面向对象的语言,其基础和核心是类和对象.而面向对象的思想是来源与显示生 ...

  3. java 类与对象基础整理

    之前学习javaSE的时候,没有针对性地对对类与对象的一些基础进行整理,下面这些内容是笔记内容整理后的,希望以后自己可以通过这些博客时常复习! 一.类and对象的基础 类似于类的生命啊,类与对象的关系 ...

  4. java类与对象基础篇

    java面向对象基础篇 面向对象程序设计(Object Oriented Proframming ,OOP) 面向对象的本质是:以类的方式组织代码,以对象的方式组织(封装)数据. 面向对象的核心思想是 ...

  5. Java基础-抽象类和接口

    抽象类与接口是Java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 抽象定义: 抽象 ...

  6. PHP -- 类和对象基础入门

         本文目录:    创建简单类和对象 继承 抽象类 接口 构造方法 析构函数     1. 创建简单类    创建一个People的类,在这里有四个要点说明一下: 第一个是在PHP中,访问属性 ...

  7. Java类和对象初始化

    类的生命周期: Java类的初始化: 本阶段负责为类变量赋正确的初始值.(类变量即静态变量) Java编译器把所有的类变量初始化语句和静态初始化器通通收集到<clinit>方法中,该方法只 ...

  8. [Java初探08]__简单学习Java类和对象

    前言 在前面的学习中,我们对面向对象的编程思想有了一个基本的了解,并且简单的了解了类和对象的定义.那么类和对象在Java语言中是如何表现的,这次,就从实际出发,学习一下一下类和对象在Java语言中的使 ...

  9. java类和对象之间的差

    java类和对象之间的差别是一个普遍的问题,刚开始学习java当它来到与类和对象接触.今天就来总结一下它们之间的差异. 先说说class和object差异.事实上,词:object是全部class的父 ...

随机推荐

  1. 如果使用安卓4.4的SD卡?

    安卓4.4默认情况下,后安装的程序无权写入数据到SD卡中,那么是否我们就不能用了?看了很多文章,都说要Root,随后修改配置文件.我觉得这不是很好的方法,Root之后的安卓会有很大风险,这不是最好的办 ...

  2. nginx处理高并发请求强于apache

    ginx 不同于 Apache2 的一点就是,Nginx 采用单线程,非阻塞,异步 IO 的工作模型. Apache2 对于每一个请求,都会创建一个新进程或线程,会浪费很多内存和 CPU 时间,而 N ...

  3. composer手动安装到windows

    1.配置系统变量 Path 计算机->高级系统设置->环境变量->找到系统变量Path  双击 加入  ;php根目录地址:php中ext地址    如 :“;D:\phpStudy ...

  4. 851 AlvinZH的鬼畜密码(背包DP大作战N)

    851 AlvinZH的鬼畜密码 思路 难题.动态规划. 先判断字符串是否合理(可翻译),然后分段处理,每一小段用动态规划求出解法数. dp[i]:字符串str[0~i]的解法数.通过判断str[i] ...

  5. 提交app时候遇到IDFA警告

    1.最近提交app时候遇到如下问题,解决方案: Everything has come to its usual state now. Simply upload your binary as you ...

  6. java 上传文件大小转换为 GB/MB/KB/B

    1.工具类 package cn.cmodes.common.utils; import java.io.File; import java.io.FileInputStream; import ja ...

  7. rest-assured之验证响应数据(Verifying Response Data)

    前面的文章中已经介绍过了如果获得响应数据,接下来我们来介绍一下应该如何来验证这些获得的响应数据,比如验证状态码.状态行.cookies.header.content-type以及body体. 1.验证 ...

  8. netty总结

    eventLoopGroup中创建各个eventLoop处理线程,各个pipeLineHandler处理childEvent时是在自己的线程中, 全异步

  9. SpringBoot + Spring MVC国际化使用示例

    项目中需要显示中英文两种语言,所以需要对显示的内容进行国际化,如下是一个示例程序. 程序文件结构,如下图,后面详细列出各文件的代码. 1. 编写maven的pom.xml文件,如下: <proj ...

  10. C语言中结构体定义

    struct test { int a; }; /* 定义一个结构体,名字是test,这样就可以使用struct test 来定义变量.比如 struct test a; */ typedef str ...