OOP,是java语言的特性。面向对象思想贯穿整个java开发。

  那什么是面向对象呢?什么是对象?

  在面向对象设计语言看来,万事万物都为对象。生活中的一个物体,有自己的属性,有自己的活动。比如一辆汽车,有轮胎,有座椅等等,也可以加速,减速。这在OOP中就是属性和方法。通过编程,将一个个的对象联系起来,通过方法来相互之间传递消息,这样就构成了一套程序。

  每个对象,都有自己的类型,比如说宝马车,它的“类”可以为汽车。物体都属于一个大类。因此如果在一特定的类下面,所有的对象都能接受到同样的消息。换句话说,比如属于汽车类下的小轿车,越野车,大客车,是不同的对象,但是如果发出“踩油门”的指令,这几个对象都能接受到该指令并进行自己的处理。每个对象都有接口。也就是每个对象都通过方法来做事。通过方法,对象可以对外提供服务。在设计对象时,如果以“提供服务”的思想来进行设计,可以提高程序的内聚性。

  在对程序进行开发使用时,存在两种角色。第一是类的开发者。这种开发者开发的是一个个库,来提供服务。第二种明显就是程序的使用者了。使用者通过对开发者开发的库进行开发应用。因此作为类的开发者或者在开发类的时候,在设计时需要注意隐藏部分的设计。隐藏部分数据或者方法,不仅可以防止使用者在调用时,误操作敏感脆弱的部分。同时使得类的开发者能以对使用者透明的情况下修改隐藏部分的程序。使用public、private、protect等进行访问控制。

  在将类创建好了后,那我们就要去用类了。如果我们希望能够减少代码量,或者便于程序的扩展、维护、健壮等等,那就可以用复用类的形式达到目的。复用代码的方式有两种。第一种是“组合”,将现成的类组合成一个新类。一种是继承。通过对现有的类进行扩展和覆盖,也能复用代码。

  我们知道,封装、继承、多态是面向对象三大特性。java的多态其实是在代码复用中最重要的特性。多态成就了接口!泛化(generic)是多态的一种体现形式。不同的参数类型,在代码运行的时候,才能具体知道要运行什么代码。这样就和面向过程的程序有很大区别。面向过程的程序在编译阶段,对每个函数都具体到一个绝对地址。这是“前期绑定”。而java是“后期绑定”,当对象发送消息时,才知道要运行什么代码。编译器的作用只是确保要调用的方法存在,以及对参数和返回值进行验证。java通过对象中存储的信息来计算需要调用什么方法。

  同时,在java中,所有的对象都是继承与object类。这样的好处就是能保证所有的对象都具备某些共同的功能,能够简化对象的创建以及垃圾回收。java的对象创建时,由new进行分配空间创建,创建于堆中。当对象不可达时,由GC自动进行回收。这里我们可以看出,对象的创建和回收是走的两条不同的路。GC需要通过软指针一直监控着各个对象的情况,这也是java性能不好的原因之一。真是成也GC,败也GC。

大家一起和snailren学java-(一)对象导论的更多相关文章

  1. 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)

    硬盘和内存的作用是什么 硬盘的作用毫无疑问我们大家都清楚,不就是用来存储数据文件的么?如照片.视频.各种文档或等等,肯定也有你喜欢的某位岛国老师的动作片,这个时候无论我们电脑是否关机重启它们永远在那里 ...

  2. 从零开始学 Java - Spring 集成 ActiveMQ 配置(二)

    从上一篇开始说起 上一篇从零开始学 Java - Spring 集成 ActiveMQ 配置(一)文章中讲了我关于消息队列的思考过程,现在这一篇会讲到 ActivMQ 与 Spring 框架的整合配置 ...

  3. 快学Java NIO 续篇

    可以先看Java NIO的整体介绍,这篇接着说以下内容,<快学Java NIO>续篇 FileChannel SocketChannel ServerSocketChannel Java ...

  4. 快学Java NIO

    Java NIO Tutorial 地址:http://tutorials.jenkov.com/java-nio/index.html Java NIO系列教程译文地址:http://ifeve.c ...

  5. (二)一起学 Java Collections Framework 源码之 AbstractCollection

    . . . . . 目录 (一)一起学 Java Collections Framework 源码之 概述(未完成) (二)一起学 Java Collections Framework 源码之 Abs ...

  6. 2018年如何快速学Java

    前言 只有光头才能变强 提前预警:本文适合Java新手阅读(老手可在评论区给下建议),希望大家看完能有所收获. 一.为什么我要写下这篇文章 1.1直接缘由: 在今天(2018年11月4日)有个同学给我 ...

  7. 学JAVA第二十天,接触异常处理,自定义异常

    1.java.lang.NullPointerException(经常报)(运行时异常) 属于运行时异常,是编译器无法预知的异常,比如你定义了一个引用变量String a,但是你确没有用new关键字去 ...

  8. 学JAVA第十天,一维数组及二维数组的使用。

    今天老师讲了JAVA数组,之前学C#的时候就学过一维数组,至于二维数组当时只是粗略普及了一下. 现在想学JAVA又学到了数组,但是这次不同,注重讲二维数组,因为老师知道我们都了解一维数组了. 所以现在 ...

  9. 再学Java 之 interface的成员变量

    前言:最近在学多线程,写“哲学家就餐问题(Dining Philosophers)”的时候,需要定义一个全局的变量,即哲学家的人数.常用的做法是在其中一个类中定义一个static final的变量,然 ...

随机推荐

  1. gcc -frandom-seed

    -frandom-seed=string This option provides a seed that GCC uses when it would otherwise use random nu ...

  2. Linux打开防火墙telnet端口

    检查端口情况:netstat -an | grep 22 关闭端口号:iptables -A INPUT -p tcp --drop 端口号-j DROP                    ipt ...

  3. HDU 5547 Sudoku (暴力)

    题意:数独. 析:由于只是4*4,完全可以暴力,要注意一下一些条件,比如2*2的小方格也得是1234 代码如下: #pragma comment(linker, "/STACK:102400 ...

  4. The web.config file for this project is missing the required DirectRequestModule.

    The web.config file for this project is missing the required DirectRequestModule.   将应用程序集的模式由集成改为经典 ...

  5. 使用gRPC搭建Server端与Client端

    gRPC简介 gRPC是一种RPC框架技术,采用Protocal Buffers(协议缓存) 作为其接口定义的语言(就是Proto来写接口)和基础的消息交换格式. 在gRPC中,客户端应用程序可以直接 ...

  6. Docker环境下的前后端分离项目部署与运维(七)Redis高速缓存

    Redis高速缓存 利用内存保存数据,读写速度远超硬盘:可以减少I/O操作,降低I/O压力. 发红包.抢红包的数据可以存在高速缓存中,加快处理速度,不需要经过数据库 淘宝首页一些优惠活动商品等热数据可 ...

  7. Cinder服务使用

    Cinder环境 Cinder配置 重新创建卷组cinder-volumes [root@openstack centos]# vgremove cinder-volumes Configuratio ...

  8. Codeforces Round #459 (Div. 2):D. MADMAX(记忆化搜索+博弈论)

    题意 在一个有向无环图上,两个人分别从一个点出发,两人轮流从当前点沿着某条边移动,要求经过的边权不小于上一轮对方经过的边权(ASCII码),如果一方不能移动,则判负.两人都采取最优策略,求两人分别从每 ...

  9. Eureka 代码详解

    看过之前文章的朋友们,相信已经对Eureka的运行机制已经有了一定的了解.为了更深入的理解它的运作和配置,下面我们结合源码来分别看看服务端和客户端的通信行为是如何实现的.另外写这篇文章,还有一个目的, ...

  10. 湖南集训day7

    难度:☆☆☆☆☆☆ /* 由观察可知 同种颜色的减去他的父亲值相同 我们考虑把询问的两个数分别减去小于它的最大斐波那契数. */ #include<iostream> #include&l ...