(1)第一类整数型:byte、short、int、long
(2)第二类浮点型:float、double
(3)第三类逻辑型:boolean
(4)第四类字符型:char
1、重载的规则:
①必须具有不同的参数列表。
②可以有不同的访问修饰符。
③可以抛出不同的异常。
2、重写方法的规则:
①参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。
②返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。
③访问修饰符的限制一定要大于被重写方法的访问修饰符。
④子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型。
3.类的关系上的区别:
重写是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系。
int是java的基本数据类型,integer是int的包装类
Integer变量必须实例化后才能使用,而int不需要
Integer是对象的引用,当new一个Integer时,实际上是生成一个指指向此对象,而int则是直接存储数据值
Integer的默认值是null,int的默认值是0
(1)访问修饰符(3)
(2)修饰方法、类、属性和变量(9)
(3)定义类、接口、抽象类和实现接口、继承类的关键字、实例化对象6个
(4)包的关键字2个
(5)数据类型的关键字12个
(6)条件循环(共12个)
(7)错误处理5个
总结:
java的关键字一共有51个关键字+2个保留字,一共是53个关键字,而且关键字都是小写!
保留关键字:
装箱:基本类型转换成封装类型, 拆箱:封装类型转换成基本类型 这么一个过程。
通俗来说:就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态!
比如stuendt是一个父类,那么在操场上上体育课的学生和在教室里面的学生就是它的子类。这时上课铃声响了,上体育课的学生去操场,在教室里面上课的学生则是回教室,不同的学生有着不同的反应,这就是多态。
定义的关键字不同。
子类继承或实现关键字不同。
类型扩展不同:抽象类是单继承,而接口是多继承。
方法访问控制符:抽象类无限制,只是抽象类中的抽象方法不能被 private 修饰;而接口有限制,接口默认的是 public 控制符。
属性方法控制符:抽象类无限制,而接口有限制,接口默认的是 public 控制符。
方法实现不同:抽象类中的普通方法必须有实现,抽象方法必须没有实现;而接口中普通方法不能有实现,但在 JDK 8 中的 static 和 defualt 方法必须有实现。
静态代码块的使用不同:抽象类可以有静态代码块,而接口不能有。
使用try…catch
final可以用来修饰的结构:类、方法、变量
final用来修饰一个类:此类不能被其它类继承。
final 用来修饰方法 :表明此方法不可以被重写
final 用来修饰变量 ,此时变量就相当于常量
序列化是指将对象的状态转换为字节流的过程,以便可以在网络上传输或永久保存到磁盘中。反序列化则是将序列化的字节流恢复为对象的过程。在 Java 中,序列化和反序列化是通过 ObjectInputStream 和 ObjectOutputStream 实现的。
为什么我们需要序列化?
在现代应用程序中,对象的状态通常需要在不同的系统、进程和线程之间进行传递。例如,在分布式系统中,对象可能需要在不同的服务器之间进行传递。另一个例子是在缓存中存储对象时,对象需要序列化以便可以保存到磁盘中。
String声明的是不可变对象,每次操作都会产生新的String对象,然后指针在指向新的对象。
而StringBuffer、StringBuilder可以在原有的对象基础上进行操作。
StringBuffer、StringBuiler的区别在于StringBuffer是线程安全的,StringBuilder是非线程安全的
StringBuilder >StringBuffer > String
但是StringBuiler的效率要高于StringBuffer。
封装、继承、多态和抽象是面向对象编程的四大特征。
使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。
equals() 比较的是两个对象的值(内容)是否相同。
“==” 比较的是两个对象的引用(内存地址)是否相同,也用来比较两个基本数据类型的变量值是否相等。
如果字符串常量池中已经包含了一个等于此String对象的字符串,则返回常量池中字符串的引用(内存地址),否则将新的字符串放入常量池中,并返回新字符串的引用(内存地址)。
JVM
JVM是Java虚拟机(Java Virtual Machine) 的缩写,用于运行Java字节码文件(*.class文件)。JVM针对不同的操作系统都有特性的实现(例如Windows,Linux,nacOC),目的是使用相同的字节码啊,在不同操作系统运行结果相同,是Java实现跨平台的核心机制。Java中默认虚拟机为HotSpot VM,除此之外还有JRockit(BEA),j9(IBM),TaoBaoVM(淘宝)等虚拟机;
JRE
JRE全称Java Runtime Environment(Java运行时环境)。JRE包括Java虚拟机和Java程序我所需要的核心类库等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。
JDK
JDK是Java开发工具包(Java Development Kit)的缩写,是提供给Java开发人员使用的,JDK中包含JRE以及开发,调节和监视应用程序的工具,编译工具(javac.exe),打包工具(jar.exe),Java监控和管理平台(jConsole,jvisualvm)等,
JDK包含JRE,JRE包含JVM。 所以JDK > JRE > JVM。
1.面向对象(封装,继承,多态);
2.跨平台(Java虚拟机实现了平台无关性) ;
3.可靠性;
4.安全性;
5.支持多线程;
6.支持网络编程;
7.执行方式采用了解释执行 + 编译执行并存的方式;
8.实践应用案例很丰富。
构造方法名称与类名一致;
构造方法没有返回值类型这一结构,不能用void声明构造函数;
创建对象时,使用new关键字调用执行构造方法;
一个类即使没有声明构造方法,Java会提供默认的无参构造方法。
1.当你把对象加入HashSet时,HashSet会先获取该对象的hashCode值,来计算该对象加入的位置,同时与其他已经加入的对象的hashcode值作比较。
2.如果没有重复的hashCode,HashSet会假设对象没有重复出现,正常添加。
3.如果发现有相同hashCode值的对象,这时会条用equals()方法来检查hashCode相等的对象是否真的相同。
4.如果两个相同,HashSet就不会其加入操作成功。
5.如果两者不同,就会重新散列到其他位置。
6.这样就大大减少了equals()的执行次数,相应就提高了执行速度。
因为 equals() 方法和 hashCode() 方法之间存在一定的协作关系,它们一起确保对象在放入哈希表等数据结构中时的正确行为。
为了确保在使用哈希表等数据结构时的一致性和性能,通常建议在重写 equals() 方法时也重写 hashCode() 方法,并确保它们之间的逻辑一致性。否则,可能会导致对象在集合中的不正确行为和性能问题。
equals() 方法和hashCode()方法之间的关系应符合。
协作关系: 在哈希表(如 HashMap、HashSet)中,对象的 hashCode 值用于确定对象在表中的存储位置,而 equals 方法用于检查两个对象是否相等。如果两个对象被认为是相等的(即 equals 方法返回 true),那么它们的 hashCode 值应该相同。
性能: 如果你没有正确实现 hashCode() 方法,那么哈希表的性能可能会受到影响。在哈希表中,快速查找和插入的速度依赖于对象的 hashCode。如果 hashCode 方法不恰当,可能会导致哈希冲突,降低哈希表的性能。
一致性: 根据Java规范,如果两个对象在 equals() 方法中被认为是相等的,那么它们的 hashCode 值必须相同。这是因为在哈希表中,首先会根据 hashCode 的值来查找潜在的匹配项,然后再使用 equals 方法来确保匹配的准确性。
综上所述,在每个覆盖了equals()方法的类中,也必须覆盖hashCode()方法,如果不这样做的话,就会违反Object.hashCode的通用约定,从而导致HashSet和HashTable等集合。另外,可以避免equals()被频繁调用,减少性能开销。
字符串常量池确保相同内容的字符串只存储一次。这意味着如果两个字符串具有相同的字符序列(内容相同),它们将引用相同的字符串对象。
如果通过new创建String对象那么将是一个新的对象。
使用intern()方法: String类提供了一个intern()方法,可以用于显式将字符串对象添加到字符串常量池中。如果需要确保字符串对象在常量池中存在,可以使用这个方法。
String str1 = "hello"; // 创建一个字符串对象,存储在常量池中
String str2 = "hello"; // 直接引用常量池中的同一字符串对象
String str3 = new String("hello"); // 创建一个新的字符串对象,存储在堆内存中
String str4 = str3.intern(); // 使用intern()方法将字符串对象添加到常量池中
System.out.println(str1 == str2); // true,引用同一常量池对象
System.out.println(str1 == str3); // false,不同对象
System.out.println(str1 == str4); // true,引用同一常量池对象
在Java中,都是值传递,如果参数时基本类型,复制参数的值,传递给方法。如果参数时引用类型,复制对象参数的Heap堆中内存地址值,传递给方法。
1.集合框架:Collection接口,List接口,Set接口,Map接口;
2.比较器:Comparator接口,Comparable接口;
3.IO操作:Closeable接口(可以关闭的文件流);
4.标记接口:RandomAccess接口(集合元素随机访问),Serializable接口(序列化),Cloneable接口(对象克隆);
5.线程接口:Runnable接口。
程序中的错误统称为异常。
可以举例说明,一个公共变量a,三个线程,一个线程修改了a的值,其他两个线程可能看不到a变化后的值,这就是内存可见性问题。
原因是:为了提高处理速度,每个线程都会在 CPU 中维护一份共享变量的本地缓存,而线程对共享变量的所有操作都会在自己的本地缓存中进行。如果线程 A 更改了一个共享变量,线程 B 有可能看不到线程 A 的修改
可以使用关键字 volatile修改变量a来解决。
volatile 是 Java 中的关键字,用于修饰变量。它的主要作用是确保多线程环境下的可见性和有序性,这意味着当一个线程修改了 volatile 变量的值时,其他线程可以立即看到这个修改。
volatile关键字的作用:
适用场景: volatile 适用于一些简单的标志位或状态标识的操作,例如线程之间的信号通知。它不适合复杂的操作,如累加操作。