深入理解面向对象与反射

面向对象

  周志明在《深入理解JVM》一书中这样写道:在软件业发展初期,程序编写以算法为核心,程序员把数据和过程分别作为独立的个体来考虑,数据代表问题空间中的客体,程序代码则用于处理这些数据,这种思想是站在计算机的角度去抽象问题和解决问题,称为面向过程的:编程思想,而面向对象的编程思想是站在现实世界的角度去抽象和解决问题,它把数据和行为都看作是对象的一部分,这样使得程序员可以以符合现实世界的思维来编写和组织程序”

  但是由于现实世界与计算机世界之间不可避免的存在一些差异,例如,人很难想象现实中的对象在一项工作期间,会被不停的中断和切换,对象的属性(数据)可能会在中断期间被修改和变“脏”,而这些事情在计算机世界中则是很正常的事情,因为在计算的角度,我自己一条一条的执行字节码指令(联系到数据库事物和高效并发),对于数据的改变这是很正常的事。

  通俗的说就是面向过程编程更加关注的是“程序的逻辑流程”,是一种“执行者”思维,思考的是怎么一步步实现这个过程。面向对象更加关注的是程序中“各对象之间的关系”,是一种“设计者”思维,大家分工明确,各司其职

面向对象与反射

  注:以下代码均为伪代码,只为帮助理解。

  我们常说类是对象的模板,对象是类的实例,比如有这样一个User类: 

 public class User {

     private String name;

     private int age;

     public void sleep() {

        System.out.println("我在睡觉");

     }

 }

  我们将其实例化,并且为其属性赋值,实例对象为u1,此时我们说User类是u1的模板 u1是类的实例化对象 

 User u1 = new User("璐璐",18);

  然而,站在更高维度的角度看,类何尝不也是一个对象呢?属性和方法何尝不也是一个对象呢?比如类中有这样一条属性:

 private int age;

  我们可以定义这样一个类:

 //1.属性可以抽取成一个类

  class Fileds {

      private String modifier; //修饰符

      private String ttype;    //属性类型

      private String fname;   //属性名字

  }

  当这个类的属性实例化为modifier=private,ttype=int,fname=age的时候,不就是上面那条属性吗?同样我们可以抽取一个类(Class)来表示类的共同特征,一个该类的具体对象存储了一个类的所有的信息

class Tclass {

      private Filed[] fs;

      private Method[] method;

      private Constructor[] constructor;

}

  这个模板很多人称其为类对象 即用来创建类这个对象的模板,很多人在学反射的时候,老师常常说的一个模具或者设计图就是这个类对象,很多人不理解反射怎么创建对象。还是拿这个例子来说,在我们有了User类的情况下,如果我知道u1这个对象的某些属性或者方法,比如它的姓名和年龄那么我是不是就可以实例化出这个对象?答案是肯定的。同理,假设我有了一个类的模板Tclass,现在要创建一个类就很简单了,我只需要知道我要创建的类有哪些信息就可以了,因此在运用反射的时候,我们是不是都会写一句 

Class cla01=User.class;

  或者是

Class cla02=Class.forName("com.rjb.pojo.User");

  总之就是要获取到我要创建的类的信息(比如类的属性、方法、返回值等等,当然还有一些我们不可见的信息),然后我就可以利用这个类模板Tclass和通过反射获取到的类信息创建一个类。这样反射是不是就很容易理解了?并且对万事万物皆对象有了更深的认识?

  当然在JAVA底层,类对象并不是指这样的模板,这样解释仅仅是为了让大家换一种思维去思考面向对象和反射,更容易理解而已,事实上,在java底层,反射技术依靠的是字节码生成技术实现的,而不是我上面说的Tclass这个类,可以参阅《深入理解JVM虚拟机》9.2.3 字节码生成技术与动态代理实现。

原文地址:https://www.cnblogs.com/lanmao123/p/11139202.html

时间: 2024-08-01 19:24:25

深入理解面向对象与反射的相关文章

全面理解面向对象的 JavaScript

对象的上下文依赖 var str = "我是一个 String 对象 , 我声明在这里 , 但我不是独立存在的!" var obj = { des: "我是一个 Object 对象 , 我声明在这里,我也不是独立存在的." }; var fun = function() { console.log( "我是一个 Function 对象!谁调用我,我属于谁:", this ); }; obj.fun = fun; console.log( this

全面理解面向对象的JavaScript

转载:http://justcoding.iteye.com/blog/2019293 原文:http://www.ibm.com/developerworks/cn/web/1304_zengyz_jsoo/index.html?ca=drs-#major6 前言 当今 JavaScript 大行其道,各种应用对其依赖日深.web 程序员已逐渐习惯使用各种优秀的 JavaScript 框架快速开发 Web 应用,从而忽略了对原生 JavaScript 的学习和深入理解.所以,经常出现的情况是,

Python之面向对象进阶------反射(Day26)

一 classmethod class Classmethod_Demo(): role = 'dog' @classmethod def func(cls): print(cls.role) Classmethod_Demo.func() staticmethod class Staticmethod_Demo(): role = 'dog' @staticmethod def func(): print("当普通方法用") Staticmethod_Demo.func() clas

深入全面理解面向对象的 JavaScript

深入全面理解面向对象的 JavaScript (原著: 曾 滢, 软件工程师, IBM,2013 年 4 月 17 日) JavaScript 函数式脚本语言特性以及其看似随意的编写风格,导致长期以来人们对这一门语言的误解,即认为 JavaScript 不是一门面向对象的语言,或者只是部分具备一些面向对象的特征.本文将回归面向对象本意,从对语言感悟的角度阐述为什么 JavaScript 是一门彻底的面向对象的语言,以及如何正确地使用这一特性. 前言 当今 JavaScript 大行其道,各种应用

iOS runtime探究(一): 从runtime开始理解面向对象的类到面向过程的结构体

你要知道的runtime都在这里 转载请注明出处 http://blog.csdn.net/u014205968/article/details/67639205 本文主要讲解runtime相关知识,从原理到实践,由于包含内容过多分为以下五篇文章详细讲解,可自行选择需要了解的方向: 从runtime开始: 理解面向对象的类到面向过程的结构体 从runtime开始: 深入理解OC消息转发机制 从runtime开始: 理解OC的属性property 从runtime开始: 实践Category添加属

面向对象之反射

一:什么是反射 反射是指程序可以访问,检测和修改它本身状态或行为的一种能力. 二:Python面向对象的反射:通过字符串的形式操作对象相关的属性. python中一切事物都是对象(都可以使用反射) 三:反射的好处 1实现可插拔机制 反射的好处就是,可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,即你可以事先把主要的逻辑写好(只定义接口),然后后期再去实现接口的功能 class FtpClient: 'ftp客户端,但是还么有实现具体的功能' def __init__(sel

面向对象编程的弊端是什么? 深入理解面向对象

现时C++可以说是支持OOP范式中最为常用及高性能的语言.虽然如此,在C++使用OOP的编程方式在一些场合未能提供最高性能.[1]详细描述了这个观点,我在此尝试简单说明.注意:其他支持OOP的语言通常都会有本答案中提及的问题,C++只是一个合适的说明例子. 历史上,OOP大概是60年代出现,而C++诞生于70年代末.现在的硬件和当时的有很大差异,其中最大的问题是内存墙. 内存墙,指的是内存性能严重限制CPU性能发挥的现象.在过去的20多年中,处理器的性能以每年大约55%速度快速提升,而内存性能的

如何理解面向对象

如何理解面向对象? 什么是面向对象,面向对象其实就是一种设计模型.不用理解太多,这里不是最重要. 面向对象的基本特征如何理解? 1)抽象:将相同事物抽象出来成为一种数据结构,或者是用类(面向对象),或者是用结构体(面向过程)比如KNN算法,求解测试样本的k个邻接点,这k个邻接点,甚至整个邻接点都可以抽象出来一种数据结构.在比如决策树算法中,构建决策树,由于一个决策树有多个结点,结点和结点之间互相生成.首先要抽象出结点的数据类型,这就是抽象. 2)封装:封装的好处就是使离散的数据整体化,将离散的数

如何理解代理和反射?

一.本节主要点 代理的概念 静态代理和动态代理 cglib 什么是代理呢? 代理,就是一个角色代表另一个角色去完成某件事. 比如,你肚子饿了,又懒得出去吃饭,这时候,你的朋友正好要出去,你让他帮忙打包.那他就是代理类.你就是委托他去做事. 如何理解代理和反射?