再探java基础——对面向对象的理解(2)
对象、类和抽象类的区别
对象是一个具体的事物,类是对具有相同属性和行为的一组对象的抽象,对象是类的一个一个人的具体实例;抽象类是一种特殊的类,是对类的进一步抽象,抽象类不能被实例化。
类、抽象类和接口的异同
部分内容借鉴以下博文:http://www.cnblogs.com/qiuxiaoju/p/3174068.html
在面试可能经常被问到,接口有什么作用?相对于类而言,为何需要用类实现接口,接口和抽象类的区别等等诸如此类的问题。如果不仔细思考和总结一下这知识,还真不知道怎么回答。
Java接口和Java抽象类有太多相似的地方,又有太多特别的地方,究竟在什么地方,才是它们的最佳位置呢?把它们比较一下,你就可以发现了。
相同点:
1.都是抽象类型,抽象类和接口都是对类进行抽象;
2.其中的抽象方法都必须被具体类实现;
3.都不可以被实例化,如果要非要通过new创建他们的实例,都需要通过匿名内部类的方式;
4.都可以定义公共的(public)和static属性和方法;如:
public int id = 5;
public final String name = "interface";
public static int age = 22;
public static final int weight = 55;
int i = 0;
不同点:
定义的角度:
1.定义抽象类用abstract class,定义接口用interface;
继承的角度:
2.一个具体的实现类只能继承一个父类,但可以实现多个接口;
属性和方法的角度:
3.抽象类可以定义private和protected属性和方法,而接口只能定义public和default(即默认的没有设定访问权限)的属性和方法;
4.Java抽象类可以提供某些方法的部分实现,而Java接口不可以;
5.抽象类可以有抽象方法和非抽象方法,子类可以有选择的实现抽象类中的非抽象方法,而实现类必须实现接口中的所有方法;
构造方法:
6.接口不可以有构造方法,抽象类可以有构造方法;
设计理念不同:
7.其实子类和抽象类的的关系表示的是”is-a”关系(塑料碗和瓷碗都是碗),是一种律属关系,子类属于父类,因此一个类只能继承继承一个类;子类和接口的关系表示的是“has-a”关系(智能手机继承自手机,同时实现了闹钟、MP3等各种功能),实现类拥有这个接口的特征也可以拥有另外一个借口的特征,因此一个类可以实现多个接口。
概况地说,接口是模块之间的协议,一些模块用于实现某些协议的具体动作,另外一些模块只针对接口编程,这样实现低耦合。
抽象类主要是用于继承设计的,主要用于模板设计!
经典的设计模式:缺省/默认适配模式(Default Adapter)
声明类型的工作仍然由Java接口承担,但是同时给出一个Java抽象类,且实现了这个接口,而其他同属于这个抽象类型的具体类可以选择实现这个Java接口,也可以选择继承这个抽象类。哈,这下两个的最大优点都能发挥到极至了。这个模式就是“缺省适配模式”。
在Java语言API中用了这种模式,而且全都遵循一定的命名规范:Abstract +接口名。
继承
1、方法(函数)重写(overwrite)要注意的机几点:
1),重写方法(函数)必须和被重写方法具有相同的方法名称、参数列表和返回类型;
2),重写的时候要从父类的函数声明中拷贝函数的声明(即函数名设参数的类型和个数)。
3),重写方法不能使用比被重写方法跟严格的访问权限。(为避免名称出错,重写时必须从基类中copy函数的声明)
2、super关键字指向当前类的父类。
3、构造方法:
a,子类的构造的过程必须调用其基类的构造方法;
b,子类可以在自己的构造方法中使用super(argument_list参数列表)调用基类的构造方法;即使用this(argument_list_)调用本类的另外的构造方法,如果调用super,必须写在子类构造方法的第一行。
c,如果子类的构造方法中没有显示地调用基类的构造方法,则系统默认调用基类无参数的构造方法;
d,如果子类的构造方法中没有显示地调用基类的构造方法,而基类中又没有无参数的构造方法,则编译出错。4、Object类是java所有类的根基类,如果在类的声明中未使用extends指明其基类,则默认为object类。
5、对象转型:
a,一个基类的引用类型对象可以“指向”其子类的对象;
b,一个基类的引用的不可以访问子类对象新增加的成员(属性和方法);
c,可以使用引用变量instanceof类名来判断该引用变量所“指向”的对象该类或该类的子类;
d,子类的对象可以当作基类的对象来使用称作向上转型(upcasting),反之称为向下转型(downcasting)。
6、动态绑定是指在“执行”期间(而非在编译期间)判定所引用对象的实际类型,根据实际的类型调用相应的方法。
要符合的条件:a,要有继承;b,要有重写;c,父类引用指向子类对象。
7、抽象类;
a,用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,这个方法叫做抽象方法;
b,含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写;
c,抽象类不能被实例化;
d,抽象方法只需声明,而不需实现。
8、final关键字(类似于C++中的const)
a,final的变量的值不能被改变;1),final的成员变量; 2)final的局部变量;
b,final的方法不能被重写;
c,final的类不能被继承。
继承和组合的关系
上次阿里面试的时候问到继承和组合的关,什么时候要用组合,什么时候要用继承。真后悔当初没有准备,不然就可以很容易地回答,现在想起来,当时回答的真是烂的不能再烂!
继承和组合的关系主要是要从理念上进行区分,继承是一种从属关系,是子由你来的一种关系;而组合是一种包含关系,是整体与部分的关系。
假设有两个类A和B,当A和B和关系是B is A,用继承:B extends A;当A和B和关系是B has A时,用组合,即B中含有A的实例化对象。
再探java基础——对面向对象的理解(2)的更多相关文章
- 再探java基础——对面向对象的理解(1)
对象 对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则.计划或事件.对象具有属性和行为,在程序设计中对象实现了数据和操作的结合,使数 ...
- 再探java基础——break和continue的用法
再探java基础——break和continue的用法 break break可用于循环和switch...case...语句中. 用于switch...case中: 执行完满足case条件的内容内后 ...
- 再探Java基础——String.format(String format, Object… args)的使用
最近看到类似这样的一些代码:String.format("参数%s不能为空", "birthday"); 以前还没用过这功能不知咐意思,后研究了一下,详细讲解如 ...
- 再探Java基础——throw与throws
http://blog.csdn.net/luoweifu/article/details/10721543 异常处理机制 异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被卡死,处于一直等待 ...
- 再探java基础——零碎基础知识整理
1.java是解释型语言.java虚拟机能实现一次编译多次运行. 2.JDK(java software Development kit 软件开发包),JRE(java Runtime Environ ...
- [转] 再探java基础——break和continue的用法
原文地址:http://blog.csdn.net/luoweifu/article/details/10756017 break break可用于循环和switch...case...语句中. 用于 ...
- Java基础-初识面向对象编程(Object-Oriented-Programming)
Java基础-初识面向对象编程(Object-Oriented-Programming) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Java是一门面向对象的程序设计语言.那么什 ...
- 黑马程序员——【Java基础】——面向对象(二)异常机制、包(Package)
---------- android培训.java培训.期待与您交流! ---------- 一.异常机制 (一)异常概述 1.异常:就是程序在运行时出现不正常情况. 2.异常类:程序在运行时,出现的 ...
- Java基础教程(12)--深入理解类
一.方法的返回值 当我们在程序中调用方法时,虚拟机将会跳转到对应的方法中去执行.当以下几种情况发生时,虚拟机将会回到调用方法的语句并继续向下执行: 执行完方法中所有的语句: 遇到return语句: ...
随机推荐
- win7下.NET 2.0未在web服务器上注册的问题(转)
转自:http://blog.sina.com.cn/s/blog_6d15b547010192hx.html 电脑装了win7操作系统,装上vs2008后运行dotnetnuke项目后出现" ...
- 基于jQuery查找dom的多种方式性能问题
这个问题的产生由于我们前端组每个人的编码习惯的差异,最主要的还是因为代码的维护性问题.在此基础上,我对jQuery源码(1.11.3)查找dom节点相关的内容进行了仔细的查阅,虽然并不能理解的很深入 ...
- js 强制转换
强制转换为布尔类型: <script> var text =Boolean(0) //=>以下转换的类型都为false text = Boolean(0.0) text = Bool ...
- php之文件上传类代码
/* 单个文件上传 功能 上传文件 配置允许的后缀 配置允许的大小 获取文件后缀 判断文件的后缀 报错 */ class UpTool{ protected $allowExt = 'jpg,jpeg ...
- ubuntu更新源
源一定要找对应的版本 14.04对应 trusty deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multive ...
- Ubuntu14 或是其他系统当中关于sublimeSFTP超时解决方法
一直都使用Sublime的SFTP功能,感觉还不错,好用,但是最近不知道怎么了,使用不成了,提示超时了,于是在网上找一下解决方法,没有找到,于是自己想着试试看,于在搞了一会,发现只要把配制文件当中的s ...
- linux配置记录
今天想把开发环境都配置到linux环境来,所以用wubi挂载了个ubuntu系统(64位),因为不常使用linux所以把今天学到的一些 东西记下来以做备查. #1. java环境配置 到oracl ...
- Java中权限修饰符public、private、protected和default的区别
1.public 可以修饰类.成员变量和成员函数,没有任何限制,同一个包中,或者不同包中的类都可以自由访问 2.private 可以修饰成员变量和成员函数,只能在本类中使用 3.default (不写 ...
- 单元测试不是梦,Android+PowerMock系列(1) —— 在Eclipse里搭建测试环境
单元测试不好搞阿,虽然从TDD角度出发,可测性强的代码很大程度上就代表着好的设计,但是有些情况也是没办法的,比如单例模式,比如Static方法,比如Final类,传统的Mock技术是没办法解决这些问题 ...
- python中xrange与range的异同
转载自:http://ciniao.me/article.php?id=17 >>> range(5) [0, 1, 2, 3, 4] >>> range(1, 5 ...