public表示任何地方都可以访问,不写和internal一样,表示同一个包内可以访问,
protected表示只用本类方法及继承类方法可以访问,
private表示只有本类方法可以访问。
尚学堂科技_马士兵_J2SE_5.0_第01章_JAVA简介。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
一!在cmd中敲javac
a实际上是执行系统变量path的设置好的javac.exe可执行文件,
b放在最前面,
c开启新的cmd窗口,
d java –version,
二!classpath :配置.class文件路径。
三!文件,详细信息,应用于所有文件,
四!cmd中,第一步javac compile要后缀.java。第二步java不要后缀。
编译要加后缀名javac helloworld.java
执行不加后缀名java helloworld
执行入口:public static void main ( Sting args[] ) {…}
五!一个java文件至多只有一个public类,且类名 和 文件名 一致。
一个类,一个class文件,
尚学堂科技_马士兵_J2SE_5.0_第02章_基础语法。。。。。。。。。。。。。。。。。。。。。。。。。。。
一!标识符。。比c语言多一个美元符$
二!关键字
三!代码执行过程
四!java中无unsigned,java数据的基本类型不支持无符号变量,有正有负。
五!类型转换
尚学堂科技_马士兵_J2SE_5.0_第03章_面向对象。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
一!j 05_约定俗成命名规则
《18_static关键字_1》
每个对象只公共一份private static int sid=0,常用于计数。
二!《20_package和import语句_1》
引入其他文件中的类。
import 域名父包名.子包名.*; //引入该包下所有类*
三!《20_package和import语句_2》
class文件的最上层的父目录 必须 位于classpath下。
执行一个类,需要写全包名,
三!《20_package和import语句_3》
java.lung包不许引入,其他包都需引入。
四!《20_package和import语句_3》
cd 到要打包的文件目录下,cmd命令 jar –cvf test.jar *.* //*.*指所有文件都打包。
将生成的包名
classpath中:加入jar目录。方法。
五!《25_继承和权限控制_2》
继承用extends
六!《25_继承和权限控制_2》
无protect,private,public,什么都不写,就是default(包权限:同一个包的default成员可以互访).
七!《26_重写》overrride.双写r.。复制父类函数名那一行中,仅仅函数体做些修改不同。
区别:重载overload.
八!《27_super关键字》
在Java中,this通常指当前对象,super则指父类的。
九!《28_继承中的构造方法_1》
十!《33_JDK_API文档查询》
十一!《34_Object类之toString方法》
Object类 为 老祖宗。
finalize()虚构函数,释放空间。
getclass()拿到编译好的class文件。
hashcode()便于定位。
toString继承下的实现不好,一般要重写override,
十二!《35_hashcode解释》
用表记录对象的位置,
十三!《36_Object类之equals方法》
.表示classpath的当前路径,要写在最前面。
十四!《36_Object类之equals方法》
System.out.println ( obj1 == obj2 ) 是比较内存地址,一定为false.
只有obj1 和obj2指向同一对象obj3,才为true.
一般要重写equals方法,举例:
public boolean equals(Object obj) {
if(obj == null) return false;
else {
if(obj instanceof Cat) {
Cat c = (Cat)obj; //强制类型转换
if( 新建对象c.属性1 == this. 属性1&&新建对象c. 属性2== this. 属性2) {
return true;
}
}
}
return false;
}
没引入其他包,则必定默认引入了java. lang的包。
十五!《37_对象转型_1》 casting.相似于:强制类型转换。
举例:
Animal animalObj = new Animal;
animalObj = new Dog ; //基类对象强制转换为子类对象,可调子类对象的成员。
animalObj instanceof Animal 为 true;此为upcasting且只能调基类的方法。.
十五!《39_多态_1》
“多态”也称“动态绑定”,基类引用指向子类对象。
《41_抽象类》 abstract class Animal { 抽象方法; }
《42_final关键字》相当于C++的constant.只读不能写。
如math类,只读不能写
《43_interface_1》
《44_interface_2》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
一个类可以实现多个接口,但类与接口之间不可以相互继承,
class GoldenMonkey extends Animal implements Valuable, Protectable {
类之间可以相互继承,
接口之间可以相互继承,
《45_总结》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
尚学堂科技_马士兵_J2SE_5.0_第04章_异常处理。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
《01_异常的概念_1》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
C/C++不检查数组下标越界,但java检查数组下标越界,
try {
System.out.println(2/0);
} catch (ArithmeticException e) { //Arithmetic算法 e或err都行
System.out.println("错误信息已上报");
e.printStackTrace(); //打印错误堆栈
}
《03_异常的分类》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
若出错throw.则必须try,,catch..
先抓小异常1,再抓大异常2。
《06_声明方法抛出的异常》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
void main ( string[ ] args) throws Exception {函数体} //函数名旁写throws Exception不好
应写try..catch..
《07_异常的其他问题》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
《尚学堂科技_马士兵_J2SE_5.0_第06章_常用类》。。有库函数,要听或查API。。。。。。。。。。。
《11_递归列出目录结构》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
files库函数listFiles():返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
public class FileList {
public static void main(String[] args) {
File f = new File("d:/A");
System.out.println(f.getName());
tree(f, 1);
}
private static void tree(File f, int level) {
String preStr = "";
for(int i=0; i<level; i++) {
preStr += " ";
}
File[] childs = f.listFiles(); //listFiles()库函数
for(int i=0; i<childs.length; i++) {
System.out.println(preStr + childs[i].getName());//按层次level打印前导空格
if(childs[i].isDirectory()) { //过滤条件:是否是一个目录。
tree(childs[i], level + 1);
}
}
}
}
《12_enum》。。。。枚举类型。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
public enum MyColor { red, green, blue }; //定义新的类型MyColor(相当于int),
MyColor m = MyColor .red; //那MyColor定义变量只能取red, green, blue三值。
//类名.静态变量
《13_总结》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
Math.random()是产生一个[0,1)之间的随机数,
《尚学堂科技_马士兵_J2SE_5.0_第07章_容器》。。1。1。3。6。。。。。。。。。。。。。。
1个图,1个类collections,3个知识点,6个接口。
区分:接口collection单数。
《01_容器API_Collection_1》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
1个图
《02_Collection_2》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
一! public int hashCode() {
return firstName.hashCode();
}
重写equals 必须重写hascode:原因:先找位置,再比较值是否同,高效。
如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。
初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。
这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它将要放置的物理位置上。
如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;
如果这个位置上已经有元素了, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。
所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
所以,Java对于eqauls方法和hashCode方法是这样规定的:
1、如果两个对象相同,那么它们的hashCode值一定要相同;2、如果两个对象的hashCode相同,它们并不一定相同 上面说的对象相同指的是用eqauls方法比较。
你当然可以不按要求去做了,但你会发现,相同的对象可以出现在Set集合中。同时,增加新元素的效率会大大下降。hashcode这个方法是用来鉴定2个对象是否相等的。 那你会说,不是还有equals这个方法吗? 不错,这2个方法都是用来判断2个对象是否相等的。但是他们是有区别的。 一般来讲,equals这个方法是给用户调用的,如果你想判断2个对象是否相等,你可以重写equals方法,然后在代码中调用,就可以判断他们是否相等 了。简单来讲,equals方法主要是用来判断从表面上看或者从内容上看,2个对象是不是相等。举个例子,有个学生类,属性只有姓名和性别,那么我们可以 认为只要姓名和性别相等,那么就说这2个对象是相等的。 hashcode方法一般用户不会去调用,比如在hashmap中,由于key是不可以重复的,他在判断key是不是重复的时候就判断了hashcode 这个方法,而且也用到了equals方法。这里不可以重复是说equals和hashcode只要有一个不等就可以了!所以简单来讲,hashcode相 当于是一个对象的编码,就好像文件中的md5,他和equals不同就在于他返回的是int型的,比较起来不直观。我们一般在覆盖equals的同时也要 覆盖hashcode,让他们的逻辑一致。举个例子,还是刚刚的例子,如果姓名和性别相等就算2个对象相等的话,那么hashcode的方法也要返回姓名 的hashcode值加上性别的hashcode值,这样从逻辑上,他们就一致了。
要从物理上判断2个对象是否相等,用==就可以了。
二!
return super.equals(obj); //交给父类处理
public boolean equals(Object obj) {
if(obj instanceof Name) { //obj也可能是Name 子类的实例
Name name = (Name)Obj; // 为了程序的严密性,要把Obj强制转化为Name类return(firstName.equals(name.firstName))&&(lastName.equals(name.lastName));
}
return super.equals(obj);
}
obj 是Name 的一个实例,但是这个实例也可能是Name 子类的实例,这样obj instanceof Name 的返回值也是true ,所以为了程序的严密性,要把Obj强制转化为Name类,因此Name name = (Name)Obj; 是防止obj 是Name的子类
《03_Collection_3》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
重写equals 必须重写hascode:原因:先找位置,再比较值是否同,高效。
《05_Iterator》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
举例:
Iterator i=CollectionObj.iterator( ); //返回Iterator接口对象
while ( i.hasNext() ) {。。操作。。} //先判断,再操作。
《06_EnhancedFor_and_Set》。。。。。。。。。。。。。。。。
一!JDK1.5以后增强for循环,除了简单遍历,不用,可读性差
for(Object o : c) { //将对象c逐个装入对象o中
System.out.println(o); //操作
}
二!set举例
《07_List_and_Collections》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
一!。。listObj.remove(1); //去掉listObj数组中的下标为1的元素。即第二个元素。
二!。。1个类collections,区分:接口collection单数。
《08_Comparable》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
collections.sort ( listObj ); //排序
《09_Map_1》。。。。。。。。。。。。。。。。。。。Map接口。。。。。。。。。。。。。。。。。。。。。。。。、
ArrayList读快改慢,读--内存地址连着的,
linkedList改快读慢,改--挂链即可,
《10_Auto_Boxing_Unboxing》。自动打包,解包。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
Map m1 = new HashMap();
m1.put("one", 1);第一个参数是key ,第二个参数是value,
打包:将基本数据类型转换为对象,相当于m1.put("one",new Integer(1));
int i = (Integer)m1.get("two");解包:将对象转换为基本数据类型,需要强制类型转换。
《13_泛型_1》。。。。。。Generic。。。。。。。。。。。。
List<String> c = new ArrayList<String>(); //只能装String类型的ArrayList—c
看API文档,有尖括号< E或T>就可以指定类型,即泛型。
在定义集合的同时指定集合中对象的类型。
《14_泛型_2》。。。。。。Generic。。。。。。。。。。。。
Map<String, Integer> m1 = new HashMap<String , Integer>();//查API文档Map<K,V>
《15_总结》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
《尚学堂科技_马士兵_J2SE_5.0_第08章_IO》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
《01_IO初步》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
4根管道,
站在程序角度上,谈输入/输出,
字符流,2字节,utf-16,
buffer..缓冲区,减少对硬盘的使用,
先缓冲到目的地flush( ),再关闭管道close( ).
《02_FileInputStream_FileOutputStream》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
一个撇/ 或两个捺:\\设置java程序里文件路径。
in.read( )=-1;读到文件结尾。
<03_FileReader_FileWriter>。。。。。。。。。。。。。。。。。。。。。。
无
《04_BufferedIO》。。。。。。。。。。。。。。。。。。。。。
ASCIN码:回车13。.换行10。
readline一行一行得读。
《05_IO_faq》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
无
《06_TransformIO》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
OutputStreamWriter:是Writer的子类,
将输出的字符流变为字节流,即将一个字符流的输出对象变为字节流输出对象。
UTF-8 (8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。
《07_DataIO_and_ByteArrayIO》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
转成字符串,string.valueof
《08_PrintIO》。。输出流。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
一!
if(ps != null){
System.setOut(ps);// System. Out本来是黑dos窗口,但重设成了文件的引用,将会被打印到该文件中。
}
二!log4J日志开发包。
log.println("==="+new Date()+"===");//打印日志文件日期。
《09_ObjectIO》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
三!
FileInputStream fis = new FileInputStream("d:/testobjectio.dat");
ObjectInputStream ois = new ObjectInputStream( fis );//直接存入对象。
transient int k = 15;//不往硬盘存,被忽略的成员变量,当程序运行后都是0,或者Null。
《10_总结》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
API 查java.io包serializable序列化:
extendSerializable自己实现序列化。
《尚学堂科技_马士兵_J2SE_5.0_第09章_线程》。。。。。。。。。。。。。。。
《01_线程的基本概念》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
线程:一个程序里的不同的执行路径,
目前,java只有一个执行路径,即一个线程,main函数为主线程,即通常说的进程,
windows,linux.unix多线程,多进程。但单核CPU在一个时间点上,只执行一个进程,第一个时间片执行进程A,第二个时间片执行进程B,只是时间太快,看不出来间断,
多核CPU在一个时间点上,能执行多个进程,
《02_Sleep方法》。。。。。。。。。。。。。
只要能实现接口implements,就不要从thread类继承extends,
wait()、 notify()、notifyAll()线程同步时讲。
Thread.sleep(10000);} //线程休眠1000毫秒,
《03_Join_Yield_Priority》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
super (s),调父类的构造方法,
join合并进程,例:t1.join();相当于调用t1线程,
yield让出cpu一次,执行其他线程,
Priority 优先级
t1.setPriority(Thread.NORM_PRIORITY + 3); //将t1线程优先级设置提高3级。
《04_举例》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
无
《05_线程同步_1》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
2个线程访问同一份资源时,先访的线程,独占资源,其他线程不能访问。
《06_线程同步_2》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
synchronized (this) { 函数体} \\锁定当前线程
public synchronized void add(String name){函数体} //执行函数add过程中,当前对象被锁定。如果另一线程想访问该对象,只能等该函数执行完。
《07_线程同步_3》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
系统级的程序,才会死锁。
《08_线程同步_4》。。。。。。。。。。。。。。。。。。。。。。。。。。。
讲解了笔试题,public synchronized void add(String name){ a=1,函数体}
//只死a=1以后的代码,但内存中a已经改成了1.
《09_线程同步_5》。。。。。。。。。。。。。。。。。。。。。。。。。
要对所有的方法考虑是否加同步,
加同步:效率变低,
不加同步:数据不一致,
写的加synchronized,
读的不加synchronized,
《10_线程同步_6》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
重新解释,《09_线程同步_5》的例子。
《11_线程同步_7_生产者消费者问题》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
先写:Wotou馒头类, SyncStack篮子类(加馒头push方法,拿馒头pop方法,),
再写:生产者Producer,消费者Consumer类,
最后写:有main函数的ProducerConsumer类,
public class ProducerConsumer {
public static void main(String[] args) {
SyncStack ss = new SyncStack();
Producer p = new Producer(ss);
Consumer c = new Consumer(ss);
new Thread(p).start();//1号生产者
new Thread(p).start();//2号生产者
new Thread(p).start();//3号生产者
new Thread(c).start();//1号消费者
}
}
SyncStack篮子类中加馒头实现如下:
public synchronized void push(WoTou wt) {
while(index == arrWT.length) { //篮子满了
try {
this.wait();//被锁的当前对象的线程的等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notifyAll();//叫醒wait在当前对象上的所有线程,notify()一个线程
arrWT[index] = wt;
index ++;
}
《12_总结》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
wait()是object类的方法,解开锁,
sleep()是Thread类的方法,睡觉时也抱着锁,
《尚学堂科技_马士兵_J2SE_5.0_第10章_网络》。。。。。。。。。。。。。。。。。。。。。。。
《01_网络基础_IP_TCP_UDP》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
例如:网络协议,理论知识,分层。
《02_TCP_Socket_1》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
一!“网络编程“称socket 编程.
每一个终端 称为 一个socket。
端口号:区分同一台机器,不同的应用程序。用户:用1024--65535的。
TCP端口,UTP端口,是分开的。都有65536个。
二!import java.net.*包在jdk的jar中,无需再拷到代码文件夹中,
java.net包中有类Socket和ServerSocket.
三!举例:TCPServer.java和TCPClient.java
写代码时,两个一起边写边测试。要开两个CMD窗口。首先启动Server,再启动Client,
四!一个端口只能启动一个server,可以有多个Client的CMD窗口,
五!accept(),readUTF()阻塞式,若无消息,就会死等。
《03_TCP_Socket_2》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
一!server,client一端先写,另一端读,不能同时写或读,会死等,阻塞。
二!while (true) {。。。 } //服务器不断运行
三!getInetAddress()拿到的IP地址,
“更具体的InetSocketAddress”是“SocketAddress”的实现子类,
四!ServerSocket s = new ServerSocket(8888);//服务器的端口为8888,客户端端口未知,
《04_TCP_Socket_3》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
讲了一个学生的做的聊天系统(一句一句聊),
《05_UDP_1》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
一! UDP不区分客户端和服务器,
二! new InetSocketAddress("127.0.0.1", 5678) //无连接的UDP的包必须指明目的地址。
三!DatagramSocket ds = new DatagramSocket(9999);//client端口为9999,向server端口5678发数据。
《06_UDP_2》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
一!将long类型数转化为字节数组ByteArray.的意义,
《07_UDP_3》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
《07_总结》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
一!00:02:22有UDP和TCP的用法步骤。
《尚学堂科技_马士兵_J2SE_5.0_第11章_GUI》。graphic user interface图形化用户界面。。。
《01_GUI_初步_Frame_and_Panel_1》。。。。。。。。。。。。。。。。。。。。。。。。。。。
AWT旧的开发包,swing为新包,前面加J如:JFrame,
Frame f = new Frame("My First Test");
f.setLocation(300, 300);//设置窗口出现时,左上角 屏幕坐标的位置
《02_GUI_初步_Frame_and_Panel_2》。。。。。。。。。。。。。。。。。。。。。。。。。。。
一!MyFrame(int x,int y,int w,int h,Color color ) // extends可以创建自己的成员变量,创建对象比new更好,
左上角坐标,宽,高,颜色
二!f.setBackground(new Color(0,0,102));// 红、绿、蓝
三!frameObj.setBounds(80,80,80,80);// frame相对于屏幕的边界。
frameObj.add(panelObj); //panel加入frame中
panelObj.setBounds(50,50,50,50);// (嵌板) panel装在谁里面,就相对于谁的边界。
《03_布局管理器_1》。。。。。。。。。。。。。。。。。。。。。。。。。。。
一!FlowLayout——流布局,默认居中,
f.setLayout (new FlowLayout(FlowLayout.LEFT));// f中的元素靠左边界
《04_布局管理器_2》。。。。。。。。。。。。。。。。。。。。。。。。。。。
一!FlowLayout FL= new FlowLayout(FlowLayout.CENTER, 20, 40);
// FL中元素水平间距20,垂直间距40.
f.setLayout(FL); //把FL设置为f的布局管理器,
二!BorderLayout是Frame类默认的布局管理器,
FlowLayout是panel类默认的布局管理器,
三!BorderLayout:默认添加到中间center.
四!
f = new Frame("Border Layout");
Button bn = new Button("BN"); //按钮名字显示为"BN"
f.add(bn, BorderLayout.NORTH);或f.add(bn, "North");
更详细,
f.pack();//依据你放置的组件设定窗口的大小,使之正好能容纳你放置的所有组件.
五!
GridLayout将frame分成指定的行数和列数。
f.setLayout (new GridLayout(3,2));
《05_布局管理器_3》。。。。。。。。。。。。。。。。。。。。。。。。。。。
例子,
《06_事件模型_ActionEvent》。。。。。。。。。。。。。。。。。。。。。。。。。。。
想监听某件事,就要实现接口,bn为botton,bm为botton monitor
《07_ ActionEvent _2》。。。。。。。。。。。。。。。。。。。。。。。。。。。
Button b1 = new Button("Start");
b1.addActionListener(bh);
b2.setActionCommand("game over");//b1没有设置setActionCommand,则默认为名字Start.
e.getActionCommand();//getActionCommand知道是被哪个按钮按下的,
《08_TextField_ActionEvent_1》。。。。。。。。。。。。。。。。。。。。。。。。。。。
输入框TextFiled,设置输入框的回显字符为星tf.setEchoChar('*');如密码框。
class TFActionListener implements ActionListener //实现监听器接口
{
public void actionPerformed(ActionEvent e) //某事件发生,接口里所有的方法都是公有的,
{
TextField tf = (TextField)e.getSource();//获得事件源,就获得事件的值
System.out.println(tf.getText());//cmd窗口打印出tf输入值,
tf.setText("");//输入框按enter键后,tf变成空
}
}
《09_持有对方引用》。。。。。。。。。。。。。。。。。。。。。。。。。。。
举例:实现加法器,按等号,得出和。
btnEqual.addActionListener ( new MyMonitor(this) );//给等号增加监听器MyMonitor(),
class MyMonitor implements ActionListener {
TFFrame tf = null;
public MyMonitor(TFFrame tf) { //把整个tf引用传入监听器中,就知道num1. num2的值。
如果不这样,按下“等号”按钮,取不到num1. num2的值。
this.tf = tf;
}
public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(tf.num1.getText());//输入的数为字符串,相加要转换成int
int n2 = Integer.parseInt(tf.num2.getText());
tf.num3.setText("" + (n1+n2));
}
}
门面模式,大管家是tf,负责n1,n2,num3的交互,n1,n2,num3之间不用交互。
《10_内部类》。。。可以访问包装类的成员。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
btnEqual.addActionListener ( new MyMonitor() );//给等号增加监听器MyMonitor(),
/*把下面的MyMonitor类定义在 TFFrame类的内部,就知道num1. num2的值。*/
private class MyMonitor implements ActionListener { //实现监听器接口
public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(num1.getText());//输入的数为字符串,相加要转换成int。
int n2 = Integer.parseInt(num2.getText());
num3.setText("" + (n1+n2)); //结果框显示和。
}
}
目录下生成了TFFrame$MyMonitor.class,$因为有内部类,
《11_Paint_方法》。。要画图,重写paint方法。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
每次重写paint方法时,自动调用paint方法。
public void paint(Graphics g) { // java包定义的Graphics类,程序员不管
Color c = g.getColor();//拿到画笔的颜色
g.setColor(Color.red); //设置画笔的颜色为红色
g.fillOval(50, 50, 30, 30); //fill实心椭圆,drawOval空心椭圆
//50,50左上角坐标,宽度,高度
g.setColor(c);//设回使用前的颜色
}
paint是系统回调函数,用户不能主动调用,需要进行重绘时,要使用repaint方法,当用户调用repaint方法后,实际上,系统后台调用了paint方法,所以,你的问题,要画一条直线,或者清除一条直线,那么你的绘制代码或清除代码要写到paint方法中,然后需要绘制或清除的时候,调用repaint方法,就可以了
《12_Adapter_and_repaint》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
一!drawline为abstract方法,但能调用,因为有多态。
二!MouseAdapter鼠标适配器,实现了MouseListener,,可查API文档,
class Monitor extends MouseAdapter {// Monitor继承MouseAdapter只需重写某些方法,实现MouseListener要写全部方法,复杂。
public void mousePressed(MouseEvent e) {//鼠标按下时调用绘图
MyFrame f = (MyFrame)e.getSource();//事件源为f
f.addPoint(new Point(e.getX(),e.getY()));
f.repaint();//重绘,调用顺序repaint-update-paint,
}
}
《13_WindowEvent_and_匿名类》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
打叉,关窗口,TestWindowClose.java
this.addWindowListener( //方法中写匿名类当成形参
new WindowAdapter() { //匿名类,当成接口来使用,
public void windowClosing(WindowEvent e) {
setVisible(false); //不可见
System.exit(-1);//-1非正常退出,0正常退出
}
} ) ;
《14_KeyEvent_1》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
各种Event,对应各种Llistener, 对应各种Adapter,
MouseEvent---- mouseLlistener
WindowEvent--- windowLlistener
KeyEvent----------KeyLlistener
《15_KeyEvent_2》。。。。。。。。。。。。。。。TestKey.java。。。。。。。。。。。。。。。
实现向上,向下键
查API,查到KeyListener接口,--发现要写3个method,keyPressed(KeyEvent e) (按下)
keyReleased(KeyEvent e) (弹起)
keyTyped(KeyEvent e) (敲击)
三个方法implement麻烦,查到有KeyAdapter类,只要从KeyAdapter继承,然后重写某方法,
class MyKeyMonitor extends KeyAdapter {
public void keyPressed(KeyEvent e) { //事件的信息在KeyEvent中,查APIKeyEvent,
int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_UP) { // VK:虚拟键virtual Key。
System.out.println("UP");
}
if(keyCode == KeyEvent. VK_DOWN) {
System.out.println("DOWN ");
}
}
}
《16_j2se_总结》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
无,
《17_eclipse_start》。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
无,
j2se总结
接下来又讲了面向对象,这里最最重要的是面向对象的思想,什么样是面向对象的思想编程?按照老师的说法就是,编程就是解决问题,而解决一个问题要处理的三个方面就是,有哪些类,类中有哪些方法和属性,类之间的关系,这就是面向对象编程思想,说的是简单,不过真正的思想需要我们慢慢来培养。面向对象这部分还根据面向对象的特性(封装,继承,多态)讲了很多应用。都是最基本的应用。
接下来,基本上都是讲解了一些基本类的应用了,其中有异常处理,容器,GUI,IO流,网络编程,多线程,等,当然这里大部分都是讲解的类的使用,个人认为更应该去多看看API文档。