java类与对象基础--抽象类和接口
在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类与对象基础--抽象类和接口的更多相关文章
- JAVA基础第三章-类与对象、抽象类、接口
业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...
- JAVA 类和对象基础知识详解
/*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 1978702969@qq.com*/ 和C++一样,JAVA也是一门面向对象的语言,其基础和核心是类和对象.而面向对象的思想是来源与显示生 ...
- java 类与对象基础整理
之前学习javaSE的时候,没有针对性地对对类与对象的一些基础进行整理,下面这些内容是笔记内容整理后的,希望以后自己可以通过这些博客时常复习! 一.类and对象的基础 类似于类的生命啊,类与对象的关系 ...
- java类与对象基础篇
java面向对象基础篇 面向对象程序设计(Object Oriented Proframming ,OOP) 面向对象的本质是:以类的方式组织代码,以对象的方式组织(封装)数据. 面向对象的核心思想是 ...
- Java基础-抽象类和接口
抽象类与接口是Java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 抽象定义: 抽象 ...
- PHP -- 类和对象基础入门
本文目录: 创建简单类和对象 继承 抽象类 接口 构造方法 析构函数 1. 创建简单类 创建一个People的类,在这里有四个要点说明一下: 第一个是在PHP中,访问属性 ...
- Java类和对象初始化
类的生命周期: Java类的初始化: 本阶段负责为类变量赋正确的初始值.(类变量即静态变量) Java编译器把所有的类变量初始化语句和静态初始化器通通收集到<clinit>方法中,该方法只 ...
- [Java初探08]__简单学习Java类和对象
前言 在前面的学习中,我们对面向对象的编程思想有了一个基本的了解,并且简单的了解了类和对象的定义.那么类和对象在Java语言中是如何表现的,这次,就从实际出发,学习一下一下类和对象在Java语言中的使 ...
- java类和对象之间的差
java类和对象之间的差别是一个普遍的问题,刚开始学习java当它来到与类和对象接触.今天就来总结一下它们之间的差异. 先说说class和object差异.事实上,词:object是全部class的父 ...
随机推荐
- mySQL授权(让从服务器用户可以登录到主服务器)
mySQL授权(让从服务器用户可以登录到主服务器) 1.查看用户授权表 ? 1 select user,host,password from mysql.user; 2.给用户设置密码 ? 1 2 u ...
- PHP 执行系统外部命令的方法 system() exec()
PHP作为一种服务器端的脚本语言,像编写简单.或者是复杂的动态网页这样的任务,它完全能够胜任.但事情不总是如此,有时为了实现某个功能,必须借助于操作系统的外部程序(或者称之为命令),这样可以做到事半功 ...
- Jquery 在ios上事件委托失效
点击通过js遍历出来的列表,跳转页面.点击事件委托在document上, 像这样: $(document).on("click",".nav",function ...
- pyinstaller打包工具简单使用
python脚本如果在没有安装python的机器上不能运行,所以将脚本打包成exe文件将可跨平台使用,那么怎么打包了,python提供了专门的模块:pyinstaller,下面就介绍下怎么用 1.安装 ...
- Webpack的详细配置,[Webpack中各种loader的安装配置]
在使用webpack的时候,你是不是被以下这种报错所困扰: 注意看 黄色框中标注的 You may need an appropriate loader to handle this file typ ...
- maxscript批量设置摄像机并保存渲染图
代码可直接运行 fn renderr = ( a=box() --新建一个立方体 ambientcolor = (color ) --设置环境光(搞不太懂,白的不出错就行) to do ( dis = ...
- python+selenium打开浏览器报错问题
报关键字,升级selenium版本 若打开IE浏览器,停在IE界面,无法跳转对应的地址,设置一下IE的页面缩放,设置为100%
- Vector bit-select and part-select addressing verilog片选写法
大端 m m[ a +: b ] == m[ (a+b-1) : a ] m[ a -: b ] == m[ a : (a-b+1) ] 小端 n n[ a +: b ] == n[ a : (a+b ...
- Java学习之路(一):日常第一课,认识JAVA
Java的介绍 语言的起源 Java是SUN(Stanford University Network 斯坦福大学网络公司) 1995年推出的一门高级编程语言. Java名称的来源: Java最初是被命 ...
- unittest之装饰器
前面讲到 unittest 里面 setUp 可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间.于是就想是不是可以 ...