一个.java文件里可以有多个class,但是只能有一个class是public的。.java文件里 可以没有类是public的。包含main的那个类也可以不是public的。
3. .java文件里如果有public的class,那么文件名必须和该类名一致(大小写相关)。如果没有public类,那么文件名也必须和其中某个类(随便哪个都行)相同。
4. Java程序大小写相关,甚至文件名都是大小写相关的。
5. .java文件的编码必须是ANSI的.
6. Java程序中的每个类,经过编译后会变成一个.class文件,文件名和类名相同。
7. a.java中如果用到了文件b.java中的类,那么不做特殊处理的话, 程序运行时,应确保a.class应该和 b.class在同一个文件夹下[package]。
8. Java没有全局变量和全局函数。所有东西都写在 class里面。
数据类型:
1.java有boolean数据类型,没有bool类型。
boolean类型的取值是true或false。boolean和int类型不能互相转换。条件表达式必须是boolean类型的,不能把0当false,非0当true
2.有byte数据类型,byte类型的变量占一个字节, 取值是 -128 – 127。
3. float常量后面要加 'f' 或 'F',如:
float y = 0.3f,x = 1.3e-4f;
4. char类型的变量可以是Unicode字符表中的字符,包括可以是汉字,如 :
charc = ‘好’; char 为两个字节
5. long类型的变量占8个字节。long类型的常量后面要跟'L'或'l',如: long a = 0xffffffffffaL;
6. 将精度高的数值赋值给精度低的变量时,必须要进行强制类型转换,不过char类型和int类型可以互相赋值,只要赋给char类型的int值不超过65535;
对象
3. Java 中对象用new创建后,不需要delete。Java虚拟机有垃圾回收机制,定期自动回收没用的对象。
4. 对象间互相赋值会使得两个对象指向(或说是引用)相同的地方
数组
- Java 中的数组都是对象,有许多属性和方法。比如length属性表示数组元素个数。
- 数组定义后并不占有内存,也必须用new运算符创建后才能使用。创建时指定元素个数float gpa[ ];
gpa = new float[300]; //300个元素
也可以定义时直接初始化:
float gpa[ ] =new float[4];
int a [ ] = {1,2,3,4, 5};
- System.out.println(a.length); //输出5
- 二维数组的每一行都可以分别初始化,而且每一行的元素个数可以不一样。二维数组的length属性代表其行数,也就是其中一维数组的个数。
- 6. 数组是对象,本质是指针。同类型数组之间可以互相赋值。
importjava.util.Arrays; //类似于C++的#incude
public classHelloWorld {
publicstatic void main( String args[ ]) {
chara[ ] = { 'h','e','k' };
charb[ ] = { '1','2','3','4' };
a= b; //a 和 b 指向(或称引用)同一个数组,a原来指向的数组被垃圾回收
System.out.println(a.length);
a[0]= 'a'; //b[0]也变成'a'
Strings = Arrays.toString(b);
System.out.println(s);
}//Arrays是Java标准类,能将数组转换成字符串
}
对象的引用与赋值:
Class Arm
Arm a = new Arm(xx);
Arm b = a;
这是对象的赋值,b和a是统一个引用实例;
用b ==a可以判断为true;
用b.equals(a)判断为true
若Arm b =new Arm();
b.set(a);
这个只是两个对象的内容相同,用b == a判断为false;
用b.equals(a)判断为true
char类型的的数组可以直接用println输出其全部内容
char a[] ={ 'a','b','c'};
System.out.println(a); //输出 abc
char类型的数组不能如下初始化:
char a[ ] = "this";
9. 拷贝数组
System.arraycopy(srcArray,intidx1,destArray,int idx2, int len)
将srcArray从下标idx1开始的len个元素拷贝到destArray从下标idx2开始的地方。destArray必须足够大。
Arrays.copyOfRange(someArray,int from,intto)
将someArray从from开始到to-1的元素复制到一个新数组中并且返回。
类
1. 所有成员函数的函数体都写在
class {
….
} //此处不需要‘;’
里面,不能拿出来写。
2. 成员变量可以是本类的对象(因对象本质是指针)
class LinklistNode {
intn;
LinklistNodenext;
}
4. 同样存在 “this指针”,当然在Java里不叫指针。在类的方法内可以通过 “ this.成员名”的方式访问成员。总之,C++中的 “->”和 “::”在Java里都是“.”
7. 构造方法没有初始化列表。要调用基类的构造方法,就写 super(….);
8. 类派生使用关键字 extends
Java中的函数,参数都是传值的,没有传引用的。如果参数是对象,则效果和C++中参数是指针的情况一样。【对象传引用】
包名可以是一个标识符,也可以是多个标识符用"."连接,
package pku;
package pku.eecs.cs;
总之,包名里的一个标识符,就代表一个文件夹。也可以认为包就是一个文件夹。Package可以下嵌套多个package
在eclips工程里,编译出来的.class文件都放在工程的bin文件夹下,源程序都放在src文件夹下.源程序文件(.Java)的存放位置与包名的关系,和.class文件存放位置与包名的关系一样。
用import语句引入包,可以省去在类前面写包名
import gw1.*; //gw1里面的类,都不用写包名了
import语句也可以只引入一个类:
import gw1.PackageTest;
一个包对应于一个文件夹,但不包括该文件夹下的子文件夹。例如:
import gw2.*;
使得 gw2文件夹下的类被import进来,但是gw2\subgw1文件夹下的类,并没有被import进来。要import它们,还是需要写:
import gw2.subgw1.*;
同一个包里的类,不论是否在同一个.java文件中,不论是否是public,都可以互相使用。
只能使用其他包里的 public类,不能使用其他包里的非 public类。
1. 类的成员,前面可以加 public(公有成员),private(私有成员)或protected(保护成员)。
不加这三个标识符,并不缺省为私有,而是称为“友好成员”。
2. 一个类,可以访问同包类对象的公有、友好和保护成员,不可以访问同包类的私有成员
3. 一个类,可以访问异包类对象的公有成员,不能访问异包类对象的保护、私有和友好成员
4. 子类不能访问父类的私有成员。
5、 友好成员和保护成员的区别是:与父类不在同一包中的子类,可以访问父类的保护成员,不能访问父类的友好成员。
判断时,先看同包异包对象,再看是否父类子类。
用 “super.成员名 ”来访问基类的成员;
在构造方法中用“super(….)”调用基类构造方法
如果派生类的构造方法没有调用基类的构造方法,那么等效于用“super();”调用基类的无参构造方法
重写基类的方法时,不能缩小方法的可访问范围。比如基类的Function1是public 的,那么派生类中重写的同名同参数表的 Function1,就不能是友好、保护或私有的。
Final
- final 关键字可以修饰类、成员变量和方法中的局部变量
- final关键字修饰的类,不允许有派生类
finalclass A { }
A不能有派生类。Java 中的String类,就是final的
- final修饰成员变量和局部变量时,作用相当于C++的const,即常量
4. final成员变量和局部变量必须在声明的时候初始化。
5. final成员变量必须在声明时初始化或在构造函数中初始化,初始化后,其值不可改变。
class A {
finalint v = 4; //声明时初始化
A(intn) { }
}
或:
class A {
final int v;
A(int n) {v = n;} //构造函数中初始化
}
6. final局部变量也可以不初始化,但是赋值或创建一次后,就不能修改其值。
7. 一个对象是final的,其含义并不是其成员变量的值不能被修改,而是它不能再指向别的对象,类似于C++ 的
类型 * const 指针名;
如
int * const p;
abstract
1. abstract类相当于C++中的抽象类,abstract方法相当于C++的纯虚函数。只有abstract类才能有abstract方法。和C++不同之处在于,abstract类中可以没有abstract方法。
abstractclass A {
abstractvoid func(); //不能写函数体
}
2. abstract类不能用new运算符创建对象。
Interface
接口和类有点像,但是其所有的成员变量都是public且final的(不写public和final也有一样),所有的成员函数都是abstract 且public的(不写public和abstract 也有一样)。例如:
interface A {
intn = 5;
voidFunc(int a,int b);
intPrintInfo();
}
可以定义接口变量,如 : A a;
但是,不能用new运算符来创建“接口对象”。
2. 接口可以派生出子接口:
interface B extends A {
doublef = 3.0;
intCount();
}
接口可以派生出类。从接口派生类,用implements关键字,也称为类“实现”了某个接口:
实现了接口的类,一定要对接口中的全部方法都重写,写成public的,要写出函数体。若有接口的方法没有被重写,则这个类就必须是abstract 的。
可以让接口变量指向一个new出来的实现了该接口的类的对象:
interface B {
intv = 6; void FuncB();
}
class E implements B {
publicvoid FuncB() {
System.out.println("inB.FuncB");
}
}
public class HelloWorld {
publicstatic void main( String args[ ]) {
B b = new E();
b.FuncB();
}
接口也可以用public来修饰,称为“公有接口”。public 接口可以被任何类实现,非 public接口仅可以被同一个包中的类实现。
Java中没有多继承。一个类最多只能有一个基类。但是一个类可以在继承一个基类的同时,还实现多个接口(也可以只实现多个接口而不继承任何类)。
classD extends C implements A,B {
publicvoid Func(int a,int b) { }
publicint PrintInfo() { return 0; }
publicvoid FuncB() { }
}
1. Java中的方法,除了类方法(静态成员函数)外,都可以认为相当于是C++中的虚函数。
2. Java中多态的规则如下:
1)通过基类对象,调用基类和派生类都有的同名同参数表的方法时,是多态。该基类对象如果指向的确是基类对象,那么指向的就是基类的方法,如果指向的是派生类对象,那么执行的就是派生类的方法。
2)通过接口变量,调用接口和实现了该接口的类都有的同名同参数表的方法时,是多态。被执行的是类的方法。
接口存在的目的,就是为了实现多态
String
String s = "123456";
x = Integer.parseInt(s);
String str = String.valueOf(1233.223);
字符串和字节数组 byte d[]字节数组,若干个字节,字节【-128,127】
byted[ ] = "abc你我他".getBytes(); //由字符串生成字节数组。
System.out.println(d.length);
Strings = new String(d,3,2);//从字节数组,生成字符串。
System.out.println(s);
4. StringBuffer类
String字符串不能修改,StringBuffer可以
StringBuffer str = newStringBuffer("123");
str.append("456");
System.out.println(str);
char c = str.charAt(2);
System.out.println(c);
str.setCharAt(0,'X');
System.out.println(str);
str.insert(2, "abc");
System.out.println(str);
String s1 = "string obj";
str = new StringBuffer(s1);
String s2 = new String(str);
输出:
123456
3
X23456
X2abc3456
GUI
使用图形界面,需要importjava.swing.*;
JComponent类及其派生类的对象叫“组件”
Container类及其派生类的对象叫“容器”
容器上可以添加组件
虽然组件也是容器,但许多组件一般不当做容器用,比如JButton。但JPanel会作为容器使用。
窗口一般从Jframe派生
对话框从Jdialog派生
在一个窗口或对话框上可以添加组件
各种按钮,编辑框,选择框,列表框,菜单,都是组件。
往容器上放组件前,要设置布局。布局决定了组件的摆放方式。
class TextWindow extends JFrame {
JTextFieldtext1,text2;
JButtonbt;
publicTextWindow() {
init();
setBounds(100,100,236,150);
setVisible(true);
}
voidinit() {
setLayout(newFlowLayout()); //设置布局
text1= new JTextField("uneditable");
text1.setEditable(false);
text2= new JTextField(10); //10个字符宽
add(text1);
add(text2);
bt= new JButton("Please Push");
add(bt);
}
有些对象上能够发生“事件”,称为“事件源”
importjava.awt.event.*;
事件源通过调用一些方法,将某个对象注册为自己的监视器,如文本框,可以用
addActionListener(对象名);
将一个对象注册为自己的监视器。
能作为监视器使用的对象,必须实现某些特定的接口。
比如要作为文本框的监视器的对象,必须实现ActionListener 接口。
ActionListener接口有以下方法:
public void actionPerformed(ActionEvent e)
在文本框中有敲回车时,文本框就会创建一个ActionEvent对象,然后以此对象作为参数,调用监视器对象的该方法,通过该参数,就能知道具体发生的事件是什么样的,以及事件发生在哪个源上。
事件有不同规定类型,ActionEvent 是其中一种
比如,ActionEvent 有以下方法:
Object getSource(); 取得事件源对象
String getActionCommand() 获取和事件有关的一个字符串
所有的Java对象都是从Object对象派生而来
响应鼠标事件,用:
addMouseListener : 添加响应鼠标点击、进出组件事件的监视器
监视器需要实现 MouseListener接口
MouseListener : 有以下方法:
publicvoid mouseExited(MouseEvent arg0) ;
publicvoid mouseEntered (MouseEvent arg0) ;
publicvoid mousePressed(MouseEvent arg0) ;
publicvoid mouseReleased(MouseEvent arg0) ;
publicvoid mouseClicked(MouseEvent arg0) ;
addMouseMotionListener : 添加响应鼠标移动和拖动事件的监视器
监视器需要实现 MouseMotionListener 接口
MouseMotionListener : 有以下方法:
publicvoid mouseMoved(MouseEvent arg0) ;
publicvoid mouseDraged (MouseEvent arg0);
响应键盘事件,用:
addKeyListener : 添加响应键盘敲击的监视器
监视器需要实现 KeyListener接口
KeyListener有以下方法:
public void keyTyped(KeyEvent arg0)
public void keyPressed(KeyEvent arg0)
public void keyReleased(KeyEvent arg0)