我不确定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)
合作?
答案 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)
我不得不重读你的问题两到三次,以确保我明白你在问什么。
回顾一下:
对于Java,假设您已经完成了必要的实例化,这意味着在整个过程中正在使用Class1中的Field实例。您可以使用System.out.println()验证这一点(这将为您提供带有一系列奇怪数字的@符号)或使用所有对象共有的a.equals(b)方法。
这是一个关于按值传递对象的有趣链接: http://www.javaranch.com/campfire/StoryPassBy.jsp