Java学习笔记马士兵老师视频教学的笔记.docx
《Java学习笔记马士兵老师视频教学的笔记.docx》由会员分享,可在线阅读,更多相关《Java学习笔记马士兵老师视频教学的笔记.docx(19页珍藏版)》请在冰点文库上搜索。
Java学习笔记马士兵老师视频教学的笔记
Java学习笔记
学习Java首先要配置环境变量,在电脑属性的高级中,点击环境变量,classpath中有一英文句号“.”后跟一个分号,表示当前路径的意思。
由第一个程序Helloworld为例说明Java的基本运行代码:
publicclassHelloWorld{
publicstaticvoidmain(Stringargs[]){
System.out.println("Hello,World!
");
}
}
在Java中只能允许有一个公共类,此区别于C++。
还有Java的写作风格与C和C++有很大区别。
下面细谈Java的基本语法,与其他语言类似,Java每一条语句都以“;”结束。
1.shortbytechar之间不会自动转换,他们运算时首先转换为int然后进行运算;boolean不会进行转换;如:
byteb1;byteb2;
byteb3=byte(b1+b2);b1+b2运算后是int类型,可以
bytea=1;//可以把数值直接赋值不超范围,(-128~127)
floatf1=1.234f;longl1=300000000L;f和L一定加上;
2.System.out.println();//输出后换行
System.out.print();//输出后不换行
&&和&的区别:
表达式1&&表达式2只要表达式1错误,后不再计算,表达式1&表达式2就算表达式1错误表达式2也会计算。
+既可以作为加号,也可以作为连接符,即左右都是字符串,当有一个是字符串,系统默认把另一个转化为字符串再处理。
例如:
System.out.println(“c=”+c);打印时,无论任何类型,都先转换为字符型,再进行打印。
3.聚合关系,就是包含关系,实现关系就像虚基类,在派生类中实现。
4.定义成员变量可以初始化,若不则自动初始化(可以直接在成员变量的定义时初始化);但局部变量一定要自己初始化,boolean类型默认为false,其他默认为0;在main中调用函数时,只要定义了构造函数并且初始化,就一定要把实参的值写到函数里,不能少参数。
因为所有数值定义后都有默认值,所以一定要初始化如:
intx;x默认为0;但是如果都不写初始值,调用函数可以不用参数。
5.String关键字是字符串定义,不是字符如:
(Stringname=“fgsdhj”//也不用写name[]);必须使用new来创建对象
6.静态数据成员static:
在类体(Car)中定义的时候privatestaticintsid=0;……在以后的publicstaticvoidmain()中可以通过Car.sid;或者Carmm;mm.sid;访问
7.import与packagepackage位于程序开始如packagecom.bjsxt.java140;并把生成相应的类放到相应的子目录下即新建文件<在原来类的目录下新建>com\\bjsxt\\java140,把类的.class文件放在该目录下,就是打包了,在jdk1.5以后类的.java文件可能也会影响,所以把.java删掉。
在以后的类中调用时可以com.bjsxt.java140.类名=new类名();或者用引入:
importcom.bjsxt.java140.类名;或者importcom.bjsxt.java140.*<包括该目录下所有类>
8.在要打包的上一层文件目录E:
\java\test2\jar–cvftest2.jar就能把test2目录下所有文件打包成.jar文件即windows下的压缩包。
9.继承权限:
用关键字extends.有privateprotecteddefault<包权限>public而private继承继承之后也没有使用权,只有在定义private的类中才可以使用;
10.函数重写必须遵循函数名一样,参数类型,返回类型,也必须一致,并在重写的函数体中增加相应的代码,不是重载;重写的函数不能比被重写的函数有更严格的访问权限,至少一样。
11.子类的构造方法中必须对基类的构造函数声明,在子类的构造函数中首先写super();里面加参数,意思是调用基类的构造函数,若不写,系统默认调用基类无参数的构造函数,若基类中没有无参数的构造函数,则编译出错;
12.在构造函数中,前面可以加public也可以不加;在类与类之间“;”可加可不加,编译不会出错。
在构造函数的入口参数设置是一定注意,与上面的初始化保持一致就好。
13.object类的定义,了解一下,其中有一个方法,toString方法是返回一个说明该类的说明,在API文档中查找,建议重写。
关于object中,equals方法返回值是boolean,可以重写,publicbooleanequals(objectobj){}内容自定义;在main()中:
System.out.println(c==a);或者System.out.println(a.equals(c));一样用;字符串比较也一样,且不为空才行。
14.对象类型转换,如Animala=newAnimal();Catc=newCat();System.out.println(cinstanceofa)//输出true;也可以这样a=newCat();//基类强制转化为子类,可以,只是a不能访问Cat类中新定义的类型。
可以这样访问新定义的类型。
Catd=(Cat)a;//用强制类型转化基类为子类,然后转化后一样用。
//e:
\java\test2\TestTeacher\TestTeacher.java
15.关于多态,一定要有继承,要有重写,要有父类指向子类的引用。
动态联编的实现是为了以后程序功能的扩展,而不改变源代码.//e:
\java\teat2\Testdongtai\TestLady.java
16.抽象类:
若一个类中含有抽象和方法,则一定要把给类定义为抽象类,抽象abstract类似于C++中的纯虚函数。
Publicabstractvoidenjoy();就没有{}内部代码了。
而且子类中的重写父类的那个方法一定要有实现代码,否则报错。
也可以再次把该函数声明为抽象类,这样编译不会出错。
但是就不能用该子类定义新对象,因为抽象类是残缺的。
17.final关键字中final的变量不能被改变,final的方法不能被重写,final的类不能被继承。
PublicfinalclassString(){}//写法如下finalinti=9;
18.interface接口设置,即为C++中的多重继承只是接口继承的时候不用关键字extends而用implements可以用implementsA,B,C,D{}这是与extends不同地方。
在子类中分别实现积累的代码,原基类就像抽象类一样,其函数的设置在子类中实现的。
在本例中还涉及强制类型转换,可见性与不可见性的问题,还涉及动态联编。
从本质上讲接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
//e:
\java\test2\Testjiekou\TestInterface.java
19.Java中关于异常处理机制,trythrowcatch
其中经常使用catch(ArithmeticExceptione){
System.out.println("系统正在维护,请与管理员联系");
e.printStackTrace();//其中e就像一个类的对象一样使用,e.printStackTrace();是打印出错的堆栈信息,以便修正。
ArithmeticException和printStackTrace()是系统自己定义的。
20.finally{}是一定执行的语句,catch语句之后自动停止,以后不再执行。
对所有异常处理,可以直接抛出throwsException{}不管是IoException或是NotFoundFileException……;不想处理就继续抛出。
方法重写必须与原来的抛出的异常一致,不得是别的。
但是不抛异常没有关系。
Finally语句进行资源清除工作。
21.数组定义,也是引用,int[]s,或是ints[];只是中括号内不能有数字,区别于c++;如:
int[]a;//声明数组名字数组声明时不能指明长度
a=newint[5];//动态分配空间在动态分布空间之后,a.length自动记录数组的长度,以后可以直接调用。
22.ipconfig在命令行可以显示ip地址,ipconfig-all可以显示更详细的信息;
23.在main函数中,(String[]args)的作用是把在命令行执行时加的参数自动保存在agrs数组里面;补充:
在基本数据类型里面,可以通过double.parsedouble()把一个字符类型的变量转化为double类型。
其他类型类似,比如intfloatbyte。
。
。
。
。
。
直接把’3’转化为3
24.函数返回值类型可以是数组类型,publicstaticDate[]bubblesort(Datea){……returna;}这样也是可以实现的。
25.二位数组定义,初始化时,inta[3][2]={{1,2},{2,3},{23,1}};
是错误的,不能写3,java自动检查长度。
26.关于string,有很多种方法,就关于字符串的种种处理,大小写处理,空格处理(trim),截取字符,把字符分割成子串(split),查找API文档。
Stringbuffer是可变的字符序列,与不可变的string相比,更加具有优势,方法与其类似,在执行效率上比较高。
27.d[i][j]=Double.valueOf(sSecond[j]);把字符串转化为double类型的数据,调用double的方法,在前面加上Double.一定不要少。
包括二维数组的定义使用,把两维分开来写。
//E:
/java/test6/ArrayParser.java
28.Math类java.lang.math与数学相关的一些方法,File与文件相关的方法,java.io.*;
文件的创建,File(Stringparent,Stringchild)parent代表路径,而child是要创建的文件名称。
f.getParentFile().mkdirs();//只是把对应的目录创建成功文件并没有生成。
//e:
/java/test6/TestFile.java
29.枚举类型规定只能取规定的值,其余的不允许取值,在游戏开发时多用,如:
publicenummycolour{red,green,blue};
mycolourm=mycolour.red;访问时类似于静态成员变量的访问。
可以提前发现错误,在编译时发现。
容器:
30.List
与SetMap:
(都是接口)
Set的数据对象是没有顺序不可重复的,即重复的元素不会被加入集合。
//e:
\java\test7\TestSet.java
List的数据对象是有顺序可以重复的,自增了一些方法,见API。
Map是把数据成对成对地装入容器。
Put方法是object的原因是当放入的key已经存在时,原来的value被替换掉,作为返回值返回。
Get方法返回的是value.
//e:
\java\tets7\TestMap.java
31.iterator是collection的一个接口,其作用是容器的遍历,其方法有hasNext,next,remove具体用法是
Iteratori=c.iterator();//c为Collectionc=newHashSet();
然后i就可以调用Iterator的方法了。
Iterator的remove方法是迭代过程中删除元素的唯一安全的方法。
而不是c.remove。
//e:
\java\test7\collection.java
32.Collections类封装了List许多静态的方法。
调用的时候,因为是静态的方法,所以直接用类名加方法就行,如Collections.sort(l1);l1为List的容器从低到高排序
//e:
\java\test7\TestList.java
33.(补充)
privatestaticfinalintone=1;//关键字的顺序
关于args在运行java。
。
。
。
。
。
。
命令时,在后面加上数字字母。
。
。
就是加在agrs数组中。
数组的args的长度args.length没有括号
六个基本类型Byte,Double,Float,Integer,Long,Short
Integer是int的包装类其目的是方便各种数据的转换,如
intnum=Integer.valueOf(“12”);
doublenum2=Double.valueOf(“12.2”);
//通过基本包装数据类型的valueOf和parseXX实现String转换为XX
Stringa=String.valueOf(“1234”);
Stringb=String.valueOf(true);
Stringc=newInteger(12).toString();
//通过包装类的toString也可以
34.泛型写法:
Mapm1=newHashMap();具体使用方法见java文件以后用集合的时候尽量使用泛型
//E:
\java\test7\TestMap2.java
//e:
\java\test7\BasicGeneric.java(使用Iterator时使用泛型)
IO:
35.
InputStreamOutputStreamReaderWriter都是抽象类不能直接new也就是实例化,其具体的实类为FileInputStreamFileOutputStreamFileReaderFileWriter,字节流是一个字节一个字节读写字符流可以写汉字(一个字符两个字节)。
InputStream方法:
//e:
\\java\\test8\\TestFileInputStream.java
OutputStream方法:
ReaderWriter类似。
//E:
\\java\\test8\\TestFileOutputStream.java
<补充:
GBK是中文windows默认的字符编码1310是回车符的ASIC码>
36.BUffeedrStream:
BufferedReaderBufferedWriterBufferedInputStream
BufferedOutputStream提供缓冲区
支持父类的mark与reset方法,不太常用mark是标记位置从标记的地方开始读写,reset是重置,即是读写后再次回到标记的位置。
BufferedReader提供了readLine方法用于读取一行字符串。
在输出readLine的内容的时候用println(),好像readLine不读取换行符。
BufferedWriter提供了newLine方法写入一个行分隔符。
//e:
\\java\\test8\\TestBufferedStream.java
37.TransformIO
包括OutputStreamWriter与InputStreamReader意思是把字节型的流转化为字符型的流。
方法与前面类似。
补充FileOutputStream的构造方法FileOutputStream(Stringstr,true)的意思是在打开的文件追加内容而不是覆盖。
OutputStreamWriter在API文档中没有找到可以直接写的方法voidwrite(Stringstr)但是可以这样用。
//e:
\\java\\test8\\TestOutputWriter.java
InputStreamReader
InputStreamReaderisr=newInputStreamReader(System.in);
BufferedReaderbr=newBufferedReader(isr);System.in本身就是FileStream类型的。
这是写了两个处理流,System.in的意思是标准的输入,在命令行中输入内容。
//e:
\\java\\test8\\TestInputReader.java
38.DataIO
ByteArrayOutputStreambaos=newByteArrayOutputStream();
有两个作用一是在内存中分配字节数组,二是将OutputStream的管道接到字节数组中。
ByteArrayInputStreambais=newByteArrayInputStream(baos.toByteArray());
ByteArrayInputStream的构造方法传的参数一定是字节数组。
baos.toByteArray(),就是通过管道接口转化的字节数组。
另外字节数组的遵循队列原则先进先读直接调用writeDouble,readDouble方法就可以实现。
//e:
\\java\\test8\\TestDataIO.java
要是发送一个long类型的数,需要ByteArrayOutoutStream和DataOutputStream包装转化同时服务器也要ByteArrayInputStream与DataInputStream
在网络游戏中发送位置信息用的比较多。
39.PrintStream
FileOutputStreamfos=newFileOutputStream("e:
\\java\\123.txt",true);
PrintStreamps=newPrintStream(fos);
System.setOut(ps);//把命令行要显示的东西直接通过管道与文件链接,写进文件。
//e:
\\java\\test8\\TestPrintStream.java
BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));一定这样写因为BufferedReader的构造方法传的参数是Reader型的,所以要用InputStreamReader过渡一下,System.in是InputStream类的。
此例子是为了说明日志的作用,通过文件记录操作,并形成可以查阅的文档。
40.ObjectIO
ObjectOutputStream与ObjectInputStream是抽象类ObjectOutput与ObjectInput的实例化,传的参数一定是OutputStream与InputStram作用是把类序列化存盘。
把整个类的内存全部存盘,foo.writeObject(a);//foo是ObjectOutputStream,直接将管道接到文件上的。
a是类的对象。
读取的时候Tb=(T)ois.readObject();//readObject返回的是Object类要强制转化ois是ObjectInputStream。
transientbooleanc=true;//transient关键字是修饰的将不被参与序列化保持原来的默认值。
<补充>publicstaticvoidmain(String[]args)throwsException{}//异常可直接抛出不作处理
//e:
\\java\\test8\\TestObject.java
将要被序列化的类要继承Serializable接口,这个接口没有方法,只是用于标记这个类可以被序列化。
classTimplementsSerializable{}
Thread:
41.启动线程第一种方法:
实现Runnable接口emplementsRunnable{重写publicvoidrun()方法};在主线程中,new一个thread对象,Threada=newThread(参数是emplementsRunnable的类的对象);然后a.start();启动线程。
第二种方法:
继承Thread类,extendsThread{重写publicvoidrun()方法},在主线程中,用继承extendsThread的类new一个对象,调用start()方法即可。
在第一种方法的时候直接调用run的方法是不可以的,这样不是多线程,而是方法调用。
两种方法的选取,继承接口第一种比较灵活,因为继承Thread类不能再继承了,所以第一种更加好。
//e:
\\java\\test9\\TestThread1.java
42.线程控制基本方法:
sleep是Thread的静态法方法,传的参数是毫秒,在那个线程中,那个线程就进入睡眠状态。
可以如是调用Thread.sleep(1000)。
会抛出InterruptedException.在调用重写方法的时候要是想对异常不作处理想直接抛出,该方法不能抛出与该方法不同的异常。
调用interrupt方法可以打断线程。
//e:
\\java\\test9\\TestSleep.java
join方法是合并线程就是把单独运行的线程合并,只执行一个线程执行完之后再运行另一个,其本质类似于方法的调用,离开现场,保护现场,回复现场。
在一个时间点全部执行一个线程,执行完就返回到那个点,继续向下执行,就失去多线程的意义。
//e:
\\java\\test9\\TestJoin.java
yield是让出线程给别人执行,不会抛出异常。
到设定的时间点哪怕只执行一点点也会腾出空间给下一个线程执行。
//e:
\\java\\test9\\TestYield.java
优先级设置用过Thread类的方法setPriority();优先级分为10等级,默认为5,优先级越高获得执行的时间越长。
//e:
\\java\\test9\\TestPriority.java
43.线程同步:
publicsynchronizedvoidadd(Strings){
//synchronized(this){
num++;
try{
Thread.sleep
(1);
}catch(InterruptedExceptione){}
System.out.println(s+"is"+num+"timer");
//}//两种方式都可以自锁目的是只允许一个线程在运行
synchronized是关键字自锁的意思。
即是同一个资源在同一时间只能被一个线程访问,防止错误,比如银行系统扣费。