Java学习笔记.docx
- 文档编号:25395345
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:24
- 大小:196.87KB
Java学习笔记.docx
《Java学习笔记.docx》由会员分享,可在线阅读,更多相关《Java学习笔记.docx(24页珍藏版)》请在冰豆网上搜索。
Java学习笔记
接收用户输入的字符串
使用java.util.Scanner类
例:
Scannerinput=newScanner(System.in);
生成随机数
使用java.util.Random类实例生成随机数:
Randomrandom=newRandom();
k=random.nextInt(100);//0-100随机整数
定义数组
int[]a=newint[5];
inta[]=newint[5];
int[]a={1,2,3,4,5};
int[]a=newint[]{1,2,3,4,5};
int[][]a=newint[][]{{1,2},{3,4}}
如果每行的列数不同,则创建的是不规则的二维数组,如:
int[][]a=newint[][]{{1,2},{3,4,5}}
对数组进行排序
使用java.util.Arrays类sort方法
例:
Arrays.sort(a);
转换数组为字符串
使用java.util.Arrays类toString()静态方法
例:
Arrays.toString(a);
Foreach语句
for(intscore:
scores){
System.out.println(score);
}
继承的初始化顺序
父类属性初始化->父类构造方法->子类属性初始化->子类构造方法
子类的构造方法会默认隐式的调用父类的无参构造方法。
注意:
如果父类定义了一个有参的构造方法,系统将不自动生成无参方法,此时如果子类隐式调用将出错。
多态的类型
引用多态:
父类的引用可以指向本类或子类的对象。
Animalobj2=newDog();
方法多态:
如果父类引用指向子类对象,则调用的方法为子类的方法。
如:
如果Dog有一个Animal有的eat方法
obj2.eat();
注意:
如果Dog有一个Animal没有的watchDoor方法,则不能使用:
obj2.watchDoor();
引用类型转换
分为向上转换(隐式转换)和向下转换(显式转换),向下转换时引用的对象必须为相同子类对象的父类引用。
为防止出错,可以使用instanceof关键字进行类型判断,例如:
Animalobj=newDog();
if(objinstanceofCat){
Catcat=(Cat)obj;
cat.eat();
}else{
System.out.println("错误");
}
抽象类
抽象类中可以包含抽象方法,也可以包含普通方法。
抽象类一般不直接创建,而是用于定义引用变量。
publicabstractclassTelphone{
publicabstractvoidcall();
publicabstractvoidsms();
}
Telphonephone=newCellPhone();
phone.call();
接口
接口方法的访问修饰符不能是private和protected。
接口定义时可以加入abstract关键字,也可以不加(通常不加),如:
publicabstractinterfaceIPlayGames{
publicabstractvoidplayGames();
}
一个类可以实现多个接口,但最多只能继承一个父类。
publicclassSmartPhoneextendsTelphoneimplementsIPlayGames{
publicvoidplayGames(){
System.out.println("SmartPlay");
}
}
使用时类似于抽象类:
IPlayGamesip1=newSmartPhone();
ip1.playGames();
匿名内部类
匿名内部类经常配合接口使用,如:
IPlayGamesip3=newIPlayGames(){
publicvoidplayGames(){
System.out.println("OthersPlay");
}
};
ip3.playGames();
或
newIPlayGames(){
publicvoidplayGames(){
System.out.println("OthersPlay");
}
}.playGames();
异常的类型
所有的异常来源于Throwable类,该类有两个子类Error和Exception类,前者代表严重系统错误,后者代表常规异常。
我们主要处理Exception类。
Exception分为非检查异常(RuntimeException)和其他检查异常。
非检查异常如空指针异常(NullPointerException)、数组下标越界异常(ArrayIndexOutOfBoundsException)、类型转换异常(ClassCastException)和算术异常(ArithmeticException)等,这些异常都属于程序逻辑问题,可以从语法层面解决。
其他检查异常如IO异常、SQL异常,需要使用Try...Catch进行捕获处理。
创建字符串
方法1:
Stringa="abc";
方法2:
Stringa=newString("abc");
字符串的比较
多个相同的字符串常量会被自动分配到同一个堆内存区域,如:
Stringa="abc";
Stringb="abc";
System.out.println(a==b);//true
但是用new创建出来的,或者拼接出来的,每一块都是独立的区域。
Stringa=newString("abc");
Stringb=newString("abc");
System.out.println(a==b);//false
如果要比较字符串字面文字,必须使用equals()方法。
拆箱和装箱
为了让基本数据类型能够具有方法的特性,Java提供了各种数据类型包装类:
ByteIntegerLongFloatDouble...
基本类型和包装类之间可以使用自动拆箱/装箱,也可以手动拆箱/装箱,如:
inta=66;
Integerb=a;//自动装箱
Integerc=newInteger(a);//手动装箱
a=b;//自动拆箱
a=b.intValue();//手段拆箱
基本类型和字符串的转换
基本类型转换为字符串有三种方法:
1)使用包装类的toString()静态方法。
2)使用String类的valueOf()静态方法。
3)用一个空字符串加上基本类型。
将字符串转换成基本类型有两种方法:
1)调用包装类的parseXxx()静态方法。
2)调用包装类的valueOf()静态方法。
获取当前日期时间
可通过java.util.Date对象获取现在的时间。
Datenow=newDate();
日期时间与字符串的转换
如果要按指定格式将时间转换为字符串,可使用java.text.SimpleDateFormat类对象。
SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:
mm:
ss");
System.out.println(sdf.format(now));
如果要将字符串转换为时间,也可使用SimpleDateFormat类对象。
Strings="1990-02-0312:
01:
05";
SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:
mm:
ss");
Dated=sdf.parse(s);
使用Calendar类获取日期时间
Date类设计不合理,往往使用java.util.Calendar类代替其功能。
Calendarc=Calendar.getInstance();
可以使用get方法获取将当前年月日时分秒的整数。
intyear=c.get(Calendar.YEAR);
intmonth=c.get(Calendar.MONTH)+1;
intday=c.get(Calendar.DAY_OF_MONTH);
inthour=c.get(Calendar.HOUR_OF_DAY);
intminute=c.get(Calendar.MINUTE);
intsecond=c.get(Calendar.SECOND);
可以使用getTime()方法将Calendar对象转换为Date对象。
Datedate=c.getTime();
使用Math类操作数值
Math类中全部为静态方法,常用的如ramdom()、floor()、ceil()、round()等等。
intx=(int)(Math.random()*10);//生成10以内的随机数
集合的作用
用来装一系列的对象。
相比数值而言,集合的元素个数是可变的,且容易进行元素的查找和插入。
Java集合框架
Collection和Map接口是所有集合类的上级接口。
List接口及其ArrayList实现类
List(序列)是元素有序且可以重复的集合。
List可以精确控制元素的插入位置(add方法)并获取某个元素(get方法)。
注意:
当把某个对象存入集合中,都会被当做Object处理,取出时必须强制类型转换。
在List集合中添加元素
ListcoursesToSelect=newArrayList();
Coursecr1=newCourse("1","数据结构");
coursesToSelect.add(cr1);//也可指定添加位置如coursesToSelect.add(1,cr2);注意不能越界
也可以使用addAll插入整个List或数组,如:
Course[]course={newCourse("3","离散数学"),newCourse("4","汇编语言")};
coursesToSelect.addAll(Arrays.asList(course));//也可以添加位置参数加入指定位置
在List集合中遍历
有三种方法:
for+get()、迭代器、foreach。
1)for+get()形式
intcourseNum=coursesToSelect.size();
for(inti=0;i Coursetmp=(Course)coursesToSelect.get(i); System.out.println("课程: "+tmp.id+": "+tmp.name); } 2)迭代器形式 Iteratorit=coursesToSelect.iterator(); while(it.hasNext()){ Coursetmp=(Course)it.next(); System.out.println("课程: "+tmp.id+": "+tmp.name); } 3)foreach形式 for(Objectobj: coursesToSelect){ Coursetmp=(Course)obj; System.out.println("课程: "+tmp.id+": "+tmp.name); } 在List集合中修改与删除元素 修改元素使用set方法: coursesToSelect.set(2,newCourse("7","大学英语")); 删除元素有三种方法: 1)根据指定元素的引用删除 Coursetmp=(Course)coursesToSelect.get (1); coursesToSelect.remove(tmp); 2)根据指定元素下标删除 coursesToSelect.remove (2); 3)从一个List中删除另一个List的元素 ListcoursesRemove=newArrayList(); coursesRemove.add(coursesToSelect.get (1)); coursesRemove.add(coursesToSelect.get (2)); coursesToSelect.removeAll(coursesRemove); 泛型 泛型规定了某个集合中只能存放指定类型的元素,在取出元素时也可以不经过类型转换。 List 设置好泛型后,添加元素不能为Course以外的类型,在取出元素时不需要类型转换: for(Coursec: courses){ System.out.println(c.id+""+c.name); } 注意: 1)泛型可以添加指定类型的子类 2)如果设置基本类型为泛型元素,必须将包装类设置为泛型。 Set接口及其HashSet实现类 Set(集)是元素无序且不可以重复的集合。 具备与List相似的add()、size()、iterator()等方法,但是没有get()方法(因为没有顺序)。 Map接口及其HashMap实现类 Map提供了一种映射关系,元素是以key-value形式存储的,并可以根据key查找value。 Key值不可以重复,Value值可以重复。 Map支持泛型,形式如 在Map中添加元素使用put()方法,删除元素使用remove()方法。 可以使用keySet()方法获取key的Set集合,使用values()方法获取value的Collection集合,使用entrySet返回映射关系的Set集合。 HashMap元素是无序的。 HashMap的使用 键值对的添加和修改都使用put()方法: Map students.put("1",newStudent("1","小明")); 键值对的删除可以使用remove()方法: students.remove("1"); 键值对的遍历有两种方法: 1)可以使用keySet()方法配合get()方法: Set for(Stringsid: stuIds){ Studentstudent=students.get(sid); System.out.println("学生: "+student.name); } 2)可以使用EntrySet()方法: Entry是Map的一个内部类,代表一个键值对。 EntrySet()方法能够返回一个由多个Entry构成的Set集合。 注意Entry同样存在泛型。 判断List与Set中是否包含某个元素 可以使用contains()方法判断集合是否包含某个元素。 coursesToSelect.contains(c)//返回布尔值 注意: 默认情况下包含指的是内存地址相等,如果想判断元素内容相等,需要重写元素的equals()方法: publicbooleanequals(Objectobj){ if(obj==null) returnfalse; if(! (objinstanceofCourse)) returnfalse; if(this.name.equals(((Course)obj).name)) returntrue; else returnfalse; } 注意: 在早期版本Java中,对Set使用contains()判断相等可能还需重写hashCode()方法。 获取元素的索引位置 可以使用集合的indexOf方法获取元素位置(从0开始): System.out.println("索引位置: "+coursesToSelect.indexOf(c)); 如有相似的只获取第一个元素位置,如果想获取最后一个可以使用lastIndexOf()方法。 判断Map中是否包含某个键、值 判断是否包含某个键,可以使用containsKey()方法: if(students.containsKey("1"))... 判断是否包含某个值,可以使用containsValue()方法: if(students.containsValue(newStudent("1","aaa")))... 注意: 如果想判断元素内容相等,需要重写元素的equals()方法。 集合元素的排序 排序主要使用java.util.Collections工具类中提供的sort()静态方法: Collections.sort(intList); 如果要对自定义类实例进行排序,该类必须实现Comparable接口。 Comparable接口和Comparator接口 实现了Comparable接口的类代表该类对象可以比较大小,可以定义默认比较规则。 Comparator接口用于定义临时的比较规则,而不是比较默认规则。 实现了Comparable接口的类必须具有compareTo()方法。 实现了Comparator接口的类必须具有compare()方法。 compareTo()和compare()方法有3种返回值类型正数(当前对象比参数传来的对象大)、负数(当前对象比参数传来的对象小)和0(代表相等),如: publicintcompareTo(Studentobj){ intthisId=Integer.parseInt(this.id); intotherId=Integer.parseInt(obj.id); if(thisId>otherId) return1; elseif(thisId return-1; else return0; } publicintcompare(Studentarg0,Studentarg1){//放在一个独立的类中 returnpareTo(arg1.name); } 调用临时比较器需要使用sort()的重载方法: ComparatorTestct=newComparatorTest(); Collections.sort(stuList,ct); File类 用于文件、目录的操作,但是不能用于文件内容的访问。 目录常用操作方法: exists()、mkdir()、mkdirs()、delete()、isDirectory()、isFile()等 Filefile=newFile("d: \\test\\a");//也可以用单斜杠或File.separator()作为分隔符 //或者Filefile=newFile("d: \\test","a"); if(! file.exists()) file.mkdirs();//创建多层目录 else file.delete(); System.out.println(file.isDirectory()); System.out.println(file.isFile()); 文件常用操作方法: exists()、createNewFile()、delete()等 Filefile=newFile("d: /test/a.txt"); if(! file.exists()){ try{ file.createNewFile();//需要处理IOException异常 }catch(IOExceptione){ e.printStackTrace(); } } System.out.println(file.getAbsolutePath());//得到完整路径 System.out.println(file.getParent());//得到目录(如果file是目录则返回父目录) System.out.println(file.getName());//得到文件名(如果file是目录则返回当前目录名) 使用File类遍历文件夹中的文件 可以使用list()方法列出一个目录中的所有文件和子文件夹名称: Filefile=newFile("d: /projects"); String[]list=file.list(); for(Stringfilename: list){ System.out.println(file+"\\"+filename); } 如果要遍历一个目录中所有的子目录中的文件,可以采用递归的方法: privatestaticvoidlistDirectory(Filedir){ File[]files=dir.listFiles(); if(files! =null&&files.length>0){ for(Filefile: files){ if(file.isDirectory()) listDirectory(file); else System.out.println(file); } } } publicstaticvoidmain(String[]args){ Filedir=newFile("d: \\projects"); listDirectory(dir); } 使用RandomAccessFile类读写文件内容 RandomAccessFile可以读写文件内容,支持读写文件的任意位置(两种模式: rw/r)。 硬盘上的文件是以bytebytebyte的方式存储的,是数据的集合。 存在一个指针,刚打开一个文件的时候,pointer=0,当读写的时候指针会跟随移动。 例如: Filefile=newFile("test.txt");//当前目录下的文件 RandomAccessFileraf=newRandomAccessFile(file,"rw"); System.out.println(raf.getFilePointer());//取得指针位置 raf.write('a');//write()方法只写入一个字节(a的后8位) inti=0x7FFFFFFF;//Java中的最大整数 raf.write(i>>>24);//写入25-32位 raf.write(i>>>16);//写入17-24位 raf.write(i>>>8);//写入9-16位 raf.write(i);//写入最后8位 raf.writeInt(i);//与上述代码作用等同 Strings="中"; byte[]arr=s.getBytes("gbk"); raf.write(arr);//可以写入一个字节数组 raf.seek(0);//移动指针到头部 byte[]buf=newbyte[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 学习 笔记