(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. sso单点登录研究

    iframe跨域通信的通用解决方案http://www.alloyteam.com/2012/08/lightweight-solution-for-an-iframe-cross-domain-co ...

  2. Android - 资源(resource)转换为String

    资源(resource)转换为String 本文地址: http://blog.csdn.net/caroline_wendy Android建议资源的动态绑定, 即把string写入资源内, 然后运 ...

  3. Android批量图片载入经典系列——afinal框架实现图片的异步缓存载入

    一.问题描写叙述 在之前的系列文章中,我们使用了Volley和Xutil框架实现图片的缓存载入,接下来我们再介绍一下afinal 框架的使用. Afinal 是一个android的http框架.sql ...

  4. 二叉排序树及其C代码

    1.二叉排序树的定义   二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree).其定义为:二叉排序树或者是空树, 或者是满足例如以下性质的二叉树 ...

  5. 李洪强iOS经典面试题35-按层遍历二叉树的节点

    李洪强iOS经典面试题35-按层遍历二叉树的节点 问题 给你一棵二叉树,请按层输出其的节点值,即:按从上到下,从左到右的顺序. 例如,如果给你如下一棵二叉树:    3   / \  9  20   ...

  6. 2018.7.13vue知识小结

    //配置是否允许vue-devtools检查代码,方便调试,生产环境中需要设置为false Vue.config.devtools=false; Vue.config.productionTip=fa ...

  7. 存档格式选择--JSON

    游戏里存档可以直接用lua,但是lua需要有一定编程基础:另外可以用ini,不过ini又太简单了,复杂的 格式无法用ini描述:还可以用xml,它的表达能力非常丰富,甚至有限数据库都用xml来作存储结 ...

  8. 未能加载文件或程序集“Autofac, Version=3.4.0.0,

    遇到这个错误的时候:如下图 未能加载文件或程序集“Autofac, Version=3.4.0.0, Culture=neutral, PublicKeyToken=17863af14b0044da” ...

  9. Mac 终端编译运行 C++

    1.在编辑器中写好C++代码 2.打开终端打开文件对应的地址 3.用g++命令来编译.cpp文件 4.用./文件名来运行 观察文件的目录可发现 g++ 源文件名 编译源文件,产生a.out ./文件名 ...

  10. HttpURLConnection的使用

    import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; ...