Java面向对象程序设计--与C++对比说明:系列1(面向对象基础)
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",,,,);
Date d = harry.getHireDay(); System.out.println(d); double tenYearsInMilliSeconds = *365.35****;
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 - , 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 / ;
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 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 ;
}
输出结果:
TestConstruct.cc::: warning: non-static data member initializers only available with -std=c++ or -std=gnu++ [enabled by default]
string name = "Miracle Jiang";
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 {
public static void main(String[] args)
{
// fill the staff array with three Employee objects
Employee[] staff = new Employee[3];
staff[0] = new Employee("Harry", 40000);
staff[1] = new Employee(60000);
staff[2] = new Employee();
// print out information about all Employee objects
for (int i = 0; i < staff.length; i++)
{
Employee e = staff[i];
System.out.println("name=" + e.getName()
+ ",id=" + e.getId()
+ ",salary=" + e.getSalary());
}
}
}
class Employee
{
// three overloaded constructors
public Employee(String n, double s)
{
name = n;
salary = s;
}
public Employee(double s)
{
// calls the Employee(String, double) constructor
this("Employee #" + nextId, s);
}
// the default constructor
public Employee()
{
// name initialized to ""--see below
// salary not explicitly set--initialized to 0
// id initialized in initialization block
}
public String getName()
{
return name;
}
public double getSalary()
{
return salary;
}
public int getId()
{
return id;
}
private int id;
private static int nextId;
// object initialization block
{
id = nextId;
nextId++;
}
// static initialization block
static
{
Random generator = new Random();
// set nextId to a random number between 0 and 9999
nextId = generator.nextInt(10000);
}
private String name = ""; // instance variable initialization
private double salary;
}
5. Java 和 C++ 析构过程的差异
不要因为Java的垃圾回收机制而忽视了资源的手动回收!
Java有自带的垃圾回收机制,手动的内内存回收是不必要的,所以Java没有显示的支持构造函数。但是有时有些对象中的资源并不一定是内存资源,而有可能是
一个文件或者其他系统资源的句柄!在这些情况下,当这些资源不再被使用的时候,对其的释放就显得很重要了。
Java 中可以为每个类提供一个finalize函数,当垃圾回收器清除对象之前,finalize函数会被调用。但实际中不能依赖这个finalize函数来实现资源的回收,因为
finalize函数会出现一些未定义的行为。建议定义一个手工的方法来释放支援,而不是完全依赖Java语言的垃圾回收机制。例如,可以在类的定义中定义一个叫
close的方法,当使用完对象之后,调用close方法以释放占用的资源.
Java面向对象程序设计--与C++对比说明:系列1(面向对象基础)的更多相关文章
- Java面向对象程序设计--与C++对比说明:系列3(Java 继承机制)
继承(inheritance)背后的核心思想是: bonus = b; } } Java没有像C++那样提供多继承机制,但提供了接口机制,在后面我们将详细探究接口机制的实现 ...
- Java面向对象程序设计--与C++对比说明:系列2(类机制)
1. Java中的包机制(Package): 1.1 Java容许将一系列的类组合到一个叫package的集合中.package机制是一种非常好的管理工作的方式并可以将你自己的工作和系统或第三方提 ...
- 【 .NET 面向对象程序设计进阶》】【 《.NET 面向对象编程基础》】【《正则表达式助手》】
<.NET 面向对象程序设计进阶> <.NET 面向对象程序设计进阶> <正则表达式助手>
- 2018-2019-20175203 实验二 《Java面向对象程序设计》
2018-2019-20175203 实验二 <Java面向对象程序设计>实验报告 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑 ...
- [.net 面向对象程序设计深入](0) 开篇
[.net 面向对象程序设计深入](0)开篇 [.net 面向对象编程基础]和 [.net 面向对象程序设计进阶]在15年底写完了,群里也加进来不少热爱学习的小伙伴.让我深切感受到在这个 ...
- 《MATLAB面向对象程序设计》
<MATLAB面向对象程序设计> 基本信息 作者: 苗志宏 马金强 出版社:电子工业出版社 ISBN:9787121233449 上架时间:2014-6-18 出版日期:2014 年 ...
- OOP_面向对象程序设计概述
李际军老师"面向对象程序设计"课程第一课笔记整理 面向对象程序设计概述 20世纪90年代以来面向对象程序设计(Object Oriented Programming, 简称OOP) ...
- 201871010128-杨丽霞《面向对象程序设计(Java)》第十二周学习总结
201871010128-杨丽霞<面向对象程序设计(Java)>第十一周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- 实验二 Java面向对象程序设计
实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...
随机推荐
- Linux Mono Asp.net 部署方案
1.Jexus 国内的 官网:http://www.jexus.org 2.Apache 官网:http://mono-project.com/Mod_mono 3.Nginx 官网:http://m ...
- JavaScript高级程序设计27.pdf
第11章 DOM扩展 W3C将一些已经成为事实标准的专有扩展标准化并写入规范当中.对DOM的两个主要扩展是SelectorsAPI(选择符API)和HTML5 选择符API 就是根据CSS选择符选择与 ...
- 【转】Flask安装
Flask 依赖两个外部库:Werkzeug 和 Jinja2 . Werkzeug 是一个 WSGI(在 Web 应用和多种服务器之间的标准 Python 接口) 工具集.Jinja2 负责渲染模板 ...
- in和exists的区别与SQL执行效率分析
可总结为:当子查询表比主查询表大时,用Exists:当子查询表比主查询表小时,用in SQL中in可以分为三类: 1.形如select * from t1 where f1 in ('a','b'), ...
- Cas Server中各配置文件介绍
Cas Server中所有的配置文件都是放在WEB-INF目录及其子目录下的. 在WEB-INF/classes下的配置文件有: l cas-theme-default.properties:该文件 ...
- JAVA从零单排之前因
本人,男,21岁,普通院校本科,计算机专业.大学之前对计算机编程没有一点涉及.大学学计算机专业也是个偶然.因为当初高考的成绩不好,结果都是我父亲帮我报的学校和专业. 上了大学之后,大一都是在新奇中度过 ...
- 《linux程序设计》--读书笔记--第十四章信号量、共享内存和消息队列
信号量:用于管理对资源的访问: 共享内存:用于在程序之间高效的共享数据: 消息队列:在程序之间传递数据的一种简单方法: 一.信号量 临界代码:需要确保只有一个进程或者一个执行线程可以进入这个临界代码并 ...
- sqlServer将多字段设为主键方法
补充一下关于数据库多字段复合主键的设置. 首先一个表是不能有多个主键的.但是可以有多个字段组合成一个主键,这就是为什么有时候表里为什么会有多个字段都有主键的标志,那是因为他们组合成了一个主键了.我们可 ...
- mysql触发器的作用及语法
触发器是一种特殊的存储过程,它在插入,删除或改动特定表中的数据时触发运行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力. 数据库触发器有下面的作用: 1.安全性.能够基于数据库的值使用户具有 ...
- 深入理解Fsync----JBD内核调试 专业打杂程序员 @github yy哥
http://hustcat.github.io/ http://www.cnblogs.com/hustcat/p/3283955.html http://blog.sina.com.cn/s/ar ...