1、类对象obj.getClass()和类的对象obj的区别
2、
方法多态里:只能调用调用子类里重写父类的方法或者是继承父类的方法,不能是子类独有的方法
3、
基本数据类型转换
基本数据类型:
byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128(-2^7)~127(2^7-1),默认值0
short:短整型,在内存中占16位,即2个字节,取值范围-32768(-2^15)~32767(2^15 - 1),默认值0
int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围--2,147,483,648(-2^31)~2,147,483,647(2^31 - 1),默认值0
long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L
float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有6~7位),默认值0
double:双精度浮点型,用于存储带有小数点的数字,在内存中占64位,即8个字节,默认值0
char:字符型,用于存储单个字符,占16位,即2个字节,取值范围0~65535,默认值为空
boolean:布尔类型,占1个字节,用于判断真或假(仅有两个值,即true、false),默认值false
默认转换:byte,short,char--int--long--float--double
byte,short,char 相互之间不转换,他们参与运算首先转换为Int类型
Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
参考地址:https://www.cnblogs.com/zwakeup/p/7420142.html
Animal animal = new Dog(); Dog dog = (Dog) animal; dog.eat();
上面这个例子就是引用类型里的强制类型转换,因为animal的引用本身就是指向子类Dog
4、
抽象类规定子类必须实现哪些方法,但它不关心如何实现
5、
Java世界中,类是单继承的,接口是可以多继承的
使用接口的时候,还可以用匿名内部类的方法
5、Java异常
异常的作用和意义:对于异常的正确处理,可以将异常提交给编程人员,使本来中断的程序可以继续运行或者退出,并且保存用户的当前操作
运行时异常,应该是代码逻辑有问题
检查异常:这部分需要我们手动添加捕获和处理语句
处理异常我们用try-catch或者try-catch-finally
如果try里面的语句或出现多个异常,该怎么处理?
可以使用多个catch,捕获不同的异常,进行不同的处理
编写多个catch块要注意的问题:先小后大,先从子类异常开始
我们还可以自定义异常,需要继承Java中相似的异常类或者是基类exception
6、String和StringBuffer
String是不可变对象,即对象一旦生成,就不能更改。对String对象的改变会引起新的String对象的生成。这容易浪费资源
StrinhBuffer:每次都对对象本身进行操作,而不是生成新的对象。所以在字符串内容不断改变的情况,建议使用StringBuffer。
public static void main(String[] args) { StringBuffer sb = new StringBuffer(); // 使用构造函数StringBuffer创建一个StringBuffer对象 System.out.println("sb.capacity():"+sb.capacity()); // 16 理论值 System.out.println("sb.length():"+sb.length()); // 0 实际值 }
StringBuffer转String 使用toString()方法
String转StringBuffer 使用new StringBuffer(string)
String和StringBuffer相互转换,是为了使用对方的方法
7、对象数组
8、集合
已经有了数组,为什么还要集合?
因为数组的长度是固定的,而且只能存储同一类型,集合的话,长度不固定,同一个集合可以保存多种类型(ArrayList、HashSet)
参考地址:https://www.cnblogs.com/yangliguo/p/7476788.html
https://www.jianshu.com/p/a9fb4d26c2cd
set集合里的数据是不重复的,当把对象添加到set中时,兼容可以保存重复的数据,这是为什么呢?
public static void main(String[] args) { // 创建HashSet集合对象 HashSet<Student> hs = new HashSet<Student>(); //创建student对象 Student s = new Student(20, "zb"); Student s1 = new Student(21, "zb1"); Student s2 = new Student(21, "zb1"); //添加袁术对象 hs.add(s); hs.add(s1); hs.add(s2); // 遍历集合 for (Student student : hs) { System.out.println(student); } }
结果分析,原因出在add这块,源码里面显示:添加的时候,先通过hashCode值进行判断,如果值已经有了,就不保存
要解决这个问题,就需要重写类的hashCode和equals方法
9、IO流分类
流向:
输入流: 读取数据放入内存中 FileReader
输出流: 从内存中写出数据 FileWriter
类型:
字节流:(一些不能转换为字符的,就需要字节流:比如图片、视频)
字节输入流: InputStream
字节输出流:OutputStream
字符流: (读中文、复制文本文件,用这个好)
字符输入流:Reader
字符输出流:Writer
下面这个例子是分别使用字节流和字符流复制图片
package 常用API_08.IO; import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils; import java.io.*; /** * 使用字节和字符流赋值图片 * 结论:二进制文件只能由字节流传输,包括:图片、视频、音频 * 文本文件既可以使用字节流,也可以使用字符流 * 为什么字节流不能复制二进制文件,因为字符流在复制的时候,会对字节进行合并,有的俩个字节 * 合并成一个字符,有的三个字节合并成一个字符,在这个过程中,会丢失字节 */ public class CopyImage { public static void main(String[] args) throws IOException { copyImageByByte(); } // 使用字节流复制图片 private static void copyImageByByte() throws FileNotFoundException, IOException { // 创建字节输入流对象 FileInputStream fis = new FileInputStream("E:\\图片\\若菜奈央__02.png"); // 创建字节输出流对象 FileOutputStream fos = new FileOutputStream("E:\\若菜奈央__02.png"); int len; byte[] bytes = new byte[1024]; while ((len = fis.read(bytes)) != -1) { fos.write(bytes, 0, len); } fos.close(); fis.close(); } // 使用字符流复制图片 private static void copyImageByChar() throws FileNotFoundException, IOException { // 创建字符输入流对象 FileReader fr = new FileReader("E:\\图片\\若菜奈央__02.png"); // 创建字符输出流对象 FileWriter fw = new FileWriter("E:\\若菜奈央__02.png"); // 一次读写一个字符数组 int len; char[] chars = new char[1024]; while ((len = fr.read(chars)) != -1) { fw.write(chars, 0, len); fw.flush(); } // 释放资源 fw.close(); fr.close(); } }
主方法是单线程的,但是主方法里面可以创建多个线程
多线程操作的时候,会出现数据错乱
使用synchronized给代码块进行加锁,让代码变成同步(优点:安全性高;缺点:效率低)
10、基本类型和包装类型
参考:https://www.cnblogs.com/zsswpb/p/6329417.html
在开发中,对于可能为空的参数,最好定义为包装类型,因为前端传的参数如果为空,基本数据类型会报错
比如int和Integer,如果定义了一个参数是int类型,如何不传这个参数,就会报错,如果是Integer类型,就不会报错
备注:如果配置了@RequestParam,就算是Integer,也必须传参数,因为@RequestParam有一个属性required,默认为true
11、