优秀的编程知识分享平台

网站首页 > 技术文章 正文

java2(JaVa2实用教程第6版Pdf)

nanyue 2025-05-08 03:55:38 技术文章 5 ℃

重写和重载的区别

重载

一个类中,有多个方法名相同,但参数个数和 参数类型不同

与返回值无关,与权限修饰符也无关。

重写

方法,方法名,参数列表和返回值都必须相同

权限修饰符不能小于被重写方法的修饰符。

重写的方法不能抛出新的异常

java三大特性:

1、封装,是指隐藏对象的属性和实现细节,仅对外提供公共访问方式;

2、继承,从已有的类中派生出新的类 并能扩展新的能力;

3、多态,一个方法可以有多种实现版本,即“一种定义, 多种实现”。

多态

调用重载的方法时通过传递给它们不同的参数个数和参数类型来决定具体使用哪个方法,这叫多态,子类的引用执行父类变量

抽象类和接口的区别

接口中的成员变量只能是 常量public static final 类型的,声明的变量默认都是final的,成员函数默认是public的 ,不能含有静态代码块以及静态方法,一个个类却可以实现多个接口,

抽象类可以有静态代码块和静 态方法,一个类只能继承一个抽象类 ,可以包含非final的变量成员函数可以是private,或者是public

类如果要实现一个接口,它必须要实现接口声明的所有方法。

声明成是抽象的类可以不实现抽象类声明的所有方法,

final

final 修饰的类叫最终类,该类不能被继承;

final 修饰的方法不能被重写;

final 修饰的变量叫常量,必须赋值才能使用,并且只能赋值一次, 以后值不能被修改(常量)

final、finally、finalize的区别*

final:java关键字,修饰的类不能被继承,修饰变量或方法能修改或重写

finally:异常处理的一部分,只能在try/catch语句中使用,表示finally中的代码一定会执行

finalize:Object中的方法名称,在GC启动且对象将要被回收时由系统调用,不需要程序员手动调用


==与 equals 的区别?

==是一个运算符 ,equals 是 Object 类的方法

==`操作符用于比较基本数据类型的值时,比较的是数值;用于比较对象引用时,比较的是内存地址。

equals`方法用于比较对象的内容是否相同, equals 不能直接用于基本数据类型的比较,需要转换为其对应的包装类型。

==与 equals都可以用于引用类型的比较时。 相等 为 true 否则为 false。

String s1 = new String("abc");

String s2 = "abc";

System.out.println(s1==s2);---- false, 常量池

System.out.println(s1.equals(s2));------ true 内存中的地址值

java代理

JDK动态代理: 如aop: Java 注解、事务、日志,

基于反射和接口 必须实现接口,性能好

在Spring AOP中,如果目标对象没有实现任何接口,Spring AOP会自动使用CGLIB动态代理。

CGLIB动态代理: 基于字节码生成子类,对于没有接口的类也可以进行代理,不能代理final类或final方法

bio、nio和aio

同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO

同步阻塞的BIO 数据的读取在一个线程内等待其完成 ,才去处理下一个线程,适用于连接数目比较小且固定的架构,要求服务器好

NIO :同时支持阻塞与非阻塞模式, 需一个线程去轮询,Channel(通道),Buffer(缓冲区), Selector(选择区),传统 IO 基于字节流和字符流进行操作,而NIO 基于 Channel 和 Buffer(缓冲区)进行操作,Selector(选择区)用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道,适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器

AIO方式适用于连接数目多且连接比较长 的架构,比如相册服务器


sleep 和 wait 的区别使用场景?

sleep方法:线程类的方法。通常用于在不需要释放锁的情况下,让当前线程暂停执行一段时间指定的毫秒数,比如在循环中等待一段时间以避免过于频繁地执行某些操作。

wait方法:Object 类的方法, 当一个线程需要等待另一个线程完成某些操作后才能继续执行时,,通常用于线程间的通信和同步wait方法通常与notify()notifyAll()方法一起使用,以实现线程间的协调。

当try块中包含return语句时,如果执行过程中没有异常发生,那么会先执行return前的代码,然后执行finally块中的代码,最后执行return语句返回结果。 如果return语句之前有修改基本数据类型的操作,那么finally块中的修改不会影响最终的返回值。2

当catch块中包含return语句时,如果try块中发生异常,那么catch块会捕获异常并执行其中的代码,包括return语句。 方法返回的值是catch块中计算后的3,而非finally块中计算后的4。

当finally块中包含return语句时,无论try或catch块中是否有return语句,finally块中的return都会覆盖它们

finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

try{ return; }catch(){} finally{} return;

finally块之后的语句return,因为程序在try中已经return所以不再执行。

finally{return;}因为finally块中有return所以提前退出

finally调用任何的不可变的 API,对返回值没有影响。

浅拷贝和深拷贝区别

浅: 被复制对象的所有变量都含有与原来的对象相同的值,

实现Cloneable 接口,并重写了 clone() 方法。

深: 深拷贝会拷贝所有的属性

深拷贝相 比浅拷贝速度较慢并且花销较大。

实现1Serializable接口

User copyUser = (User) SerializationUtils.clone(user); // 修改源对象的值

set user.getAddress().setCity("合肥"); // 检查两个对象的值不同

assertNotSame(user.getAddress().getCity(), copyUser.getAddress().getCity());

2setter

创建对象的5种方式

使用 new 关键字 } → 调用了构造函数

使用 Class 类的 newInstance 方法 , 调用了构造函数--必须有public的无参构造器才行

使用 Constructor 类的 newInstance 方法

使用 clone 方法,没有调用构造函数必须先实现Cloneable接口并复写Object的clone方法。

使用反序列化,没有调用构造函数Serializable接口

静态变量与实例变量区别?

静态变量: 静态变量由于不属于任何实例对象,属于类的,所以在内存中只会

有一份,在类的 加载过程中,JVM 只为静态变量分配一次内存空间。

o 实例变量: 每次创建对象,都会为每个对象分配成员变量内存空间,实例变量

是属于实例对象 的,在内存中,创建几次对象,就有几份成员变量。

静态变量则可以直接使用类名来引用。

RuntimeException 会编译通过

ClassCastException 数据类型转换异常

NullPointerException

NumberFormatException字符型数据中包含非数字型字符\

.IndexOutOfBoundsException

NoSuchMethodException 方法不存在异常

非运行时异常 (编译异常) 必须处理

IOException、SQLException、ClassNotFoundException

Error 和 Exception 的区别?

o Error 表示系统级的错误和程序不必处理的异常,恢复很困难比如内存溢出,不可能指望程序能处理这样的情况;

o Exception 表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;

也就是说,它表示如果程序运行正常,从不会发生的情况。

Java 局部变量和全局变量

局部变量:存储在栈区,在方法内的,只要当前所在位置代码执行结束,就会销毁

this就代指当前对象(方法的调用者)

全局变量存储在全局数据区中 可以在本类的所有实例方法中访问(非static修饰的)只要对象在,就一直在,等到堆内存的对象被销毁才会销毁

最近发表
标签列表