java对象初始化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java对象初始化相关的知识,希望对你有一定的参考价值。

1.为什么构造函数用调用this只能用一次,而且位置必须是第一条语句?

2.非静态的属性和方法。
每个对象创建的时候属性(字段)(非静态)都分配了它独有的储存空间。
但方法只需要一个储存一个。不同对象调用时候,实际上传入了对象的引用,方法
以引用位区分,给不同对象产生消息。我这样理解对不?
所谓的一次是用this调用构造器

1、java规定,构造方法中对其他构造方法的显式调用只能调用一次,且必须是第一句。每个构造方法的第一句java会自动加上对父类的默认方法的调用,这个是隐式的。而你的this调用是显式的,所以必须是第一句而且只能是一句。
2、你对方法的理解是对的,方法的调用实际上用的是那段代码的入口,因此大家都用一个。
参考技术A 1、构造函数功能是通常用于创建对象前,要完成的一些初始化的工作。所以java约定为第一条语句。

2、在JVM中的每个对象的实例在内存里都有它自己的方法域和一个堆,方法域里面保存方法,其实方法经过编译后,就是一连串机器指令。在堆里面保存了对象。对象的属性依附于对象,在堆上保存。
这些区域,被所有的执行线程都共享。

程序执行时,每个执行线程会拥有自己各自的计数器和栈,当调用一个方法的时候,该方法(即方法域中的一串指令)会和参数、需要的数据(即对象的引用)等,一起会按调用顺序压入执行线程的栈顶部。 然后cpu从栈里面一条条的取出指令来执行。线程的程序计数器负责跟踪方法调用状态。
参考技术B 第二个可以像你那么理解,但是第一个我不明白,构造函数里可以调用this多次的啊,而且位置随便啊本回答被提问者采纳

在java中初始化对象A等于另一个对象B [重复]

【中文标题】在java中初始化对象A等于另一个对象B [重复]【英文标题】:Initialize object A in java equal to another object B [duplicate] 【发布时间】:2012-06-30 05:09:32 【问题描述】:

可能重复:How do I copy an object in Java?

如何在 java 中初始化一个对象(比如 A)并将其初始成员值设置为等于第二个对象(比如 B)。初始化后我想修改A的成员而不修改B的成员。所以在A的初始化时我只想复制B的数据。这是如何以一种好的方式完成的??

【问题讨论】:

见***.com/questions/869033/… 【参考方案1】:

克隆是一种简单的复制方式。如果您想做一些需要更多控制的事情,请创建您自己的方法来完全按照您的需要执行副本:

public MyType copy()

  MyType a = new MyType();
  // Initialize how you need to here, use the object this was called from if you'd like
  a.property = this.property;
  // etc.  
  return a;

这为您提供了更直接的控制,但需要更多时间来编写代码。如果克隆适合您的目的,请坚持下去。

编辑:我将根据您的 cmets 给出一个示例。

假设我们有以下类型:

TypeA: has the following member variables
int number = 5; // Default value built in by constructor.
int letter = 'x'; // Value is 'a' when constructed but has been changed.
ArrayList<TypeB> list = b1, b2, b3 // All are initialized.

TypeB: has the following member variables
double decimal = 5.32
TypeC someObject = ...

TypeC: has some stuff, but we are going to ignore it.

现在,当我们要复制 TypeA 时,我们必须执行以下操作:

    直接复制数字和字符,因为它们是值类型。 复制对 ArrayList 的引用,其中包含对某些 TypeB 的引用。

幸运的是,这些步骤很简单。

int copyNumber = this.number;
char copyChar = this.letter;
ArrayList<TypeB> copyList = this.list;
return new TypeA(copyNumber, copyChar, copyList);

现在假设有一个特定的构造函数接受这三个参数,但希望你明白这一点。

如果您只想获取值,而不是对 ArrayList 中所有 TypeB 的引用,这将变得很棘手。您必须遍历 ArrayList 并创建复制所有 ITS 值的新 TypeB(双精度和 TypeC 对象作为引用或值...)

简而言之,您想要的是更容易执行的副本。简单的赋值运算符复制原始类型的值和对象的引用。

【讨论】:

好的,但是如果我要复制的对象包含其他对象作为方法? @sjoerd999:您遇到了什么问题?我或许可以帮助你。 好的,我来解释一下:我有一个对象A,它有其他对象作为成员。并且还具有数据结构作为成员(数组,列表等......)。因此,复制构造函数会有点困难,因为据我了解,您必须在原始数据类型级别复制所有内容。由于同样的原因,克隆也不起作用。那么该怎么办?还是我现在把这个看似简单的问题变得太难了? 啊,所以问题变得有点棘手。您想将 references 复制到这些其他对象吗?还是您只对这些对象所代表的感兴趣? 我想复制原始数据类型以及数组和列表的所有值。我想复制对作为对象 A 成员的对象的引用。【参考方案2】:

这一切都取决于成员的类型。我举个例子:

class A

    public float value;
    public int[] anArray;

    public A(B b)
    
        //primitive may be assigned directly.
        this.value = b.value;

        // other types different approaches:

        //copy the contents of the array
        this.anArray = new int[b.anArray.length];
        System.arraycopy(b.anArray, 0, this.anArray, 0, b.anArray.length);
    


class B

    float value;
    int[] anArray;
    public B(int size)
    
        this.value = 3f;
        this.anArray = new int[size];
        for (int i = size - 1; i >= 0; i--)
        
            this.anArray[i] = i * 10;
        
    


B b = new B(5);
A a = new A(b);

【讨论】:

【参考方案3】:

你可以实现和使用克隆

MyClass b = new MyClass();
MyClass a = b.clone();

注意:有些类是不可克隆的,或者有损坏的实现。例如只有当它们应该是深拷贝时才具有浅拷贝。

如果类是Serializable,你可以序列化它并在内存中反序列化它。不完全是nice,但它有效。

或者您可以创建自己的“复制”构造函数。

【讨论】:

...假设它实现了Cloneable,并且clone 在这个特定的实现中没有被破坏。【参考方案4】:

一种可能的解决方案是在您的类上实现clone 方法并使用克隆,如下所示:

MyClass a = new MyClass();
MyClass b = a;

您会注意到clone() 并不是真正的公共方法,因此您需要公开它。此外,您需要告诉 Java 您的对象是可克隆的(这样做是为了让您的类实现 Cloneable)。以下代码说明了这一点:

public class MyClass implements Cloneable 

    @Override
    protected MyClass clone() throws CloneNotSupportedException 
        return (MyClass)super.clone();
    


【讨论】:

以上是关于java对象初始化的主要内容,如果未能解决你的问题,请参考以下文章

java对象初始化

java里面初始化对象的时候可以重写类里面的函数?

JAVA 对象的初始化到底有几种形式

JAVA中怎么初始化对象数组?

JAVA中怎么初始化对象数组

java中如何初始化对象数组,并增加元素