(49)  (0)

面向对象

学习java大家接触到的最多的话语无非就是面向对象,可能大家没有仔细研究过这个问题,但是面向对象这个问题在JAVA面试中,基本百分之百会考到。可能大家也都有自己的理解,但是最重要的是能够清晰的表达出来,所以在这里我提供一份详细的答案,供大家理解。

啥是面向对象?

面向对象(Object Oriented,OO)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术[1] 发展到一定阶段后的产物。 
个人理解:面向对象就是对现实世界的物理规律的抽象,能够是我们更加容易的以人类的思维方式来告诉机器来怎么实现我们想要的功能。 
补充:面试标准答案:

-面向对象的三大特征:封装,继承,多态。 
-继承是为了代码复用(java是单继承) 
-多态 (接口)是为了弥补java单继承的缺陷,而应运而生,(方法的重载和覆盖(重写)) 
单继承缺陷: 
1. 代码在多个子类中重复 
2. 很难知道所有的行为 
3. 运行时不容易改变 
4. 迁一发动全身,造成子类不想要的改变


什么是多态?多态的机制?

多态是指不同的对象对于相同的消息会做出不同的相应。在java中通过将子类对象引用赋值给超类对象来实现方法的动态调用(运行时绑定)。 
机制:方法重载(本类方法名相同,而方法参数类型不同或者参数个数或者返回值不同,来实现方法的动态调用),和方法覆盖(子父类之间)


接口和抽象类区别?

接口是类的高度抽象,抽象类的抽象程度较低于接口 
1.接口可以多继承,抽象类单继承 
2.抽象类的可以存在非抽象方法,和抽象方法,接口中只能存在抽象方法

3.抽象类中可以存在属性,不必须初始化,而抽象方法可以存在属性但必须初始化


个人理解

合理利用java中的继承和多态,我们可以把所有具体类的共有属性和能力都定义在超类中,把并不是每个类都具有的能力定义在接口中,让具体类都继承超类,动态实现接口


代码实现:

例子:人类(超类)(Person),具体类:学生(Student),老师(Teacher) 
共有属性:name,id,age 
共有能力:问好(sayHello) 
老师能力:教学生(ITeach) 
学生能力:玩(IPlay) 
学生长大后也可能当老师,所以当学生长大后,也会具备教学生的能力,所以只要继承ITeach接口即可,当然老师也会娱乐,只要继承IPlay

结构图: 
 
代码如下:

Person:
package com.leige.duotai; /**
* @author 都市桃源 (只要路对,就不怕路远)
* @since 2016年8月17日
* @!TODO 定义超类,保存所有子类共有属性,和能力(方法)
* 项目名称:Demo
* 这里定义抽象类更好,所有子类都要覆盖sayHello方法
*/
public abstract class Person {
protected String name;
protected String id;
protected int age;
public Person(String name, String id, int age) {
super();
this.name = name;
this.id = id;
this.age = age;
}
public abstract void sayHello();
} Student: package com.leige.duotai; /**
* @author 都市桃源 (只要路对,就不怕路远)
* @since 2016年8月17日
* @!TODO 子类学生
* 项目名称:Demo
*/
public class Student extends Person implements IPlay,ITeach{ /**
* @param name
* @param id
* @param age
* 定义子类的属性
* 如果超类中有非无参的构造方法和无参的构造方法
* 那么子类就要指定使用的超类构造方法
*/
public Student(String name, String id, int age) {
super(name, id, age);;// 指定父类的构造方法,不指定,编译器会隐式添加一个super() } /* (non-Javadoc)
* @see com.leige.duotai.Person#sayHello()
* 覆盖父类的方法,做出不同的相应
*/
@Override
public void sayHello() {
System.out.println("老师好,我是学生:" + "id是:" + this.id + "\t年龄: " + this.age +
"\t姓名是:"+ this.name
);
} /* (non-Javadoc)
* @see com.leige.duotai.ITeach#teach()
* 实现接口具备教学能力
*/
@Override
public void teach() {
System.out.println(this.name+"我长大了,我也会教学生了"); } /* (non-Javadoc)
* @see com.leige.duotai.IPlay#play()
*
* 具备娱乐能力
*/ @Override
public void play() {
System.out.println(this.name+"也爱玩"); } } Teacher: package com.leige.duotai; /**
* @author 都市桃源 (只要路对,就不怕路远)
* @since 2016年8月17日
* @!TODO
* 项目名称:Demo
* 老师类
*/
public class Teacher extends Person implements IPlay,ITeach{ /**
* @param name
* @param id
* @param age
* 指定父类的构造方法
*/
public Teacher(String name, String id, int age) {
super(name, id, age);// 指定父类的构造方法,不指定,编译器会隐式添加一个super() } @Override
public void sayHello() {
System.out.println("同学们好,我是老师:" + "id是:" + this.id + "\t年龄: " + this.age +
"\t姓名是:"+ this.name
);
} /* (non-Javadoc)
* @see com.leige.duotai.IPlay#play()
* 具备教学能力
*/
@Override
public void play() {
System.out.println("老师也爱玩"); } /* (non-Javadoc)
* @see com.leige.duotai.ITeach#teach()
*
* 具备娱乐能力
*/
@Override
public void teach() {
System.out.println("老师会教学生");
} } ITeach: package com.leige.duotai; /**
* @author 都市桃源 (只要路对,就不怕路远)
* @since 2016年8月17日
* @!TODO 教学能力接口
* 项目名称:Demo
*/
public interface ITeach {
public void teach();
} IPlay: package com.leige.duotai; /**
* @author 都市桃源 (只要路对,就不怕路远)
* @since 2016年8月17日
* @!TODO 娱乐接口
* 项目名称:Demo
*/
public interface IPlay {
public void play();
} 测试类:
package com.leige.duotai; /**
* @author 都市桃源 (只要路对,就不怕路远)
* @since 2016年8月17日
* @!TODO 测试demo
* 项目名称:Demo
*/
public class TestDemo {
public static void main(String[] args) {
Person stu=new Student("学生1号","1",18);
//基本能力
stu.sayHello();
//动态能力
((IPlay) stu).play();
((ITeach) stu).teach();
//教师同理
}
}

java面向对象基础回顾的更多相关文章

  1. 084 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 03 构造方法-this关键字

    084 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 03 构造方法-this关键字 本文知识点:构造方法-this关键字 说明:因为时间紧 ...

  2. 【重走Android之路】【Java面向对象基础(三)】面向对象思想

    [重走Android之路][基础篇(三)][Java面向对象基础]面向对象思想   1 面向对象的WWH   1.1 What--什么是面向对象         首先,要理解“对象”.在Thinkin ...

  3. 【重走Android之路】【Java面向对象基础(二)】细说String、StringBuffer和StringBuilder

    [重走Android之路][基础篇(二)][Java面向对象基础]细说String.StringBuffer和StringBuilder   1.String String是Java中的一个final ...

  4. 【重走Android之路】【Java面向对象基础(一)】数据类型与运算符

    [重走Android之路][基础篇(一)][Java面向对象基础]数据类型与运算符   1.数据类型介绍 在Java中,数据类型分为两种:基本数据类型和引用类型. 基本数据类型共8种,见下表: 基本数 ...

  5. 086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结

    086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结 本文知识点:面向对象基础(类和对象)总结 说明 ...

  6. 085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用

    085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用 本文知识点:构造方法调用 说明:因为时间紧张,本人写博客过程中只是 ...

  7. 083 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 02 构造方法-带参构造方法

    083 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 02 构造方法-带参构造方法 本文知识点:构造方法-带参构造方法 说明:因为时间紧张, ...

  8. 082 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 01 构造方法-无参构造方法

    082 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 01 构造方法-无参构造方法 本文知识点:构造方法-无参构造方法 说明:因为时间紧张, ...

  9. 081 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 06 new关键字

    081 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 06 new关键字 本文知识点:new关键字 说明:因为时间紧张,本人写博客过程中只是 ...

随机推荐

  1. windows gvim插入当前时间

    :nnoremap <F5> "=strftime("%c")<CR>P :inoremap <F5> <C-R>=str ...

  2. [转]使用jquery-webcam插件,实现人脸采集并转base64

    项目需求:在ie或chrome浏览器下,调用电脑摄像头(确保使用的是笔记本电脑,或者摄像头功能正常使用的台式机),进行人脸图像采集预览,并将图片的base64码传入到后台进行后续操作.该demo适用于 ...

  3. python内置函数之dict()

    class dict(**kwargs) 返回一个字典.本方法用来创建一个字典对象.只能传入一个参数. >>> dict(a=1) {'a': 1} 也可以传入映射函数作为参数 &g ...

  4. sphider 丁廷臣简体中文完美汉化版带蜘蛛搜索引擎程序 v1.3.4

    sphider 丁廷臣简体中文完美汉化版带蜘蛛搜索引擎程序 v1.3.4是最官方的新版,免费开源,用官方最新发布原版汉化.未更改任何内核文件. Sphider 是一个完美的带有蜘蛛的搜索引擎程序. S ...

  5. jQuery瀑布流插件 Masonry

    http://www.jq22.com/yanshi362 参考案例 http://image.quanjing.com/lvyou/

  6. jquery插件-table转Json数据插件

    使 用开源插件Table-to-json: 官方地址:http://lightswitch05.github.io/table-to-json/ 功能说明:将js对象table转换成javascrip ...

  7. FreeRTOS 二值信号量,互斥信号量,递归互斥信号量

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章节讲解 FreeRTOS 任务间的同步和资源共享机制,二值信号量. 二值信号量是计数信号量的一种特殊形式 ...

  8. jsp error-page没有生效

    1.首页检查web.xml中的配置,确保路径是正确的 <error-page> <error-code>404</error-code> <location& ...

  9. ajax——三级联动下拉列表框的优化(简化页面,用jquery插件代替原来页面代码,返回处理数据类型为"TEXT")

    数据库: 主页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  10. HTML5关于上传API的一些使用(下)

    通过前面两篇的分享,我们已经搞定了单个文件的普通的上传,包括文件预览,图片预览,上传速度等前端界面的显示,这次我们来谈谈关于>XMLHttpRequest2.0在界面之后假如才用分片上传能做到一 ...