Java面向对象程序设计--与C++对比说明:系列1(面向对象基础)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java面向对象程序设计--与C++对比说明:系列1(面向对象基础),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含8982字,纯文字阅读大概需要13分钟。
内容图文
![Java面向对象程序设计--与C++对比说明:系列1(面向对象基础)](/upload/InfoBanner/zyjiaocheng/740/09c879b495e44cd7a304499ccf39c062.jpg)
3. Java中的对象变量和C++中对象指针的关系:
Java中的对象变量实际上类似与C++中的对象指针,Java中的对象变量实质上就是指向对象的对象指针,在对象变量变量中保存的是对象在内存中的实际地址.
因此,Java中两个对象的赋值不能用=,因为=号只是将两个变量指向同一个对象在内存中的地址。因此在这两个对象之间进行==比较时也只是比较这两个变量是否指向的是内存中的同一个对象,并不是比较两个对象的值是否相等!要比较两个对象是否相等,则需要使用equals方法!
因此在Java的类中的类访问器中不能直接返回一个可改变对象的引用,下面的代码说明了这一点:
import java.util.*;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
Wed Feb 02 12:00:00 CST 2000?这段代码的main函数中返回了一个可改变对象的引用,那么这个引用和这个可改变对象指向了同一块的内存对象,那么通过这个引用就可以修改这个内存对象!因此,这种所谓的“访问器”实际上破坏了封装性,解决方法是在返回可改变对象时先clone一个这个对象的副本,然后返回这个副本的引用。这样所有对这个返回引用的操作都执行在这个副本上,原来的对象并没改变:
public Date getHireDay()
{
return (Date)hireDay.clone();
}
结果:
Wed Feb 03 00:00:00 CST 2010Wed Feb 03 00:00:00 CST 2010
4 . Java 和 C++ 在对象构造方面的差异:
Java中的实例域可以进行显示初始化,而C++中的数据域是不能显示初始化的!但C++在构造函数中可以提供一个数据域初始化列表!
Java代码:
public?class?TestConstruct{
????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 <iostream>#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";上述结果C++11之前是不支持“显示实例域初始化”的,C++11之后可以使用了。但为了代码兼容性,最好不要使用这个性质。
Java 类中的构造函数之间可以相互调用,可以将公共构造部分放到一个构造函数中,其他特殊构造函数共同调用这个公共构造函数,使用this(...),C++中的构造函数之间不可以相互调用,但可以将所有公共构造部分放在一个成员函数init中,所有的构造函数调用这个构造函数。
下面这段代码来自《Core Java》一书,描述了不同的类的初始化方式:
?1?/**?2????@version?1.00?2000-01-27
?3????@author?Cay?Horstmann
?4?*/
?5?
?6?import?java.util.*;
?7?
?8?public?class?ConstructorTest
?9?{
10????public?static?void?main(String[]?args)
11????{
12???????//?fill?the?staff?array?with?three?Employee?objects
13???????Employee[]?staff?=?new?Employee[3];
14?
15???????staff[0]?=?new?Employee("Harry",?40000);
16???????staff[1]?=?new?Employee(60000);
17???????staff[2]?=?new?Employee();
18?
19???????//?print?out?information?about?all?Employee?objects
20???????for?(int?i?=?0;?i?<?staff.length;?i++)
21???????{
22??????????Employee?e?=?staff[i];
23??????????System.out.println("name="?+?e.getName()
24?????????????+?",id="?+?e.getId()
25?????????????+?",salary="?+?e.getSalary());
26???????}
27????}
28?}
29?
30?class?Employee
31?{
32????//?three?overloaded?constructors
33????public?Employee(String?n,?double?s)
34????{
35???????name?=?n;
36???????salary?=?s;
37????}
38?
39????public?Employee(double?s)
40????{
41???????//?calls?the?Employee(String,?double)?constructor
42???????this("Employee?#"?+?nextId,?s);
43????}
44?
45????//?the?default?constructor
46????public?Employee()
47????{
48???????//?name?initialized?to?""--see?below
49???????//?salary?not?explicitly?set--initialized?to?0
50???????//?id?initialized?in?initialization?block
51????}
52?
53????public?String?getName()
54????{
55???????return?name;
56????}
57?
58????public?double?getSalary()
59????{
60???????return?salary;
61????}
62?
63????public?int?getId()
64????{
65???????return?id;
66????}
67?
68????private?int?id;
69????private?static?int?nextId;
70?
71????//?object?initialization?block
72????{
73???????id?=?nextId;
74???????nextId++;
75????}
76?
77????//?static?initialization?block
78????static
79????{
80???????Random?generator?=?new?Random();
81???????//?set?nextId?to?a?random?number?between?0?and?9999
82???????nextId?=?generator.nextInt(10000);
83????}
84?
85????private?String?name?=?"";?//?instance?variable?initialization
86????private?double?salary;
87?}
5. Java 和 C++ 析构过程的差异
不要因为Java的垃圾回收机制而忽视了资源的手动回收!
Java有自带的垃圾回收机制,手动的内内存回收是不必要的,所以Java没有显示的支持构造函数。但是有时有些对象中的资源并不一定是内存资源,而有可能是
一个文件或者其他系统资源的句柄!在这些情况下,当这些资源不再被使用的时候,对其的释放就显得很重要了。
Java 中可以为每个类提供一个finalize函数,当垃圾回收器清除对象之前,finalize函数会被调用。但实际中不能依赖这个finalize函数来实现资源的回收,因为
finalize函数会出现一些未定义的行为。建议定义一个手工的方法来释放支援,而不是完全依赖Java语言的垃圾回收机制。例如,可以在类的定义中定义一个叫
close的方法,当使用完对象之后,调用close方法以释放占用的资源.
? ? ?
转载于:https://www.cnblogs.com/jiangheng/p/3742090.html
内容总结
以上是互联网集市为您收集整理的Java面向对象程序设计--与C++对比说明:系列1(面向对象基础)全部内容,希望文章能够帮你解决Java面向对象程序设计--与C++对比说明:系列1(面向对象基础)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。