Java程序设计 笔记
final 最终的:
final 修饰类,表示这个类不能被继承,没有子类,如API里的Socket
final 修饰方法,表示这个方法不能被子类覆盖
final 修饰变量,这个变量只能被赋值一次,一般用static和final一起修饰常量,如Math.PI
super,表示父类的:
一般子类会修改和覆盖父类的方法,用super可以调用父类的方法,但super不能调用子类新增的属性和方法
构造函数不能继承,所以可以用super调用父类的构造函数,但super语句必须写在第一行,如
class Student extends Person {
Student(string name,int age,char gender) {
super(name,age);
this.gender = gender;
}
}
long类型转化为Date,打印Date的域:
Date d = new Date(4352245454350l);
Calendar calendar = Calendar.getInstance();
calendar.setTime(d);
System.out.println("year:" + calendar.get(Calendar.YEAR) + ",month:" + calendar.get(Calendar.MONTH));
多态:
多态的含义是:在一个程序中相同的名字可以表示不同的含义。如子类覆盖父类的方法、重载类的方法和动态绑定。
动态绑定:如果A是B的父类,那么 A a = new B(); 调用a.func();将由系统决定调用的是A类还是B类的方法,实现运行时的多态。
动态类型确定:
由于多态的功能,有时我们并不能知道引用变量真正的类或类型,但我们通过以下两点来知道:
(1)instanceof,语法是 变量 instanceof 类型,如 Person p = new Student(); if(p instanceof Student) {} //可以判断P引用的是Student类
(2)getClass方式,如 Person p = new Student(); Class c = p.getClass();.......//通过getClass()方法可以返回Class类,详见API里Class类
Java注释:
除了//和/* */之外,还有特殊的/** */,在特殊注释内可以用@标识一些值,然后用javadoc生成HTML文件。如:
/**
* @see
* @author luzeyi
* @version 2.0
*
*/
成员访问控制符和类访问控制符:
属性和方法有四种访问控制符:private,默认,protected和public,
(1)其中private修饰的属性和方法只能在同一类中访问,
(2)默认控制符修饰的属性和方法可以被同一个类和相同的包中所有的类访问,
(3)protected修饰的属性和方法可以被同一个类、相同包中所有的类和不同包中的子类访问(以继承形式的成员,不能是父类对象的成员),
(4)public修饰的属性和方法可以被任何类访问
类的访问控制符只有两个:public和默认,
(1)public类可以被所有类访问,
(2)默认的类只能被同一个包中的类访问
构造方法:
构造方法不能被继承。类的构造方法中的首行代码一定是:
(1)this,调用本类的其它构造方法
(2)super,调用父类的构造方法
(3)如果没有this和super,系统会自动增加super(),即调用父类中没有参数的构造方法,但是如果此时父类中不存在没有参数的构造方法,编译会出错
匿名类:
匿名类是特殊的内部类,主要实现在那些需要扩展某些类或借口来做参数的地方。
在方法中实现内部类时,内部类只能访问方法中用final修饰的局部变量,如:
//某方法体重
final A a = new A();
Thread t = new Thread ( //新产生的类的父类的Runnable,由于是接口,要实现接口函数run()
//匿名类
new Runnable() {
public void run() { a.print(); }
}
);
错误和异常(Error and Exception):
它们的父类Throwable,如果程序遇到Error,虚拟机就会死掉了;
Exception又分为(1)RunTimeException和CheckedException,对于RunTimeException,如除0异常,程序员小心一点可以避免;但对于CheckedException,
如果程序中会出现CheckedException,就必须加上try、catch或者在函数体throws Exception,否则编译不过。
创建自己的异常类时,要继承Exception或其它异常类,如
class MyException extends Exception{
public int i ;
public MyException(String m,int i) {
super(m);
this.i = i;
}
public int getID() {
return this.i;
}
}
void processNum(int i) throws MyException{
if(i < 0) {
throw new MyException("aaaaaaaaaaaaa",i);
}
}
equals和==:
Object的方法equals(),如果一个类没有覆盖equals方法,那么它的相等意味着两个引用相同,即都引用同一个对象,这时equals()的结果和==的结果一样;
==,等两个引用用==比较时,表示是否都引用同一个对象;
所以判断字符串内容是否相同时,应该使用equals方法,而不是==,如
String s1 = "LiMing";
String s2 = "LiMing";
System.out.println(s1 == s2);//true,相同常量的引用
System.out.println(s1.equals(s2));//true,内容相等,
String s3 = new String("LiMing");
String s4 = new String("LiMing");
System.out.println(s3 == s4);//false,不同对象的引用
System.out.println(s3.equals(s4));//true,内容相等
Collection和Map:
Collection分为Set和List,Map有Hashtable,
Set表示集合,包含不相同的无序元素,如HashSet
List表示列表,包含有序的元素,如ArrayList、Vector(和ArrayList一样,只是是线程安全的)和LinkedList
Arrays 和 Collections:
Arrays,提供了很多static函数处理数组们,如字节数组、String[]、Object[],操作如排序、查找(二分查找前要先排序)、拷贝、部分拷贝、比较、填充等;
Collections,提供了很多static函数处理List们,操作如排序、查找(二分查找前要先排序)、拷贝、部分拷贝、比较、填充等;
直接继承Thread和使用Runnable接口:
若直接使用Thread类,类中的this表示当成线程;若使用Runnable接口,则要在类中获得当前线程,必须使用Thread.currentThread()方法。
线程优先级:
规则是:(1)新建线程继承父线程的优先级,父线程可以是主线程,也可以用户自定义的线程;(2)主线程一般的优先级是NORM_PRIORITY;
Thread有3个静态常量,MIN_PRIORITY(一般是1),MAX_PRIORITY(一般是10),NORM_PRIORITY(一般是5);
Timer类:
创建Timer对象,相当于创建一个后台线程,可以用这个后台线程定时周期的执行一些任务,用法是将TimerTask传给schedule()方法,如
Timer t = new Timer();
PrintDate p1 = new PrintDate();
t.schedule(p1,1000,1000);
class PrintDate extends TimerTask { //创建继承TimerTask抽象类的类
public void run() {
System.out.println(new Date());
}
}
线程安全和synchronized:
(1)synchronized可以提供线程安全,即保护了共享数据;调用任何synchronized方法时,对象就会被锁定,不可再调用任何那个对象的其它任何synchronized方法,除非第一个synchronized方法完成了自己的工作,并解除锁定;
(2)除了在方法前在synchronized外,还可以synchronized(对象) {语句... },表示在语句执行期间,给某对象加上锁,这里对象可以是this对象。
线程同步:
使用wait()、notify()实现线程间的同步操作,如:
class Counter {
int[] c = new int[10];
int index = 0;
public synchronized void put(int v) {
while(index == 10) {
try{
wait();
}
catch(InterruptedException e){}
}
c[index] = v;
index ++;
notifyAll();
}
public synchronized int get() {
while(index == 0) {
try {
wait();
}
catch(InterruptedException e){}
}
index --;
notifyAll();
return c[index];
}
}
节点流和处理流:
AWT(abstract window toolkit)组件分类:
Java中GUI组件都是Compoment和MenuCompoment子类;
Compoment分为 Container 和 非Container(如label、button);Container又分为顶层容器(Window--Frame和Dialog)和非顶层容器(Panel、ScrollPanel)