博文
[转]从C++到Java——理解面向对象的关键所在 (1)(2005-11-26 02:16:00)
摘要:Java在虚拟机上运行
Java源代码并不是被编译成为普通的机器代码。而是被翻译成为虚拟机可以执行的代码。一个Java解释器最终执行这些代码。这其中没有连接的过程;解释在需要的时候动态的加载一些类;
Java是完全面向对象的
Java是一种完全面向对象的语言。这意味着你对任何一个Java对象所做的动作都是通过一个方法实现的。第一点就是,再也没有没有主函数这样的孤立的东西了。取而代之的是,你必须开始用一个对象的看法看待一个程序,一个类的对象。但是这个对象又什么对象呢?大多数Java程序只是简单的通过继承Java基础类Object来实现所需要的东西,但是你可以通过创建程序基础类用于多个特性相似的应用程序来节省时间。
严格的面向对象的规定意味着理用原有的C/C++代码不可以直接不加改动的使用;系统调用也是这样的。C++中,你可以通过在C++正常的命名空间外声明extern"C"来使用原有的C的过程调用,包括系统调用。
在Java中,只有一个类似的安全回溯的方法,但是并不是十分简单的方法。你必须定义一个本地方法,其目的是为C语言提供接口,然后提供连接的介质。Java环境提供了完成这种任务的工具,但是整个过程和C++中提供的extern比微不足道,完成使用C++类的过程则更加复杂,因为这样会引入对C的借口和C函数和C++成员函数的问题。
幸运的是,许多常用的系统实用工具函数已经在系统类中的方法中提供出来,但是这些明显没有包含经过许多年来你所创建的那些类和过程。所以,在你需要的时候你应该去钻研一下。
Java中没有独立的头文件
在Java中,关于类的一切东西都被放到一个单独的文件中。方法的位置只可能在一个地方出现,一个方法的实现必须在它的定义过程中同时进行。这样做得优点是在实现程序的时候不容易因为文件的非同步错误而失败,或者获取到一个没有实现的声明。类的声明可以被Java解释器利用甚至是从一个编译过的单元中获取,所以不再需要有头文件,只要有编译过的文件。
这样做的缺点与我们编程的过程有关。许多C++程序员喜欢用头文件来代替文档。要看一个成员函数的接口参数,只需要看头文件中的声明即可。你可以经常的看头文件即可了解怎样去使用这个类。在Java中,没有这样的总......
[转]从C++到Java——理解面向对象的关键所在 (2)(2005-11-26 02:14:00)
摘要:Java限制了常量对象和方法
在C++中,你可以正式的声明一个函数参数或者函数返回值为const类型,这样可以有效的防止对参数或者返回值的不正当修改。另外,你可以声明一个成员函数为const,表明它不可以修改任何他操作的对象。
Java支持常量操作符,只读变量,这些通过final关键字实现。但是Java没有支持强制的使一个可写变量在函数传递、返回的过程中变为只读。或者定义一个不操作修改对象的常量方法。
在Java中,这个省略带来的影响和在C++中相比就非常小了,这很大程度上因为字符串变量和字符数组的不同,但是这也带来一个引起错误的隐患。特别地,没有办法检验一个方法是否可以改动对象。
Java没有指针
理解指针的概念是一个C或C++程序员最难应付的问题。指针也是错误产生的一大根源。Java中没有指针,对象的句柄直接作为参数传递,而不是传递指针。另外,你必须通过索引使用数组。这些都不是什么大问题。然而,没有指针是在写含有函数指针或者成员函数指针的系统的时候引起很大麻烦。这个问题在处理回调函数的时候更加显著。
Java没有参数化类型
参数化类型提供了用一段程序处理许多相似程序的方法。一个例子就是开平方根的方法,它可以对int或者float操作。在C++中,这一特性是由模板提供的。
Java中不包含C++中的模板的等价物。如果你经常使用模板来简化程序,比如说构造许多使用相似参数类型的函数,这简直就是灾难。这意味着更多使用复制、粘贴的过程来手动的完成。然而,如果你使用模板来生成类的话,没有简单的方法。
Java使用垃圾回收
在垃圾回收的语言中,运行时环境一直监测哪些内存不被使用。当一块内存不用的时候,系统自动的回收内存。比如说,一个对象在一个方法中生成,但是没有被调用着返回或者没有储存为全局变量,不能在方法外部使用。系统自己会知道哪些变量是你用不到的,哪些是可以用到的。因此,你不必再为破坏对象回收内存而担心。
在C++中,很多的调试时间都被使用到检查内存漏洞中。Java的这种方法很大程度上降低了这种错误的可能。但是他依然不能处理逻辑混乱的程序,他们不能够被回收。许多C++的类中的析构函数是用来释放对象引用的内存的。
J......
一个简单计算器的界面设计(2005-11-13 22:38:00)
摘要:import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import javax.swing.*;
class CalculatorFrame
{
Frame calculatorFrame;
Panel top;
Panel center;
Panel main;
TextField txt;
Button B1,B2,B3,B4,B5,B6,B7,B8,B9,B10,B11,B12,B13,B14,B15,B16;
public CalculatorFrame(String Title,int AppletWidth,int AppletHeight,Applet Calcu)
{
calculatorFrame=new Frame(Title);
top=new Panel();
center=new Panel();
main=new Panel();
txt=new TextField(10);
//窗口设计
center.setLayout(new GridLayout(5,4));
main.setLayout(new BorderLayout());
main.add(top,BorderLayout.NORTH);
&......
如何学习JAVA?[转贴](2005-11-13 13:14:00)
摘要:前言
在ChinaITLAB导师制辅导中,笔者发现问得最多的问题莫过于"如何学习编程?JAVA该如何学习?"。类似的问题回答多了,就萌生了写下本文的想法。到时候再有人问起类似的问题,我可以告诉他(她),请你去看看《JAVA学习之路》。拜读过台湾蔡学镛先生的《JAVA夜未眠》,有些文章如《JAVA学习之道》等让我们确实有共鸣,本文题目也由此而来。
软件开发之路是充满荆棘与挑战之路,也是充满希望之路。JAVA学习也是如此,没有捷径可走。梦想像《天龙八部》中虚竹一样被无崖子醍醐灌顶而轻松获得一甲子功力,是很不现实的。每天仰天大叫"天神啊,请赐给我一本葵花宝典吧",殊不知即使你获得了葵花宝典,除了受自宫其身之苦外,你也不一定成得了"东方不败",倒是成"西方失败"的几率高一点。
"不走弯路,就是捷径",佛经说的不无道理。
今天我们来谈谈如何学习Java
1. JAVA学习路线
1.1 基础语法及JAVA原理
基础语法和JAVA原理是地基,地基不牢靠,犹如沙地上建摩天大厦,是相当危险的。学习JAVA也是如此,必须要有扎实的基础,你才能在J2EE、J2ME领域游刃有余。参加SCJP(SUN公司认证的JAVA程序员)考试不失为一个好方法,原因之一是为了对得起你交的1200大洋考试费,你会更努力学习,原因之二是SCJP考试能够让你把基础打得很牢靠,它要求你跟JDK一样熟悉JAVA基础知识;但是你千万不要认为考过了SCJP就有多了不起,就能够获得软件公司的青睐,就能够获取高薪,这样的想法也是很危险的。获得"真正"的SCJP只能证明你的基础还过得去,但离实际开发还有很长的一段路要走。
1.2 OO思想的领悟
掌握了基础语法和JAVA程序运行原理后,我们就可以用JAVA语言实现面向对象的思想了。面向对象,是一种方法学;是独立于语言之外的编程思想;是CBD基于组件开发的基础;属于强势技术之一。当以后因工作需要转到别的面向对象语言的时候,你会感到特别的熟悉亲切,学起来像喝凉水这么简单。
使用面向对象的思想进行开发的基本过程是:
●调查收集需求。
●建立用例模型。
●从用例模型中识别分析类及类与类之间的静态动态关系,......
我的第一个java程序(2005-11-05 00:25:00)
摘要:【题目】
n 编写一个Application,在屏幕上显示如下的信息:
******************
Welcome
******************
n 把上题改写为Applet。
【Application代码】
import java.util.*;
public class Welcome
{
public static void main(String[] args)
{
System.out.println("*************");
System.out.println("Welcome!");
System.out.println("*************");
}
}......
编写Applet绘制圆形及几个简单java程序(2005-11-05 00:18:00)
摘要:【问题描述】编写Applet,绘制一个圆心为(60,70),半径为50的圆。提示:使用Math.sin(x)和 Math.cos(x)计算正弦和余弦。
【程序代码】
import java.awt.*;
import java.applet.*;
import java.util.*;
public class Circle extends Applet
{
public void paint(Graphics g)
{
for(double angle=0;angle<2*Math.PI;)
{
g.drawString("*",(60+(int)(50*Math.sin(angle))),70+(int)(50*Math.cos(angle)));
angle+=(Math.PI/20.0);
}
}
}
......
关于java中package的设置(2005-10-13 23:45:00)
摘要:今天看《java编程思想》关于设置package一章,书上讲的很详细,于是就照着书上的设置试着建立mypackage。
package就是程序库单元,在一般的java程序中,我们使用关键字import导入整个程序库,例如:
import java.util.*;
这时我们取用的便是所谓的package,这种写法会将java标准公用程序库(utility library,也就是java.util)整个引入。此类导入
(importing)动作的存在理由,也是为了提供命名空间(name space)的管理机制。所有的class成员名劫被互相隔绝。class A的
函数f(),其名称不会和class B()中具有相同标记式的f()相冲突。与此相类似,为了不使class名称发生冲突,于是引入了package
进行管理。
所谓程序库就是一组class文件。其中每个文件都有一个public class,所以每个文件都以一个组件。如果你希望这些组件归属于一个
群组,便可以使用关键字package.
其实你只需在你的程序起始处这么写就可以了:
package mypackage;
这时的 mypackage就是自己创建的一个程序库。
不过习惯上我们会以class开发者的internet域名(的相反顺序)作为package名称的第一部分。比如sina的域名是:www.sina.com
。此时定义sina的package为:com.sina.*。*代表具体的class名。
下面是我在建立自己的package时遇见的问题,希望对大家有所帮助。
首先我写了一个关于简化System.out.println()的程序:
package mypackage;
public class P
{
public static void print(String s)
{
System.out.print(s);
}
public static void println(String s)
{
System.out.println(s);
}
public stat......