(1)java从源代码到目标代码的过程与一般编译过程不大一样,首先编译器会将java翻译为一种中间语言(class文件),与相关文件结合后形成jar文件,送入java虚拟机(JVM),然后通过虚拟机翻译执行。这么做的目的主要是避免计算机平台的限制,因为对所以计算机平台,中间语言都是一样的。
(2)面向对象简单的说就是程序由一些类组成,是程序行为和数据的一些封装。更接近人认识事物的方式,例如特征和行为。
(3)图形界面的一些类:GLabel,GRect,GOval,GLine
(4)关于随机数类RandomGenerator
在产生一个随机数产生器的实例时利用RandomGenerator.getInstance()方法可以产生一个实例。
使用时必须import acm.util.*
(5)instance variable 实例变量
实例变量在类里声明而不是在方法里声明;
表示对象的一种状态,特征等。与在方法里定义的变量不同。
在java里面没有全局变量这个概念,因为java认为全局变量时一种很坏的概念。
(6)在java中默认规定常量在顶端定义,而实例变量在下面定义。
(7)读取字符串可以用readLine()方法。
(8)在java中定义自己类的套路:
public class className (extends superclass){
……
}
这里的extends表示的是className类是superclass类的一个继承。
如果不指定superclass,这java会默认你继承自一个名字为Object的超类。
(9)创建一个类一般首先要创建一个文件,文件的命名一般以类名作为文件名,以java作为结尾。
(10)在eclipse中创建一个新类的时候会提示你是否将该类放入默认包中,包的概念主要是eclipse提供的一个功能,可以让你在需要的情况下讲一些有关联的类放在一起以方便管理,但是一般情况下,如果不指定包的时候可以直接将class放入默认包中即可。
(11)在java中也有this关键字,this代表的就是本对象,this refers to receiver object。
(12)在java中有个很重要的特点就是当把对象直接作为方法的参数传递时,传递的不是源对象的副本,而是对原对象的一个引用,这与C++中不同,在C++中需要明确指明是引用类型才能实现引用传递。
(13)补充一点前面包的概念,当没有创建自己的包时,把所有类都放在默认包时,当在一个类里面需要用到别的类时,编译器会在默认包里寻找这个类的定义。
(14)除了本地变量和实例变量之外,还有一类变量称之为class variable(类变量)
类变量就是被类的所有对象所共享的变量。
定义类变量时,需要加上关键字static,所以类变量有时也称之为静态变量。
(15)在java中定义常量的一般方式为:private static final double name=vaule;可以看到常量定义的时候也用到了static。只是常量不能改变,而static定义的非常量数据值可以进行改变。在一般情况下static定义的变量都用于常量。
(16)一个新的概念javadoc,即是java的文档系统。
javadoc comments
start with:
special "tags"(@reslut,@param,etc)
可以通过这些特殊的标签,让你的文档自动转换为漂亮的html文档。从而使其他更好理解你的类的功能。
举个例子,红色所示为javadoc:
public void setUnits(double units){
}
要学会看javadoc文档,而不用看代码就能理解代码的功能。
(17)一般每个类最好有一个public String toString()方法以文本形式返回该类的一些信息。
(18)在扩展父类时,即在写子类的过程中,构造函数里面在调用父类的构造函数时,利用super()来进行构造。
(19)java中也有override(重写)的概念,与c++类似。特别注意(overload与override的区别)特在此转载一些清晰的说明:
override(重写)
1、方法名、参数、返回值相同。
2、子类方法不能缩小父类方法的访问权限。
3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
4、存在于父类和子类之间。
5、方法被定义为final不能被重写。
overload(重载)
1、参数类型、个数、顺序至少有一个不相同。
2、不能重载只有返回值不同的方法名。
3、存在于父类和子类、同类中。
(20)同c++中一样,子类不能访问父类的私有变量。
++++++++++++++++++++++++++讲解画图的深入部分++++++++++++++++++++++++++
(21)GLine GRect GOval都继承于GObject类
ACM图形库的具体情况如下图所示:
首先讲讲GCanvas,什么是GCanvas呢?从某种程度上讲,它代表了拼贴画的背景画布,它不属于GObject。
GraphicsProgram auotomatically creates GCanvas that fills the entire program window
When you call add(...) in GraphicsProgram,it is forwarding your call to the GCanvas.
在GraphicsProgram和GCanvas中有些方法是通用的(所谓通用其实就是利用转发的功能,即GraphicsProgram充当一个中间调用者而已。)具体情况如下所示。
但对有些方法只有GraphicsProgram中拥有,这些方法对于开发游戏有点用处。具体如下图所示。
(22)对于GObjects以及其他继承类来说,他们共有的方法主要有:
计算机科学里的通用含义:
java里的含义:通俗点说,接口就是一组方法,一组类或者对象都拥有这组方法。
当然,有继承关系的类,他们都拥有某些相同的一组方法,那到底这个接口与继承里继承的方法有何区别呢?区别当然很简单啦,就是当某些组类他们没有一些继承关系的时候却要共享一些方法的时候就需要用到接口这个概念。接口是一种把某些共有属性从继承的结构中分离出来的方法。
接口就是一些方法的集合,某些类会实现这些方法。
baseline
orign
height (hight of font)
ascent
descent
(25)GArc类
GArc—are formed by taking section from perimeter of oval
就是画弧线
(26)
用于从一个文件显示一幅图像
new GImage(image file,x,y)
(27)GPolygon类
画出直线组成的图形对象,如菱形,多变形,诸如此类等等。
(28)GCompound类
组合其他对象并把他们组合成一个对象
(29)事件驱动程序(event-driven program)
可以通过添加相应的listeners来监听相应的事件。
如在图形程序中可以调用
addMouseListeners()
addKeyListeners()
(30)为了使用监听器,需要在java程序里导入一个库来出来相应的事件
import java.awt.Event.*;
(31)init()方法和run()方法的具体区别没有说。
一般在监听事件中用init()方法
处理鼠标事件的函数为
pubilc void mouseClicked(MouseEvent e);
教程里说的一般相应鼠标事件的标准步骤为:
--在init()函数或者run()函数里添加addMouseListeners()函数
--添加相应的鼠标事件处理方法
相对来说,可以利用常量来代替枚举
(34)java里面有一个特殊的字符类Character,有许多的静态方法。
在java中的调用方式为:举个例子,Character.toUppercase(ch).
这与c++中不同,在c++中调用静态成员函数的形式为ClassName::memberFunction();
(35)字符串的最大的特性就是其的不可更改性(immutable),即字符串的内容不能在原位更改。这是java中一个比较特殊的地方,与其他语言不同,但是这里听的有点迷糊,String str=“HELLO”,这里的str不能更改吗?其他语言只是常量字符串不能更改,但是string str=“hello”。str还是可以更改的。在java中难道str也不能更改???
(注:经过确认:java中字符串具有不变性,不能对本身的字符串进行修改。)
(36)在java中没有char* ch=“fdf”;这种创建字符串的方式,说白了,其实java里面就没有指针这个概念。
在java里面只有char和String类。一个用于定义字符,一个用于字符串。
(37)在java中如果想判断两个字符串相等,
举个例子,String str1;
String str2;
判断相等不能用if(str1==str2)
这种方法语法正确,编译器也不会报错,但是这样比较的只是判断str1和str2是否为同一个对象。
如果想判断两个字符串是否相等,判断形式为:
if(str1.equals(str2));
(38)内存
内存空间主要可以分为三大块:
一块主要用于存储所有的静态变量和常量
动态变量存在的地方叫做堆heap,是new动态分配的。
本地变量的存放的地方叫做栈stack,传递参数或者方法调用时,会用到stack
在java里面的好处就是不用用户来管理这些内存,而由java自动管理。
(39)个人认为,在java里对象都是在堆里进行分配的,一个对象如果只是声明的话只是地址(虽然没有*,但是就是表示的是地址)
举个例子
Point p1=new Point(3,5);
Point p2=p1;
这样p2和p1指向的其实是同一个对象,在对p2进行操作时,其实也改动了p1指向的对象的值。
这也解释了为什么在java的方法中如果将对象作为参数会改变原对象的状态,因为在方法的参数中是声明的对象,只是一个地址。这种方法很巧妙,通过一个限制而(例如所有对象都必须在堆中创建,以new方式),而很好的规避掉了一些麻烦的问题,如指针等,而带来了很多操作的便利,也比较好理解。
所以,在java的编程中,对所有对象的名称当成是一个地址就行,这样可以有助于避免很多问题:
如声明两个字符串String s1=“hello”;
String s2="hello";
为什么不能用if(s1==s2)来判断s1与s2字符串相等呢,因为s1与s2只是两个地址,这样只能判断s1与s2指向的是不是同一个对象。
(40)int Integer
double Double
boolean Boolean
char Character
(41)读取文件
文本文件和二进制文件
(42)为了实现文件的读取,需要引入一个包 import java.io.*
读取文件的一般步骤为:
打开文件(在java中一般通过将一个对象与一个文件相互关联),创建一个BufferedReader对象与文件相关联。
读取文件
关闭文件
(43)在java中安全机制比较完善 在编程中涉及到文件的都要加上异常处理机制
import acm.program.*;
import java.io.*;
public class MyTest extends ConsoleProgram {
}
(44)当出现一个你不知道的异常类型时,可以通过throw ErrorException将异常抛出,交给调用此方法的上级进行处理。
(45)对于写文件来说,也比较简单
打开 利用PrintWriter
利用println来进行写操作
关闭文件
例如创建了一个wr写对象 可以利用wr.println(line)写入一行数据
(46)数组的东西太简单,我不想多看。
(47)debugging
软件设计的过程:
Design-architect
coding-engineer
testing-vandal 破坏者
程序的bug一般出现在以下几个方面:
坏值
错误的逻辑
无效的假设
(48)将复杂的问题变简单
(49)调试过程中适度利用显示函数
(50)在java中接口的功能很大程度上类似于c++中的抽象基类。
public class ClassName implements InterfaceNAME{
……code……
}
而继承在java中为
public class ClassName extends ClassName{
(50)可以实现多个接口
(51)Map是java中的一个接口
提供key和value关联起来的能力
通过key来取得value值
java中有HaspMap,是一个接口的实现。
HashMap是一个模板template
例子:HaspMap<String,String> dict=new HashMap<String,String>();
在java中template中类型不能为基本类型,如int等,必须是对象类型。
(52)有时候上述可以写成Map<String,String> dict=new HashMap<String,String>();为什么能够这样?我思考的结果就是,这个与c++中多态的机制是一致的,你想想,这里dict是一个指针,而Map是一个接口相当于C++中的抽象基类,所以这里这样定义并dict去调用HashMap中的方法是一点问题都没有的。但是也要记住,接口与继承是完全两个不同的概念,这个要始终记在心里。
(53)