文章目录
- JAVA跨平台是如何实现的
- 面向对象三大特性
- 重写和重载的区别
- 讲讲JAVA中不同访问权限修饰符区别
- 为什么要设计不同访问权限修饰符
- String、StringBuffer和StringBuilder区别
- HashCode、== 和 equals的区别
JAVA跨平台是如何实现的
java中经典的Write Once, Run Anywhere是基于JVM实现,Java 源码编译成与平台无关的字节码,由不同平台的 JVM 负责解释或编译执行。核心是通过加入JVM中间层屏蔽了操作系统和硬件的差异。
基于JVM带来的负面影响:
- 性能损耗:多了一层 虚拟机,字节码 → 机器码需要转换,启动阶段存在解释和 JIT 成本。
- 资源占用更高:JVM 自身需要内存,对小设备不友好。
- 对底层系统能力的“隔离”:JVM 封装了操作系统,Java 标准 API 不暴露全部系统能力,例如一些CPU专用指令集、高性能I/O接口。
面向对象三大特性
封装:将数据和对数据的操作封装起来,对象状态(属性)由这个对象自己的行为(方法)来读取和改变,隐藏细节部分。java种常见会把属性设置为private,通过setter和getter修改和获取属性。 目的:控制访问权限,降低耦合,提高安全性和可维护性
继承:子类复用父类的代码,并在此基础上扩展或修改行为。目的是为了代码复用
多态:同一个接口,不同对象,调用时表现出不同行为。调用方法时,运行期决定调用哪个子类的方法。目的:提高拓展性。
重写和重载的区别
先用代码简单介绍什么是重写,什么是重载
// 重载 class MathUtil { int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } int add(int a, int b, int c) { return a + b + c; } }重载发生在同一个类中,重载方法的方法名相同,参数列表、返回类型、权限修饰符可以不同。
//重写 class Father { int handle(int a, int b) { return a + b; } } class Son extends Father { int handle(int a, int b) { return a * b; } } Father example1 = new Son() Father example2 = new Father() example1.handle(1, 2) example2.handle(1, 2)重写发生在子类中,方法名、参数列表和返回类型都相同,权限修饰符要大于父类方法,声明异常要小于父类。
详细对比点
| 对比点 | 重载 | 重写 |
|---|---|---|
| 发生位置 | 同一个类中 | 发生在父子类之间 |
| 方法名 | 必须相同 | 必须相同 |
| 参数列表 | 必须不同(类型/个数/顺序)不同 | 必须完全相同 |
| 返回值类型 | 可以不同 | 可以不同,但子类返回的返回值类型必须是父类返回值类型的子类 |
| 访问修饰符 | 无要求 | 不能比父类更严格 |
| 异常 | 无要求 | 子类抛出的异常必须是父类相同或者为它子类 |
讲讲JAVA中不同访问权限修饰符区别
JAVA中分为四种访问级别权限符,访问范围从大到小为public、protected、default、private。
private特点:
- 只能在当前类中访问
- 子类也无法访问。所以
private的方法是不能被重写的。
default特点:
- 默认,不指定访问权限,默认就是这个。
- 同一个包内可访问
- 不同包完全不可见
protected特点:
- 同包可访问。
- 不同包:只有子类能访问。
public 特点:
- 任何地方都可以访问
- 类、方法、成员变量都可用
为什么要设计不同访问权限修饰符
Java 设计不同级别的访问修饰符,是为了通过权限分级实现封装和解耦。不同级别分别满足类内部、模块内部、继承关系以及对外 API 的访问需求,在保证安全性的同时,提高代码的可维护性和可扩展性。
String、StringBuffer和StringBuilder区别
String:是典型的Immutable 类,被声明成为 final class,所有属性也都是 final 的。也由于它的不可变性,类似拼接、裁剪字符串等动作,都会产生新的 String 对象。不可变
StringBuffer:是为解决String提到拼接产生太多中间对象的问题而提供的一个类,我们可以用 append 或者 add 方法,把字符串添加到已有序列的末尾或者指定位置。StringBuffer 本质是一个线程安全的可修改字符序列,它保证了线程安全,也随之带来了额外的性能开销。可变,线程安全。
StringBuilder:Java 1.5 中新增的,在能力上和 StringBuffer 没有本质区别,但是它去掉了线程安全的部分,有效减小了开销,是绝大部分情况下进行字符串拼接的首选.可变,线程不安全。
HashCode、== 和 equals的区别
== 的特点:
- 对于基本数据类型,值相同返回true.
- 对于引用类型,如果引用类型的两个对象引用地址相同返回true。
- 常用于判断是否为
同一对象。
inta=10;intb=10;intc=11;a==b;// truea==c;// falseUseru1=newUser();Useru2=newUser();Useru3=u1;u1==u2;// falseu1==u3;//trueequals()特点:
- 定义在
Object类中,默认实现就是等价于== - 自定义类一般都会重写
hashcode()和equals()方法,重写equals逻辑一般是默认类个属性值相同就返回true。 - 常适用于
判断对象业务等价
hashcode()特点:
- 定义在
Object类中,返回一个int值。 - 一般用于快速定位对象在哈希表中的位置。
- 常适用于
map中使用。