精华内容
下载资源
问答
  • 面向对象是一种更优秀的的程序设计方法,它的基本思想是使用类、对象、继承、封装,消息等基本概念来进行程序设计。它是从现实世界中客观...作为系统的基本构成单元(而不是用一些与现实世界中的事物相关比较远,并...

    面向对象是一种更优秀的的程序设计方法,它的基本思想是使用类、对象、继承、封装,消息等基本概念来进行程序设计。它是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以现实世界中的事物(即对象)为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的类,作为系统的基本构成单元(而不是用一些与现实世界中的事物相关比较远,并且没有对应关系的其它过程来构造系统),这使得系统可以直接映射客观世界,并保持客观世界中事物及其相互关系的本来面貌。【看着懵逼就别看这段了】

    Java语言是纯粹的面向对象的程序设计语言,主要表现为Java完全支持面向对象的三种基本特征:继承、封装和多态,最小的程序单元是类,这些类可以生成系统中的多个对象,而这些对象则直接映射成客观世界的各种事物,整个Java程序由一个一个的类组成。
    在这里插入图片描述
    类:代表了客观世界中具有某些特征的一类事物,这些事物往往有一些内部的状态数据,面向对象不仅使用类来封装一类事物的内部状态数据,而且会提供操作这些状态数据的方法,还会为这类事物的行为特征提供相应的实现,这种实现也是方法,因此类定义=成员变量(状态数据)+ 方法(行为)

    面向对象的开发者需要直接对客观世界进行模拟:定义一个类,对应客观世界的哪种事物;业务需要关心这个事物的哪些状态,程序就为这些状态定义成员变量,业务需要关心这个事物的哪些行为,程序就为这些行为定义方法。

    例如要用程序完成猪八戒背媳妇这样一件事:
    在面向过程的世界里,一切以函数为中心,则应该表达为吃(猪八戒,西瓜)
    在面向对象的世界里,一切以类为中心,则应表达为猪八戒.吃(西瓜)

    展开全文
  • 关注Java后端技术栈”回复“面试”获取最新资料本文内容如何确定一个对象是垃圾对象?对于一部分来说先搞清楚,对象对象引用到底是什么区别?如果还不是很确定这两者的关系,请看:浅谈Jav...

    关注Java后端技术栈

    回复“面试”获取最新资料

    本文内容


    如何确定一个对象是垃圾对象?

    对于一部分人来说先搞清楚,对象与对象引用到底是什么区别?如果还不是很确定这两者的关系,请看:浅谈Java中的对象和对象引用

    Java是面向对象编程的语言,都说在Java世界里万事万物皆对象。

    类的声明周期和对象的声明周期。关于类的声明周期请看:JVM系列——java文件到JVM中的整个过程

    对象的生命周期

    下面大致说说对象的生命周期。

    创建阶段

    在创建阶段有几个步骤完成对象的创建:

    • 为对象分配存储空间

    • 开始构造对象

    • 从超类到子类对static成员进行初始化

    • 超类成员变量按顺序初始化,递归调用超类的构造方法

    • 子类成员变量按顺序初始化,子类构造方法调用

    一旦对象被创建,并被分派给某些变量赋值,这个对象的状态就切换到了应用阶段

    应用阶段

    该对象应该至少被一个强引用持有着。

    可以见阶段

    当一个对象处于不可见阶段时,说明程序本身不再持有该对象的不论什么强引用,尽管该这些引用仍然是存在着的。简单说就是程序的运行已经超出了该对象的作用域了。

    不可达阶段

    对象处于不可达阶段是指该对象不再被不论什么强引用所持有。

    与“不可见阶段”相比,“不可见阶段”是指程序不再持有该对象的不论什么强引用,这样的情况下,该对象仍可能被JVM等系统下的某些已装载的静态变量或线程或JNI等强引用持有着,这些特殊的强引用被称为”GC root”。存在着这些GC root会导致对象的内存泄露情况,无法被回收。

    收集阶段

    当垃圾回收器发现该对象已经处于“不可达阶段”而且垃圾回收器已经对该对象的内存空间又一次分配做好准备时,则对象进入了“收集阶段”。假设该对象已经重写了finalize()方法,则会去运行该方法的终端操作。

    这里要特别说明一下:不要重载finazlie()方法!finial方法来自Object中。参考:

    原因有两点:

    • 会影响JVM的对象分配与回收速度

    在分配该对象时,JVM需要在垃圾回收器上注冊该对象,以便在回收时可以运行该重载方法;在该方法的运行时需要消耗CPU时间且在运行完该方法后才会又一次运行回收操作,即至少需要垃圾回收器对该对象运行两次GC。

    • 可能造成该对象的再次“复活”

    在finalize()方法中,假设有其他的强引用再次持有该对象,则会导致对象的状态由“收集阶段”又又一次变为“应用阶段”。这个已经破坏了Java对象的生命周期进程,且“复活”的对象不利用兴许的代码管理。

    终结阶段

    当对象运行完finalize()方法后仍然处于不可达状态时,则该对象进入终结阶段。在该阶段是等待垃圾回收器对该对象空间进行回收。

    对象空间又一次分配阶段

    垃圾回收器对该对象的所占用的内存空间进行回收或者再分配了,则该对象彻底消失了,称之为“对象空间又一次分配阶段”。

    Java对象的四大引用

    先来了解对象的四大引用方式:

     JDK从1.2开始增加了多种引用方式:软引用、弱引用、虚引用 。

    强引用

        /**
         * /强引用
         */
        private void strangeReference() {
            String str = new String("");
            System.out.println(str);
            UserVo [] userVo = new UserVo[1000000000];
            System.out.println(userVo.toString());
        }

    方法中就算内存不够了而导致OOM,也不会进行回收这种引用。也是我们平时对象使用方式最多的方式。

    弱引用

    /**
     * 软引用
     */
    private void softReference() {
        Object obj = new Object();
        SoftReference<Object> sf = new SoftReference<Object>(obj);
        System.out.println(sf.toString());
    }

    如果一个对象具有软引用,内存足够GC就不会回收它,内存不足时就会回收这些对象的内存,故可以防止内存 泄露,增强代码的健壮性 。软引用用来实现内存敏感的高速缓存,比如说:网页缓存、图片缓存等。

    软引用

        /**
         * 弱引用
         */
        private void weakReference() {
            String str = new String("abc");
            WeakReference<String> abcWeakRef = new WeakReference<String>(str);
        }

    弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在Java中,用java.lang.ref.WeakReference类来表示。

    经典实用案列java.langThreadLocal

    ThreadLocal相关请参考:
    ThreadLocal造成内存溢出OOM面试再问ThreadLocal,别说你不会
    再谈ThreadLocal
    ThreadLocal&nbsp;面试六连问,中高级必问

    虚引用

        /**
         * 虚引用
         */
        private void phantomReference() {
            String str = new String("abc");
            ReferenceQueue<String> rq = new ReferenceQueue<String>();
            PhantomReference<String> phantomRef = new PhantomReference<String>(str, rq);
        }

    如果一个对象仅持有虚引用,那么它就和没有引用一样,在任何时候都可以被垃圾回收期收回     作用:跟踪对象被垃圾回收器回收的活动。

    如何确定一个对象是垃圾对象?

    要想进行垃圾回收,得知道什么样的对象是垃圾。

    引用计数法

    对于某个对象而言,只要应用程序中持有该对象的引用,就说明对象不是垃圾,如果一个对象没有任何引用指向它,那么改对象就是垃圾对象。

    在对象头处维护一个counter,每增加一次对该对象的引用计数器自加,如果对该对象的引用失联,则计数器自减。当counter为0时,表明该对象已经被废弃,不处于存活状态。这种方式一方面无法区分软、虛、弱、强引用类别。另一方面,会造成死锁,假设两个对象相互引用始终无法释放counter,永远不能GC

    弊端:如果一个对象A持有对象B,而对象B也持有一个对象A,那发生了类似操作系统中死锁的循环持有,这种情况下A与B的counter恒大于1,会使得GC永远无法回收这两个对象 。

    可达性分析

    通过一系列为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明该对象是不可用的。如果对象在进行可行性分析后发现没有与GC Roots相连的引用链,也不会理解死亡。它会暂时被标记上并且进行一次筛选,筛选的条件是是否与必要执行finalize()方法。如果被判定有必要执行finaliza()方法,就会进入F-Queue队列中,并有一个虚拟机自动建立的、低优先级的线程去执行它。稍后GC将对F-Queue中的对象进行第二次小规模标记。如果这时还是没有新的关联出现,那基本上就真的被回收了。

    那么那些点可以作为GC Roots呢?一般来说,如下情况的对象可以作为GC Roots

    1. 虚拟机栈(栈桢中的本地变量表)中的引用的对象

    2. 方法区中的类静态属性引用的对象

    3. 方法区中的常量引用的对象

    4. 本地方法栈中JNI(Native方法)的引用的对象

    对于大多数人来说主要是理解上面这四点。要通过这四点去反推,去领悟为什么能把他们当做GC Roots。把四点理解清楚了,理解的这GC Roots就简单了。

    往期精彩:

    面试被问:缓存击穿有什么解决方案

    面试被问:5 亿整数的大文件,排个序 ?

    面试被问:高并发下的接口幂等性

    面试官问:浏览器输入 URL 回车之后发生了什么?

    面试题:数据量很大,分页查询很慢,有什么优化方案?

    凭借这套面试题,工资狂涨60%!!!

    在这金三银四的季节,栈长为大家准备了几份面试宝典:

    • 《java面试宝典5.0》

    • 《Java(BAT)面试必备》

    • 《350道Java面试题:整理自100+公司》

    • 《资深java面试宝典-视频版》

    • 大量电子书籍

    获取方式:点“在看”,V信扫描上面二维码领取。

    展开全文
  • 比如历史介绍(比如java之父James Gosling等怎么创造java)、特性(简单性、面向对象、网络技能、健壮性、安全性、可移植性、高性能、多线程、动态性等等)以及开发环境的搭建等相对简单并且和实际开发作用不是很...

            这是复习java的第一篇文章,这边主要是复习java的对象和类相关的知识点。有关于java的简介,比如历史介绍(比如java之父James Gosling等人怎么创造java)、特性(简单性、面向对象、网络技能、健壮性、安全性、可移植性、高性能、多线程、动态性等等)以及开发环境的搭建等相对简单并且和实际开发作用不是很大的问题,这里就不在一一介绍了,网上随便一搜就能找到很详细的介绍;另外,关于Java的基本程序设计结构,这里也不打算仔细介绍,毕竟还是和其他语言差不多,比如8个基本数据类型(byte、short、int、long、char、float、double、boolean)、变量、运算符、字符串、控制流程、大数值、数组等等就不在这里讨论了。

    Java 对象和类

    类:类是构造对象的模板。

    对象:对象是类的一个实例。

    简单理解:人可以理解成为是类,每一个具体的人是一个个的对象,当我们说到人的时候,不能说一定是谁,有可能是张三,有可能是李四,还可能是王二;但是对于张三来说,他是一个人,这是毋庸置疑的。

    Java 类

    现实中的类可以包含很多东西,比如名字、长相特征、行为活动等,Java种的类也具有属性和行为,属性体现为类中的变量,行为是通过类中的方法来体现的。一个类可以包含的变量类型有以下三种:

    • 局部变量:定义在代码块助攻的变量,代码块可以是方法(包括构造方法)、语句块。这种变量的声明和初始化都是在代码块中,所以会随着方法的结束而销毁
    • 成员变量:定义在类中、方法体之外的变量,它的初始化是在创建对象的时候
    • 类变量:定义在类中、方法体之外的变量,并且是被static关键词修饰。

    类之间的关系

    类之间常见的关系有三种:

    • 依赖(uses-a):一个类中的方法操作了另一个类的对象,这种称为依赖,像这种的耦合度,我们在开发中是要尽量减少的,耦合度越小越好。
    • 聚合(has-a):是一种整体与部分的关系,一个类的对象中包含了另一个类的对象,可以具有各自的生命周期,好比公司和员工的关系,彼此各自具有自己的生命周期
    • 继承(is-a):一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。
    • 组合(contains-a):也是一种整体与部分的关系,但是是一种强的聚合关系,有着共同的生命周期,好比人的大脑和人的关系一样。

    构造函数

    构造函数是一个和类同名、没有返回值、可以有0个或者多个参数的方法。

    一个类当没有提供任何构造函数的情况下,系统会默认提供一个没有参数的构造函数,只要在编写类的时候提供了构造函数,那么系统将不会提供默认的构造函数。构造函数和其他函数的一个很大的区别是,构造函数总是伴随着new操作是被调用的,并且不能通过一个已存在的对象去调用构造函数。一个函数可以有多个构造函数。

    Java 对象的创建

    最常用的方法是试用关键字new调用构造函数来创建一个对象,例如定义好了一个Person类,需要创建对象可以:Person p = new Person();

    另外还可以使用其他的方法来创建对象,比如可以使用反射技术,利用newInstance()方法来创建一个实例。

    如果该类已经序列化的,即已经实现了Serializable接口,可以使用流来创建一个对象;

    当然使用clone也是可以的。


    关于对象的其他操作,比如访问实例变量和方法,这里就暂时不讨论了。





    展开全文
  • 由于其实现相对简单,取各种随机对象的源码网上也比比皆是,因而貌似也没做一个通用的、可扩展的随机对象生成。 博主要不是因为闲得蛋疼也是不会想到做这个东西的,好了,言归正传。分析随机对象生成,其要点无外...

    随机对象生成可以说是随机数生成的一个延伸,在实际使用中,我们可能要生成的不是一个简简单单的数字,而是像数字、大小写字符、中文汉字、算数表达式等。

    由于其实现相对简单,取各种随机对象的源码网上也比比皆是,因而貌似也没人做一个通用的、可扩展的随机对象生成。

    博主要不是因为闲得蛋疼也是不会想到做这个东西的,好了,言归正传。分析随机对象生成,其要点无外乎三点:

    1. 设置随机对象集;

    2. 获取一个或多个随机对象;

    3. 获取一个或多个不重复随机对象;

    在这三点中,后两者算法皆固定,仅设置对象集不同,故而完全可以使用模板模式。

    就第一点而言,设置随机对象集,我们一般的想法是创建一个集合(数组、List。。)保存所有对象。但我并为采用该方法。具体原因如下:

    1. 元素个数可能非常;

    2. 元素的获取可能是通过一个算法动态获取,执行之前并不知道具体有哪些元素,或者不想枚举;

    3. 设置一个集合,这是已经是一个具体的实现了,模板并不需要知道这些,模板只需要定义一个方法--通过一个索引去获取对应的元素。像下面的代码一样:

    /// <summary>
    /// 根据实际索引获取对象
    /// </summary>
    /// <param name="realIndex"></param>
    /// <returns></returns>
    protected abstract T ElementAt(int realIndex);
    

     

    转载于:https://www.cnblogs.com/Pupa/p/4564908.html

    展开全文
  • 面向层编程,是面向切面编程,不是面向对象编程 实现不同层逻辑只能是不同的方法, 而不是多个对象实例 一系列层的叠加关系就是一系列方法的嵌套关系 描述层 第1层 对象路由(也叫业务传输模式) 点对点: 客户端发送...
  • TextureRegion即纹理区域, 他所使用的坐标...可能有些对uv坐标映射不是太清楚,这里我画了张图 其中 float u, v; 代表起点的uv坐标 float u2, v2; 代表终点的uv坐标 下面我们来看看uv是怎么计算的? 它里面有个se
  • 说明 写代码总有bug 传统的写代码方式是hardcode。即由按照程序语言进行编写,然后语言的组件进行编译/解释,交给机器执行。...除去一些产品之外(例如拖拽编程之类的,那也不是最优方式),其实比较常见的方式是
  • 点击上面小程序卡片进入小程序可免费获取小程序开放全功能(3级检索命令)权限至2021013123:59:59在之前...如果我们感兴趣的分析对象不是系统自动生成的TOP10个申请,我们可以根据自己的需求,自由定义竞争申请。...
  • 仅仅几分钟前,一切都还很正常,直到 ………… ………… 主持:“下一个议程,题为‘对象计数’的 C++ 编程技术讲座,主讲是zero。” zero: “什 …… 什么?!等一等,这个讲座不是应该由 Solmyr 主讲吗?!”...
  • 【C++】C++类和对象

    2017-06-26 20:50:21
    最近在公司弄游戏开发,C++基础也不是特别好,所以就打算继续开始学习C++。...(可能基础知识不是很详细,对没有其他语言基础的来说不是很友好,请见谅)每个实体都可以看成一个对象。在C++中,对象的类
  • 面向对象的思维过程

    2021-03-02 23:54:48
    本文是关于面向对象思维过程系列文章的第一部分,选择这个主题作为书籍或专栏的标题是一个重大的决定,做出这个选择并不简单,因为已经有很多面向对象主题的好书和文章了,包括面向对象分析、面向对象设计、面向对象...
  • Java 对象和类

    2019-06-21 11:05:00
     对象是类的一个实例(对象不是找个女朋友),有状态和行为。例如所有的人类(类)中,你的存在(实例)。你所拥有的属性(状态),例如身高、肤色、衣服颜色、身份等一系列。你日常的所作的事情(行为),例如吃饭...
  • 基于C++的纯面向对象的通用高性能大并发TCP-SERVER/CLIENT开发框架实践系列之前言篇yijian 2008-12-21 technologier@126.com1. 回首工作几年了,没什么沉淀,不是忙工作就是忙着休息,大四和工作的第一年还偶尔在...
  • 看到题目,我相信一定有很多觉得,嗯,我确确实实是个逗比。各种权威资料上写得非常清楚,C语言是...我并不是挑战权威,说C是面向对象的语言。确实,C的确是面向过程的语言,其中并没有包括任何面向对象的语法。而...
  • 例如:站在抽象的角度,车具备发动机、轮胎、机动车道行驶、加汽油等一系列特征,车会拉货、加汽油、载等方法。车仅仅是一个抽象的概念,而不是一个存在的实体,但是具备车这个群体的属性和方法的对象叫车,而这个...
  • 如果您发现此过程很快,那么可以添加一系列附加功能,以期努力改善用户体验。 对于项目,您将生成一个3x3的图块网格(总共9个),其中在中间。 每个标题将包含物种,图像和事实。 对于人类图块,您将显示人类的...
  • 估计也没什么看了,而且服务器端对象模型除了在某些企业开发中会用到,从2013时代开始其实已经不是SharePoint开发的最佳选择了。不过既然已经开了坑,还是把坑填完了。 以下是汇总的文章列表目录(共23篇): 序言...
  • 以至于很多学习编程的都深深的相信“只要用了面向对象编程(以及基于其基础之上的的一系列设计模式、规范、工具、框架),就能得到非常容易维护、可以复用、明晰可理解的代码“。但,这并不是真的。...
  • <a href="https://github.com/johnlui/Learn-Laravel-5/issues/18">2017 版 Laravel 系列入门教程(三)【最适合中国的 Laravel 教程】</a></h3> 该提问来源于开源项目:johnlui/Learn-Laravel-...
  • 。。 现有设计:消息设计为实体并为聚合根,发件、收件设计为值对象。 三个问题: 实体最重要的特性是什么? ...摘录一段:许多对象不是由它们的属性来定义,而是通过一系列的连续性(cont...
  • 本节课我们讲对象,我们也把面对对象的编程叫做 OO或者OOP如果你不是因为看见这个系列教程才开始学.net的话,那你应该不只一次的听说,c#是一种面对对象的编程语言!那么什么叫对象呢?????人家说对象分为抽象对象和...
  • 刚发了开篇,就有提出了不少意见,首先声明,我也才接触不久,不是专家,仅供学习交流之用.错误之处请见谅,并指出. 一.AutoCAD对象分为: 1.图形对象,例如直线(Lines,球体(Sphere,文本(Text)和尺寸(Dimensions) 2.样式...
  • 本节课我们讲对象,我们也把面对对象的编程叫做 OO或者OOP如果你不是因为看见这个系列教程才开始学.net的话,那你应该不只一次的听说,c#是一种面对对象的编程语言!那么什么叫对象呢?????人家说对象分为抽象对象和...
  • 看到题目,我相信一定有很多觉得,嗯,我确确实实是个逗比。各种权威资料上写得非常清楚,C语言是面向过程的语言,C++...我并不是挑战权威,说C是面向对象的语言。确实,C的确是面向过程的语言,其中并没有包括任...
  • 3D建模的核心技术》中,我们讨论了3D建模技术,但BIM模型不是只包含3D几何,还必须包含建筑信息,甚至很多认为“I”才是“BIM”的灵魂。“I”的范畴可以很广阔,下面我们从两个方面加以讨论:一方面是对象本身的...
  • 软件工程之面向对象技术

    千次阅读 热门讨论 2015-10-25 19:04:27
    软件并不是纯物化的东西,其中包含着的因素,于是就有甚多变动的东西,不可能像理想的物质生产过程一样,基于物理学的原理来做,早期的软件开发仅考虑的因素,传统的软件工程强调物性的规律,传统软件工程以模块...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 471
精华内容 188
关键字:

对象不是人系列