因为热爱所以坚持,因为热爱所以等待。熬过漫长无戏可演的日子,终于换来了人生的春天,共勉!!!
一张图解决
深拷贝相比于浅拷贝速度较慢并且花销较大。
hashCode通用的约定是无论何时,对同一个对象调用hashCode()都应该产生同样的值
如果重写equals不重写hashCode会怎样?
由于默认的 hashcode 方法是根据对象的内存地址经哈希算法得来的,两个不同的对象的hashCode一定不一样,那么执行equals,结果为true,HashSet或HashMap的键会放入值相同值的对象。
基本类型作为参数被传递时肯定是值传递;引用类型作为参数被传递时也是值传递,只不过“值”为对应的引用。
反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。
Class.forName(“类的路径”);当你知道该类的全路径名时,你可以使用该方法获取 Class 类对象。
Class clz = Class.forName("java.lang.String");
类名.class。这种方法只适合在编译前就知道操作的 Class。
Class clz = String.class;
对象名.getClass()。
String str = new String("Hello"); Class clz = str.getClass();
如果是基本类型的包装类,可以调用包装类的Type属性来获得该包装类的Class对象。
第一种:JDBC 的数据库的连接
在JDBC 的操作中,如果要想进行数据库的连接,则必须按照以上的几步完成
通过Class.forName()加载数据库的驱动程序 (通过反射加载,前提是引入相关了Jar包);
通过 DriverManager 类进行数据库的连接,连接的时候要输入数据库的连接地址、用户名、密码;
通过Connection 接口接收连接。
第二种:Spring 框架的使用,最经典的就是xml的配置模式。
Spring 通过 XML 配置模式装载 Bean 的过程:
将程序内所有 XML 或 Properties 配置文件加载入内存中;
Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息;
使用反射机制,根据这个字符串获得某个类的Class实例;
动态配置实例的属性。
Spring这样做的好处是:
不用每一次都要在代码里面去new或者做其他的事情;
以后要改的话直接改配置文件,代码维护起来就很方便了;
有时为了适应某些需求,Java类里面不一定能直接调用另外的方法,可以通过反射机制来实现。
类型安全
泛型的主要目标是提高 Java 程序的类型安全
编译时期就可以检查出因 Java 类型不正确导致的 ClassCastException 异常
符合越早出错代价越小原则
消除强制类型转换
泛型的一个附带好处是,使用时直接得到目标类型,消除许多强制类型转换
所得即所需,这使得代码更加可读,并且减少了出错机会
类型擦除:
泛型是一种语法糖,泛型这种语法糖的基本原理是类型擦除。Java中的泛型基本上都是在编译器这个层次来实现的,也就是说:泛型只存在于编译阶段,而不存在于运行阶段。在编译后的 class 文件中,是没有泛型这个概念的。
1.匿名内部类
没有名字的内部类
匿名内部类必须继承一个抽象类或者实现一个接口。
匿名内部类不能定义任何静态成员和静态方法。
当所在的方法的形参需要被匿名内部类使用时,必须声明为 final。
匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
2.局部内部类
定义在方法中的内部类,定义在实例方法中的局部类可以访问外部类的所有变量和方法,定义在静态方法中的局部类只能访问外部类的静态变量和方法,创建方式,new 内部类(),注意局部只能在方法里使用
3.成员内部类
成员位置上的非静态类,可以访问外部类所有的变量和方法,创建方式,外部类实例.new 内部类()
4.静态内部类
可以且只能访问外部类的所有静态变量,静态内部类的创建方式,直接new 静态内部类
package java基础; import java.util.Comparator; public class OuterClass { private int age; private String nameString; private static int flag = 1; public OuterClass () { super(); // TODO Auto-generated constructor stub } public OuterClass (int age, String nameString) { super(); this.age = age; this.nameString = nameString; } public void testInternalClass() { /** * @author ASUS * 局部内部类 */ class Duck { public void prints() { System.out.println(age+"/"+nameString); } } Duck d = new Duck(); d.prints(); } /** * @author ASUS * 成员内部类 */ class Monkey { public void prints() { System.out.println(age+"/"+nameString); } } /** * @author ASUS * 静态内部类 */ static class Buck{ public void prints() { System.out.println(flag); } } public static void main(String[] args) { // TODO Auto-generated method stub Monkey monkey = new OuterClass (12,"Sun wu kon!").new Monkey(); monkey.prints(); OuterClass outerClass = new OuterClass (13,"Sun wu jing!"); outerClass.testInternalClass(); System.out.println(); //匿名内部类 int result = new Comparator<String>() { @Override public int compare(String o1, String o2) { // TODO Auto-generated method stub return o1.compareTo(o2); } }.compare("a", "b"); System.out.println(result); //静态内部类直接new,不需要外部类实例 Buck buck = new Buck(); buck.prints(); } }
内部类优点
内部类不为同一包的其他类所见,具有很好的封装性;
内部类有效实现了“多重继承”,优化 java 单继承的缺陷。
匿名内部类可以很方便的定义回调。
注意:局部内部类和匿名内部类访问局部变量的时候,为什么变量必须要加上final
最后:创作不易,喜欢的话请给个赞吧,为了保证内容准确查阅了大量的资料,力求严谨准确,如果你也和我一样备战面试,关注我,持续更新,一起加油吧,给努力的自己点个赞!!!
参考资料
书籍:
java核心技术、java编程思想
博客:https://blog.csdn.net/weixin_43591980/article/details/117215356
https://blog.csdn.net/weixin_44259720/article/details/88414828
https://blog.csdn.net/qq_36470686/article/details/83444483