精华内容
下载资源
问答
  • 本期博文主要深入讲解类和对象的使用,重点在实例化了一个类的对象之后,对应的JVM(Java虚拟机)的内存分布是怎样的。在语法级别上怎样完成对象创建呢?语法格式:类名 变量名 = new 类名();这样就完成了一个对象的...

    本期博文主要深入讲解类和对象的使用,重点在实例化了一个类的对象之后,对应的JVM(Java虚拟机)的内存分布是怎样的。

    在语法级别上怎样完成对象创建呢?

    语法格式:

    类名 变量名 = new 类名();

    这样就完成了一个对象的创建。

    为了方便知识点的引入,设计一个学生类如下:

    publicclassStudent{int stu_no;//学号

    String stu_name;//姓名int stu_age;//年龄

    String stu_addr;//家庭住址}

    同时,设计一个测试学生类的测试类用来创建对象:

    public class StudentTest{

    public static void main(String[] args) {

    //创建学生对象1

    Student s1 = new Student();

    //创建学生对象2

    Student s2 = new Student();

    }

    }

    Tips:图中反馈的信息很多,很重要

    对于Student类当中的学号以及姓名等变量,叫做成员变量,与局部变量不同,如果说这些变量在声明之后没有初始化,将由系统给出缺省默认值。

    对象和引用的区别?

    对象是通过new运算符new出来的,在堆内存中存储。

    但凡是保存了内存地址指向了堆内存当中的对象的变量都叫做“引用”。

    对于同一个类new出来的对象,虽然这些对象有相同的成员变量名,但是各自的属性值也许不同,因此每个对象都分配的是独立的内存空间。

    展开全文
  • 首先一看可能有点不明白,这个问题对于我们这些菜鸟来说确实挺神奇的,不过用完以后就没有什么... 2 //实例化这个类型 3 Type type = this.GetType().Assembly.GetType(typename, false, true); 4 if (type !...

    首先一看可能有点不明白,这个问题对于我们这些菜鸟来说确实挺神奇的,不过用完以后就没有什么感觉了,看看代码吧,

    View Code
     1 string typename="Student";
     2 //实例化这个类型
     3 Type type = this.GetType().Assembly.GetType(typename, false, true);
     4 if (type != null) {
     5                 //取得类的无参数构造函数
     6                 var constructor = type.GetConstructor(new Type[0]);
     7                 //调用构造函数取得类的实例
     8                 var obj = constructor.Invoke(null);
     9                 //查找请求的方法
    10                 var method = type.GetMethod(System.IO.Path.GetFileNameWithoutExtension(url));
    11                 if (method != null) {
    12                     //执行方法并输出响应结果
    13                     object obj=method.Invoke(obj, null);
    14                 }
    15             }

    这个便是实例化一个字符串的对象,当然首先要先定义好Student这个类。
    上面的方法没有任何的参数,但是如果有参数该怎么办?

    View Code
     1 Type type = this.GetType().Assembly.GetType(typename, false, true);
     2             if (type != null)
     3             {
     4                 //取得类的无参数构造函数
     5                 var constructor = type.GetConstructor(new Type[0]);
     6                 //调用构造函数取得类的实例
     7                 var obj = constructor.Invoke(null);
     8                 //查找请求的方法
     9                 var method = type.GetMethod(System.IO.Path.GetFileNameWithoutExtension(url));
    10                 if (method != null)
    11                 {
    12                     var parameters = method.GetParameters();
    13                     object[] args = null;
    14                     if (parameters.Length > 0)
    15                     {
    16                         args = new object[parameters.Length];
    17                         for (int x = 0; x < parameters.Length; x++)
    18                         {
    19                             args[x] = Convert.ChangeType(context.Request.Form[parameters[x].Name], parameters[x].ParameterType);
    20                         }
    21                     }
    22                     //执行方法并输出响应结果
    23                     context.Response.Write(method.Invoke(obj, args));
    24                 }
    25             }

    还有一种情况,如果已经知道一个类,比如Student,还有一个属性Name,但是这个属性是个字符串,有可能是别的地方传过来的但是我要取得这个属性的值,代码如下:

    View Code
    1 PropertyInfo p = typeof(Student).GetProperty("Name");
    2 string strValue= p.GetValue(new Student(), null).ToString();

    其实这种情况可以在很多地方都可以用到比如怎么样将DataSet转换成List<类>等等。代码如下:

    View Code
     1 /// <summary>
     2         /// Dataset转换成List
     3         /// </summary>
     4         /// <typeparam name="T">实体</typeparam>
     5         /// <param name="p_DataSet">Dataset数据集</param>
     6         /// <param name="p_TableIndex">表序号(一般一个DataSet中只有一个Table所以序号为0)</param>
     7         /// <returns>List集合</returns>
     8         public static IList<T> DataSetToIList<T>(DataSet p_DataSet, int p_TableIndex)
     9         {
    10             if (p_DataSet == null || p_DataSet.Tables.Count < 0)
    11                 return null;
    12             if (p_TableIndex > p_DataSet.Tables.Count - 1)
    13                 return null;
    14             if (p_TableIndex < 0)
    15                 p_TableIndex = 0; DataTable p_Data = p_DataSet.Tables[p_TableIndex];
    16             IList<T> result = new List<T>();
    17             for (int j = 0; j < p_Data.Rows.Count; j++)
    18             {
    19                 //实例化对象
    20                 T _t = (T)Activator.CreateInstance(typeof(T));
    21                 //取出对象中的属性
    22                 PropertyInfo[] propertys = _t.GetType().GetProperties();
    23                 foreach (PropertyInfo pi in propertys)
    24                 {
    25                     for (int i = 0; i < p_Data.Columns.Count; i++)
    26                     {
    27                         // 属性与字段名称一致的进行赋值                     
    28                         if (pi.Name.Equals(p_Data.Columns[i].ColumnName))
    29                         {
    30                             // 数据库NULL值单独处理                           
    31                             if (p_Data.Rows[j][i] != DBNull.Value)
    32                                 //给对应的属性赋值
    33                                 pi.SetValue(_t, p_Data.Rows[j][i], null);
    34                             else
    35                                 pi.SetValue(_t, null, null);
    36                             break;
    37                         }
    38                     }
    39                 }
    40                 result.Add(_t);
    41             }
    42             return result;
    43         }

     

     

    转载于:https://www.cnblogs.com/zhangxj-sun/archive/2012/06/29/propertyInfo.html

    展开全文
  • 本期博文主要深入讲解类和对象的使用,重点在实例化了一个类的对象之后,对应的JVM(Java虚拟机)的内存分布是怎样的。在语法级别上怎样完成对象创建呢?语法格式:类名 变量名 = new 类名();这样就完成了一个对象的...

    本期博文主要深入讲解类和对象的使用,重点在实例化了一个类的对象之后,对应的JVM(Java虚拟机)的内存分布是怎样的。

    在语法级别上怎样完成对象创建呢?

    语法格式:

    类名 变量名 = new 类名();

    这样就完成了一个对象的创建。

    为了方便知识点的引入,设计一个学生类如下:

    publicclassStudent{int stu_no;//学号 	
    String stu_name;//姓名int stu_age;//年龄 	
    String stu_addr;//家庭住址}

    同时,设计一个测试学生类的测试类用来创建对象:

    public class StudentTest{
    	public static void main(String[] args) {
    		//创建学生对象1
    		Student s1 = new Student();
    		//创建学生对象2
    		Student s2 = new Student();
    	}
    }

    f638e57817a78d995fd68d326cd3a823.png

    Tips:图中反馈的信息很多,很重要

    对于Student类当中的学号以及姓名等变量,叫做成员变量,与局部变量不同,如果说这些变量在声明之后没有初始化,将由系统给出缺省默认值。

    对象和引用的区别?

    对象是通过new运算符new出来的,在堆内存中存储。

    但凡是保存了内存地址指向了堆内存当中的对象的变量都叫做“引用”。

    对于同一个类new出来的对象,虽然这些对象有相同的成员变量名,但是各自的属性值也许不同,因此每个对象都分配的是独立的内存空间。

    展开全文
  • More Effective C++ 阅读笔记(十二)--怎样限制实例化对象的数量黑月亮 发表于 2005-10-5 14:56:00 这种技术很容易推广到限制对象为任何数量上。我们只需把hard-wired常量值1改为根据某个类而确定的数量,然后消除...

     More Effective C++ 阅读笔记(十二)--怎样限制实例化对象的数量
    黑月亮 发表于 2005-10-5 14:56:00 

           这种技术很容易推广到限制对象为任何数量上。我们只需把hard-wired常量值1改为根据某个类而确定的数量,然后消除拷贝对象的约束。例如,下面这个经过修改的Printer类的代码实现,最多允许10个Printer对象存在:
    class Printer {
    public:
      class TooManyObjects{};
      // 伪构造函数
      static Printer * makePrinter();
      static Printer * makePrinter(const Printer& rhs);
      ...
    private:
      static size_t numObjects;
      static const size_t maxObjects = 10;       // 见下面解释
      Printer();
      Printer(const Printer& rhs);
    };
    // Obligatory definitions of class statics
    size_t Printer::numObjects = 0;
    const size_t Printer::maxObjects;
    Printer::Printer()
    {
      if (numObjects >= maxObjects) {
        throw TooManyObjects();
      }
      ...
    }
    Printer::Printer(const Printer& rhs)
    {
      if (numObjects >= maxObjects) {
        throw TooManyObjects();
      }
      ...
    }
    Printer * Printer::makePrinter()
    { return new Printer; }
    Printer * Printer::makePrinter(const Printer& rhs)
    { return new Printer(rhs); }
        如果你的编译器不能编译上述类中Printer::maxObjects的声明,这丝毫也不奇怪。特别是应该做好准备,编译器不能编译把10做为初值赋给这个变量这条语句。给static const成员(例如int, char, enum等等)确定初值的功能是最近才加入到C++中的,所以一些编译器还不允许这样编写。如果没有及时更新你的编译器,可以把maxObjects声明为在一个private内匿名枚举类型里的枚举元素,
    class Printer {
    private:
      enum { maxObjects = 10 };                // 在类中,
      ...                                      // maxObjects为常量10
    }; 
    或者象non-const static成员一样初始化static常量:
    class Printer {
    private:
      static const size_t maxObjects;            // 没有赋给初值
      ...
    };
    // 放在一个代码实现的文件中
    const size_t Printer::maxObjects = 10;
        后面这种方法与原来的方法有一样的效果,但是显示地确定初值能让其他程序员更容易理解。当你的编译器支持在类定义中给const static成员赋初值的功能时,你应该尽可能地利用这个功能。

    一个具有对象计数功能的基类

        应该有一种方法能够自动处理这些事情。难道没有方法把实例计数的思想封装在一个类里吗?
        我们很容易地能够编写一个具有实例计数功能的基类,然后让像Printer这样的类从该基类继承,而且我们能做得更好。我们使用一种方法封装全部的计数功能,不但封装维护实例计数器的函数,而且也封装实例计数器本身。Printer类的计数器是静态变量numObjects,我们应该把变量放入实例计数类中。然而也需要确保每个进行实例计数的类都有一个相互隔离的计数器。使用计数类模板可以自动生成适当数量的计数器,因为我们能让计数器成为从模板中生成的类的静态成员:
    template<class BeingCounted>
    class Counted {
    public:
      class TooManyObjects{};                     // 用来抛出异常
      static int objectCount() { return numObjects; }
    protected:
      Counted();
      Counted(const Counted& rhs);
      ~Counted() { --numObjects; }
    private:
      static int numObjects;
      static const size_t maxObjects;
      void init();                                // 避免构造函数的
    };                                            // 代码重复
    template<class BeingCounted>
    Counted<BeingCounted>::Counted()
    { init(); }
    template<class BeingCounted>
    Counted<BeingCounted>::Counted(const Counted<BeingCounted>&)
    { init(); }
    template<class BeingCounted>
    void Counted<BeingCounted>::init()
    {
      if (numObjects >= maxObjects) throw TooManyObjects();
      ++numObjects;
    }
        从这个模板生成的类仅仅能被做为基类使用,因此构造函数和析构函数被声明为protected。注意private成员函数init用来避免两个Counted构造函数的语句重复。
        现在我们能修改Printer类,这样使用Counted模板:
    class Printer: private Counted<Printer> {
    public:
      // 伪构造函数
      static Printer * makePrinter();
      static Printer * makePrinter(const Printer& rhs);
      ~Printer();
      void submitJob(const PrintJob& job);
      void reset();
      void performSelfTest();
      ...
      using Counted<Printer>::objectCount;     // 参见下面解释
      using Counted<Printer>::TooManyObjects;  // 参见下面解释
    private:
      Printer();
      Printer(const Printer& rhs);
    };
        Printer使用了Counter模板来跟踪存在多少Printer对象,坦率地说,除了Printer的编写者,没有人关心这个事实。它的实现细节最好是private,这就是为什么这里使用private继承的原因(参见Effective C++条款42)。另一种方法是在Printer和counted<Printer>之间使用public继承,但是我们必须给Counted类一个虚拟析构函数。(否则如果有人通过Counted<Printer>*指针删除一个Printer对象,我们就有导致对象行为不正确的风险——参见Effective C++条款14。)条款M24已经说得很明白了,在Counted中存在虚函数,几乎肯定影响从Counted继承下来的对象的大小和布局。我们不想引入这些额外的负担,所以使用private继承来避免这些负担。
        Counted所做的大部分工作对于Printer的用户来说都是隐藏的,但是这些用户可能很想知道有当前多少Printer对象存在。Counted模板提供了objectCount函数,用来提供这种信息,但是因为我们使用private继承,这个函数在Printer类中成为了private。为了恢复该函数的public访问权,我们使用using声明:
    class Printer: private Counted<Printer> {
    public:
      ...
      using Counted<Printer>::objectCount; // 让这个函数对于Printer是public
      ...   
    };
        这样做是合乎语法规则的,但是如果你的编译器不支持命名空间,编译器就不允许这样做。如果这样的话,你应使用老式的访问权声明语法:
    class Printer: private Counted<Printer> {
    public:
      ...
      Counted<Printer>::objectCount;       // 让objectCount在Printer中是public
    ...
    };
        这种更传统的语法与uning声明具有相同的含义。但是我们不赞成这样做。TooManyObjects类应该也应用同样的方式来处理,因为Printer的客户端如果要捕获这种异常类型,它们必须有能力访问TooManyObjects。当Printer继承Counted<Printer>时,它可以忘记有关对象计数的事情。编写Printer类时根本不用考虑对象计数,就好像有其他人会为它计数一样。Printer的构造函数可以是这样的:
    Printer::Printer()
    {
      进行正常的构造函数运行
    }
        这里有趣的不是你所见到的东西,而是你看不到的东西。不检测对象的数量就好像限制将被超过,执行完构造函数后也不增加存在对象的数目。所有这些现在都由Counted<Printer>的构造函数来处理,因为Counted<Printer>是Printer的基类,我们知道Counted<Printer>的构造函数总在Printer的前面被调用。如果建立过多的对象,Counted<Printer>的构造函数就会抛出异常,甚至都没有调用Printer的构造函数。
        最后还有一点需要注意,必须定义Counted内的静态成员。对于numObjects来说,这很容易——我们只需要在Counted的实现文件里定义它即可:
    template<class BeingCounted>                 // 定义numObjects
    int Counted<BeingCounted>::numObjects;       // 自动把它初始化为0
        对于maxObjects来说,则有一些技巧。我们应该把它初始化为什么值呢?如果你想允许建立10个printer对象,我们应该初始化Counted<Printer>::maxObjects为10。另一方面如果我们向允许建立16个文件描述符对象,我们应该初始化Counted<Printer>::maxObjects为16。到底应该怎么做呢?
        简单的方法就是什么也不做。我们不对maxObject进行初始化。而是让此类的客户端提供合适的初始化。Printer的作者必须把这条语句加入到一个实现文件里:
    const size_t Counted<Printer>::maxObjects = 10;
        同样FileDescriptor的作者也得加入这条语句:
    const size_t Counted<FileDescriptor>::maxObjects = 16;
        如果这些作者忘了对maxObjects进行初始化,会发生什么情况呢?很简单:连接时会发生错误,因为maxObjects没有被定义。
     
     

    展开全文
  • 实例化一个对象的完整流程是怎样的呢?网上总结初始化顺序是怎么来的呢? 下面以一个未加载过的子类对象实例化为例: 需要实例化一个子类对象时,首先检查到其有继承于一个未加载过的父类, 则: 先对父类进行类...
  • Alert views are pop-up views that appear over the current view on the iPhone. Creating and showing an alert: UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Really rese...
  • Unity中实例化对象销毁的分析

    千次阅读 2018-08-04 23:51:40
    项目中在检查物体生命周期和进行资源对象和实例化对象回收的时候, 遇到了两个问题: 组件在OnDestroy方法中, 调用了Destroy(gameObject)方法, 会不会出问题? 组件在OnDestroy方法中, 能否取得到子物体的数据, 还是...
  • 本期博文主要深入讲解类和对象的使用,重点在实例化了一个类的对象之后,对应的JVM(Java虚拟机)的内存分布是怎样的。 在语法级别上怎样完成对象创建呢? 语法格式: 类名 变量名 = new 类名(); 这样就完成了一个对象...
  • 如果喜欢这里的内容,你能够给我最大的帮助就是转发,告诉你的朋友,鼓励他们一起来学习。If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to ...
  • 由于javascript没有java那么多基本类型,同时也没有提供class这个东西,那么我们想实现javascript的对象创建应该怎么办呢,我简单地从w3c提供的课件中提取了一下几种方法: 一.工厂模式  说白了就是类似于c语言中...
  • javascript中,new操作符的工作原理是什么?...前言和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象。 但在 javascript 中,万物皆对象...
  • 使用领域对象来接收用户输入  user对象中包含两个字段:username和password,在Action中有一个User对象user,则在jsp中:  Jsp代码      来进行数据绑定。  当Struts2尝试设置user对象的username属性时,将...
  • 类和对象的命名空间示例 ...a = A('参数') # 实例化对象a 上述代码,定义了一个A类,并实例化了一个对象a 那么它后台的代码执行逻辑以及内存空间的开辟过程是怎样的呢? 如上图,即从定义类A到实...
  • 怎样在 C++ 中计算对象实例化次数

    千次阅读 2008-01-26 20:11:00
    但是,假设 operator new 丢出一个 std::bad_alloc 异常,会怎样?这种异常表示,动态配置记忆体的任务失败了。在上述的 new 运算式中,有两个函式可能发出这样的异常。第一个是 operator new,它企图找出足够的记忆...
  • 通过本文我们来深入了解一下对象实例化过程、内存布局以及访问定位对象实例化过程创建对象的方式要了解对象实例化过程,我们需要先列举一下我们日常开发过程当中常用到的创建对象的方式,我们日常创建对象的...
  • Java对象实例化过程

    2007-12-19 23:29:22
    Java对象实例化过程是怎样的,之前就没有仔细想过,今天跟踪了一下,得到一些启发,虽然仍旧比较表面,至少比我之前的理解深刻了许多。 下面的过程class A extends class B 1.类调入内存的话,会首先载入所有的...
  • 对象实例化后在内存中是怎样的呢?它们是怎么拆分的呢?又是怎么存储的呢?对象实例又是怎样被访问到呢?
  • C++是一种面向对象的编程语言,那么面向对象到底是一种怎样的实现机制呢?在《老码识途》这本书中,它说函数本身如同一个芯片,代码就是电路,局部变量就是存储元件,函数的代码只会操作自己的局部变量,不会操作...
  • java的泛型怎样生成实例对象呢?按照以往的经验,我们很容易这样实现:public static T create(T t) {t = new T();return t;}此时,由于T的具体类型我们无法获得,所以new T()是无法通过编译的。换一种思路,我们...
  • 1、使用领域对象来接收用户输入 er对象中包含两个字段:username和password,在Action中有一个User对象user,则在jsp中: Jsp代码     来进行数据绑定。 当Struts2尝试设置user对象的username属性...
  • 对象是相对于类的具体,是行动或者思考时作为目标的事物,比如:人类很笼统,广泛,但是比如从人类中拿出一个人来描述形容人类是怎样的呢,这时候我们脑海中就有一个比较形象具体的画面了,比如艺术家齐白石这个对象来说,...
  • 下文首先通过在IDEA中编写代码演示说明,然后分析怎样操作才能对接口进行实例化。希望博主的博文能够对java学习道路上的你有所帮助,喜欢的话点赞留言收藏哦~1、在IDEA中进行代码演示直接用平时new类(class)对象的...
  • 下文首先通过在IDEA中编写代码演示说明,然后分析怎样操作才能对接口进行实例化。希望博主的博文能够对java学习道路上的你有所帮助,喜欢的话点赞留言收藏哦~1、在IDEA中进行代码演示直接用平时new类(class)对象的...
  • 下文首先通过在IDEA中编写代码演示说明,然后分析怎样操作才能对接口进行实例化。希望博主的博文能够对java学习道路上的你有所帮助,喜欢的话点赞留言收藏哦~1、在IDEA中进行代码演示直接用平时new类(class)对象的...
  • 漫谈 Java 实例化

    2017-11-08 16:50:00
    Java 中实例化类的动作,你是否还是一成不变 new 对应对象呢? 经手的项目多了,代码编写量自然会增加,渐渐的会对设计模式产生感觉。 怎样使书写出来的类实例化动作,高内聚,低耦合,又兼具一定的扩展能力呢? ...
  • 漫谈Java实例化

    2016-05-20 11:57:50
    Java 中实例化类的动作,你是否还是一成不变 new 对应对象呢? 经手的项目多了,代码编写量自然会增加,渐渐的会对设计模式产生感觉。 怎样使书写出来的类实例化动作,高内聚,低耦合,又兼具一定的扩展能力呢? ...
  • 当我们在创建一个实例对象时,这个对象的创建是按照怎样的规则被初始的,或者说其各个属性及代码片段的初始顺序是怎样的呢?这是面试的一个高频考点,也是作Java程序员的我们起码要掌握的知识。希望这篇文章在这...

空空如也

空空如也

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

怎样实例化对象