对象、类和抽象类的区别

对象是一个具体的事物,类是对具有相同属性和行为的一组对象的抽象,对象是类的一个一个人的具体实例;抽象类是一种特殊的类,是对类的进一步抽象,抽象类不能被实例化。

类、抽象类和接口的异同

部分内容借鉴以下博文: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)的更多相关文章

  1. 再探java基础——对面向对象的理解(1)

    对象 对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则.计划或事件.对象具有属性和行为,在程序设计中对象实现了数据和操作的结合,使数 ...

  2. 再探java基础——break和continue的用法

    再探java基础——break和continue的用法 break break可用于循环和switch...case...语句中. 用于switch...case中: 执行完满足case条件的内容内后 ...

  3. 再探Java基础——String.format(String format, Object… args)的使用

    最近看到类似这样的一些代码:String.format("参数%s不能为空", "birthday"); 以前还没用过这功能不知咐意思,后研究了一下,详细讲解如 ...

  4. 再探Java基础——throw与throws

    http://blog.csdn.net/luoweifu/article/details/10721543 异常处理机制 异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被卡死,处于一直等待 ...

  5. 再探java基础——零碎基础知识整理

    1.java是解释型语言.java虚拟机能实现一次编译多次运行. 2.JDK(java software Development kit 软件开发包),JRE(java Runtime Environ ...

  6. [转] 再探java基础——break和continue的用法

    原文地址:http://blog.csdn.net/luoweifu/article/details/10756017 break break可用于循环和switch...case...语句中. 用于 ...

  7. Java基础-初识面向对象编程(Object-Oriented-Programming)

    Java基础-初识面向对象编程(Object-Oriented-Programming) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Java是一门面向对象的程序设计语言.那么什 ...

  8. 黑马程序员——【Java基础】——面向对象(二)异常机制、包(Package)

    ---------- android培训.java培训.期待与您交流! ---------- 一.异常机制 (一)异常概述 1.异常:就是程序在运行时出现不正常情况. 2.异常类:程序在运行时,出现的 ...

  9. Java基础教程(12)--深入理解类

    一.方法的返回值   当我们在程序中调用方法时,虚拟机将会跳转到对应的方法中去执行.当以下几种情况发生时,虚拟机将会回到调用方法的语句并继续向下执行: 执行完方法中所有的语句: 遇到return语句: ...

随机推荐

  1. 读书笔记之 - javascript 设计模式 - 组合模式

    组合模式是一种专为创建Web上的动态用户界面而量身定制的模式,使用这种模式,可以用一条命令在对各对象上激发复杂的或递归的行为. 在组合对象的层次体系中有俩种类型对象:叶对象和组合对象.这是一个递归定义 ...

  2. ARM架构下linux设备树加载的方法

    引入设备树后bootloader加载DTB方法: 1. 标准方法 将linux kernel放到内存地址为<kernel img addr>的内存中. 将DTB放到地址为<dtb a ...

  3. PHP数据学习-二维数组【3】

    <?php // $project = array( // array("bai",12,23.0), // array("zeng",34,12.0), ...

  4. 七天学会 SALT STACK 自动化运维 (1)

    七天学会 SALT STACK 自动化运维 (1) 简单理解 SALTSTACK 安装与配置 基本的使用方法 结束语 引用资源 简单理解 SALT STACK 笔者是初次接触 自动化运维 这一技术领域 ...

  5. outline属性

    outline(轮廓)用于设置元素周围的一条线,用于元素边框的外围,可起到突出元素的作用. outline属性所有浏览器都支持,如果规定了 !DOCTYPE,则 IE8 支持 outline 属性. ...

  6. 快速替换图片的组合-AE-样片!

    模板下载网址:http://pan.baidu.com/s/1hqCbErM

  7. Node.js快速入门

    Node.js是什么? Node.js是建立在谷歌Chrome的JavaScript引擎(V8引擎)的Web应用程序框架. 它的最新版本是:v0.12.7(在编写本教程时的版本).Node.js在官方 ...

  8. Pots

    poj3414:http://poj.org/problem?id=3414 题意:给你两个罐子的体积,然后让你只用这两个罐子量出给定k体积的水.题解:这里可以把两个罐子看成是一个二维的图,然后体积的 ...

  9. Communication System

    poj1018:http://poj.org/problem?id=1018 题意:某公司要建立一套通信系统,该通信系统需要n种设备,而每种设备分别可以有m1.m2.m3.....mn个厂家提供生产, ...

  10. JAVA线程示范之一种

    线程有两种方法生成,这是其中的一种.. MyRunnable.java public class MyRunnable implements Runnable { public void run() ...