(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 7 Path环境变量255限制的解决办法,SUBST

    C:\Users\xxx>subst /? Associates a path with a drive letter. SUBST [drive1: [drive2:]path] SUBST ...

  2. 【Android】14.2 外部文件存储和读取

    分类:C#.Android.VS2015: 创建日期:2016-02-27 一.简介 1.基本概念 内部存储的私有可用存储空间一般都不会很大,对于容量比较大的文件,例如视频等,应该将其存储在外部存储设 ...

  3. python 使用urllib.urlopen超时问题的解决方法

    准备写一个python脚本抓取网页数据,前面抓了几个都没有什么问题,但总会抓取不完整,在中间过程中没有反应,发现执行urlopen的地方总是提示超时,百度了一下,因为我使用的是urllib不是urll ...

  4. iOS 开发如何入门

    iOS 开发如何入门 新人如何入门 上一篇文章的回复中,很多读者让我推荐入门图书.其实我觉得每个人可能有自己喜欢的学习方式,我习惯的不一定适合你.不过我可以分享一下我当时是如何学习 iOS 开发的. ...

  5. Python正则表达式中的re.S的作用

    在Python的正则表达式中,有一个参数为re.S.它表示“.”(不包含外侧双引号,下同)的作用扩展到整个字符串,包括“\n”.看如下代码: import re a = '''asdfhellopas ...

  6. ubuntu和pypi换源

    ubuntu用apt-get下载的源是可以更换的.之前一直是打开软件中心在编辑里找源,找到后系统会自动备份原来的源并换源.奇怪却搜不到自己学校的源=.= 想换源还有一个原因,之前在update的时候会 ...

  7. 【MySql】Java 批量插入数据库addBatch

    //addBatch批量插入数据库 public static void insertCommentToMySql(Set<String> commentList) { Iterator& ...

  8. CodeForces 459D Pashmak and Parmida's problem

    Pashmak and Parmida's problem Time Limit:3000MS     Memory Limit:262144KB     64bit IO Format:%I64d ...

  9. base64变形注入与联合查询注入的爱情故事

    先来写一下GET的知识点: 1.知道了convart函数(CONVERT函数是把日期转换为新数据类型的通用函数) 2.Illegal mix of collations for operation ' ...

  10. 深度剖析ConcurrentHashMap(转)

    概述 还记得大学快毕业的时候要准备找工作了,然后就看各种面试相关的书籍,还记得很多面试书中都说到: HashMap是非线程安全的,HashTable是线程安全的. 那个时候没怎么写Java代码,所以根 ...