3. Java中的对象变量和C++中对象指针的关系:
Java中的对象变量实际上类似与C++中的对象指针,Java中的对象变量实质上就是指向对象的对象指针,在对象变量变量中保存的是对象在内存中的实际地址.
因此,Java中两个对象的赋值不能用=,因为=号只是将两个变量指向同一个对象在内存中的地址。因此在这两个对象之间进行==比较时也只是比较这两个变量是否指向的是内存中的同一个对象,并不是比较两个对象的值是否相等!要比较两个对象是否相等,则需要使用equals方法!
因此在Java的类中的类访问器中不能直接返回一个可改变对象的引用,下面的代码说明了这一点:
publicclass EmployeeTest
{
public static void main(String[] args)
{
Employee harry = new Employee("Harry Brown",231124,2010,2,3);
Date d = harry.getHireDay();
System.out.println(d);
double tenYearsInMilliSeconds = 10*365.35*24*60*60*1000;
d.setTime(d.getTime()-(long)tenYearsInMilliSeconds);
System.out.println(harry.getHireDay());
}
}
class Employee
{
public Employee(String n, double s,
int year, int month, int day)
{
name = n;
salary = s;
GregorianCalendar calendar
= new GregorianCalendar(year, month - 1, day);
// GregorianCalendar uses 0 for January
hireDay = calendar.getTime();
}
public String getName()
{
return name;
}
public double getSalary()
{
return salary;
}
public Date getHireDay()
{
return hireDay;
}
public void raiseSalary(double byPercent)
{
double raise = salary * byPercent / 100;
salary += raise;
}
private String name;
private double salary;
private Date hireDay;
}
Wed Feb 03 00:00:00 CST 2010
这段代码的main函数中返回了一个可改变对象的引用,那么这个引用和这个可改变对象指向了同一块的内存对象,那么通过这个引用就可以修改这个内存对象!因此,这种所谓的“访问器”实际上破坏了封装性,解决方法是在返回可改变对象时先clone一个这个对象的副本,然后返回这个副本的引用。这样所有对这个返回引用的操作都执行在这个副本上,原来的对象并没改变:
public Date getHireDay()
{
return (Date)hireDay.clone();
}
结果:
4 . Java 和 C++
在对象构造方面的差异:
Java中的实例域可以进行显示初始化,而C++中的数据域是不能显示初始化的!但C++在构造函数中可以提供一个数据域初始化列表!
Java代码:
{
public static void main(String[] args)
{
TestConstruct tc = new TestConstruct();
System.out.println(tc.GetName());
}
public String GetName()
{
return name;
}
private String name = "Jim Green";
}
输出结果:
Jim Green
C++ 代码:
#include <string>
using namespace std;
class Person
{
public:
Person(String& aname)
{
name = aname;
}
private:
string name = "Miracle Jiang";
}
int main(void)
{
return 0;
}
输出结果:
string name = "Miracle Jiang";