面向对象编程如何工作?

时间:2010-03-28 12:31:55

标签: java oop

我不确定OOP中的一些事情。

如果我有Class1,其中包含一些私有字段,例如private Field field1,则生成

getField1 () {
    return field1;
}

然后我有一些带构造函数的类

public Class2 (Field field) { 
    someMethod(field);
}

然后我在Class3中调用Class2的构造函数,如:

Class2 cl = new Class2(instanceOfClass1.getField1());

现在的问题是:我是否在field1中与instanceOfClass1 someMethod(field)合作?

3 个答案:

答案 0 :(得分:5)

这取决于field是值还是引用。

作为参数传递时,将复制值类型。参考类型不是;该函数只是递送一个指向原始值的“引用”,它所做的任何更改都会反映在原始值中。

给定类型是值还是引用取决于您的特定编程语言。一般来说,基本的整数和布尔类型通常都是值类型,其他一切都在空中 - 一些语言创建字符串值,其他语言将它们视为引用等。

编辑:既然你提到你正在使用Java,这里有一个简短的程序来演示价值和参考类型:

class ClassOne {
    public int myInt;
}

class ClassTwo {
    public int myInt;
    public ClassTwo(ClassOne c)
    {
        myInt = c.myInt;
        c.myInt = 3;
    }
}

public class main
{
    public static void main(String[] args)
    {
        ClassOne c = new ClassOne();
        c.myInt = 1;
        System.out.println("C1: " + c.myInt);

        ClassTwo c2 = new ClassTwo(c);
        System.out.println("C2: " + c2.myInt);
        System.out.println("C1: " + c.myInt);

    }
}

运行此程序将输出:

C1: 1
C2: 1
C1: 3

在这个程序中,ClassOne和ClassTwo都包含一个整数字段 - 值类型。 ClassTwo在其构造函数中获取ClassOne参数(引用类型),并根据给定的ClassOne对象的值设置自己的整数字段,然后更改ClassOne对象的值。

因为类是引用类型,所以更改ClassTwo构造函数中的ClassOne对象会导致更改原始对象。 (在这里的main函数中,那是c。)但是因为整数是值类型,即使c2在其构造函数中更改c.myInt的值,因为它设置了自己的值预先值,c2.myInt不受影响:它保留原始数字,因为它是复制而不是引用。

希望这有助于澄清一些事情。

答案 1 :(得分:2)

您正在使用其中包含的值。如果它是可变对象然后是,则可以从外部更改Class1实例的状态,这违反了数据保护原则。这就是为什么你应该在返回之前复制可变类型。

答案 2 :(得分:0)

我不得不重读你的问题两到三次,以确保我明白你在问什么。

回顾一下:

  • Class1包含一个字段属性(类型为Field?),它由getField1()方法发回。
  • 然后Class2显然有一个接受Field类型的对象参数的构造函数,并且包含一个使用Field实例触发此类中的本地方法的方法。
  • 然后使用第三个类来实例化Class2,并使用Class1实例中的getField1()方法使用Field实例对其进行初始化。

对于Java,假设您已经完成了必要的实例化,这意味着在整个过程中正在使用Class1中的Field实例。您可以使用System.out.println()验证这一点(这将为您提供带有一系列奇怪数字的@符号)或使用所有对象共有的a.equals(b)方法。

这是一个关于按值传递对象的有趣链接: http://www.javaranch.com/campfire/StoryPassBy.jsp