黑马程序员技术交流社区

标题: 创建对象的格式是什么 [打印本页]

作者: 郭孟涛    时间: 2013-1-24 01:24
标题: 创建对象的格式是什么
本帖最后由 张向辉 于 2013-1-25 10:11 编辑

看了视频后,还是不清楚创建对象的格式是什么?能明确说一下吗

作者: 郭孟涛    时间: 2013-1-24 01:29
建立对象的格式如下:
      对象名=new 构造方法()
例如:object_one=new class_name();
      object_two=new class_name();
  也可以在声明对象的同时建立对象,这称为创建一个对象。创建对象的格式如下:
      类名 对象名=new 构造方法()

以上是网上搜的,视频里面没有明确讲。发现两个老师对各种格式不讲清楚,就直接讲原理。困惑···
作者: 郭孟涛    时间: 2013-1-24 01:31
围绕格式讲述原理,先明确格式。再讲原理,格式每次不说清楚{:soso_e118:}
作者: 郭孟涛    时间: 2013-1-24 01:33
对象的数据成员的引用方式如下:
            对象名.数据成员名
对象的成员方法的引用方式如下:
            对象名.成员方法名(参数表)
作者: 洪建超    时间: 2013-1-24 01:38
  java中几种创建对象的方式



在java程序中,对象可以被显式地或者隐式地创建.
下面说说四种显式的创建对象的方式:
    ●  用new语句创建对象
    ●  运用反射手段,调用java.lang.Class 或者 java.lang.reflect.Constructor 类的newInstance()实例方法
    ●  调用对象的clone()方法
    ●  运用序列化手段,调用java.io.ObjectInputStream 对象的 readObject()方法.

例子:

package dgut.ke.javatest;

public class Customer implements Cloneable {

private String name;
private int age;

public Customer() {
  this("unknown",0);
  System.out.println("call default constructor");
}

public Customer(String name,int age) {
  this.name = name;
  this.age = age;
  System.out.println("call second constructor");
}

public Object clone() throws CloneNotSupportedException {
  return super.clone();
}

public boolean equals(Object o) {
  if (this == o)
   return true;
  if (! (o instanceof Customer))
   return false;
  final Customer other = (Customer) o;
  if (this.name.equals(other.name) && this.age == other.age)
   return true;
  else
   return false;
}

public String toString() {
  return "customer.name = "+name+" customer.age = "+age;
}
  /**
   * @param args
   */
public static void main(String[] args) throws Exception{
  // 运用反射手段创建Customer对象
  Class objectClass = Class.forName("dgut.ke.javatest.Customer");
  Customer c1 = (Customer) objectClass.newInstance();
  System.out.println("c1 --> " + c1);
   
  //用new创建Customer对象
  Customer c2 = new Customer("Tom",20);
  System.out.println("c2 --> " + c2);
   
  //运用克隆手段创建Customer对象
  Customer c3 = (Customer) c2.clone();
  System.out.println("c3 --> " + c3);
  System.out.println("c2 == c3 " + (c2==c3));
  System.out.println("c2.equals(c3) " + c2.equals(c3));
}

}



Class类的forName方法public static Class<?> forName(String className)
throws ClassNotFoundException
返回与带有给定字符串名的类或接口相关联的 Class 对象。调用此方法等效于:
  Class.forName(className, true, currentLoader)

其中 currentLoader 表示此类的定义类加载器。
例如,以下代码片段返回 java.lang.Thread 类的运行时 Class 描述符。

   Class t = Class.forName("java.lang.Thread")

调用 forName("X") 将导致名为 X 的类被初始化。



参数:
className - 所需类的完全限定名。
返回:
具有指定名的类的 Class 对象。
抛出:
LinkageError - 如果链接失败
ExceptionInInitializerError - 如果此方法所激发的初始化失败
ClassNotFoundException - 如果找不到该类
Object类的clone()方法

protected Object clone()
throws CloneNotSupportedException
创建并返回此对象的一个副本。“副本”的准确含义可能依赖于对象的类。一般来说,对于任何对象 x,如果表达式:
x.clone() != x
是正确的,则表达式:
x.clone().getClass() == x.getClass()
将为 true,但这些不是绝对条件。一般情况下是:
x.clone().equals(x)
将为 true,但这不是绝对条件。
按照惯例,返回的对象应该通过调用 super.clone 获得。如果一个类及其所有的超类(Object 除外)都遵守此约定,则 x.clone().getClass() == x.getClass()。

按照惯例,此方法返回的对象应该独立于该对象(正被克隆的对象)。要获得此独立性,在 super.clone 返回对象之前,有必要对该对象的一个或多个字段进行修改。这通常意味着要复制包含正在被克隆对象的内部“深层结构”的所有可变对象,并使用对副本的引用替换对这些对象的引用。如果一个类只包含基本字段或对不变对象的引用,那么通常不需要修改 super.clone 返回的对象中的字段。

Object 类的 clone 方法执行特定的克隆操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。注意:所有的数组都被视为实现接口 Cloneable。否则,此方法会创建此对象的类的一个新实例,并像通过分配那样,严格使用此对象相应字段的内容初始化该对象的所有字段;这些字段的内容没有被自我克隆。所以,此方法执行的是该对象的“浅表复制”,而不“深层复制”操作。

Object 类本身不实现接口 Cloneable,所以在类为 Object 的对象上调用 clone 方法将会导致在运行时抛出异常。



返回:
此实例的一个克隆。
抛出:
CloneNotSupportedException - 如果对象的类不支持 Cloneable 接口,则重写 clone 方法的子类也会抛出此异常,以指示无法克隆某个实例。
作者: 杨玲    时间: 2013-1-24 23:40
楼上说得很对,我再补充一点.在有些类中构造函数会被私有化,这时候要建立对象需要根据它本身的方法来建立.比如单例
作者: 高浩    时间: 2013-1-25 13:27
类名  对象名=new 类名();




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2