SE

1. Java和C++的区别?
都是面相对象的语言,支持多态、封装、多态
C++需要指针访问内存,Java不提供指针
C++需要手动对垃圾进行回收,Java有自动垃圾回收
C++有多重继承,而Java只是单继承
C语言中的字符串都是以“\0”结尾,Java中没有

2. 字符常量和字符串常量的区别?
形式上:字符常量是用单引号引起的单个字符,字符串常量是用双引号引起的多个字符
含义上:字符常量相当于一个整型值,可以参与表达式运算,字符串常量相当于是一个地址
占内存大小上:字符常量只占两个字节,字符串常量占若干个字节

3. 泛型和类型擦除
泛型的本质是参数化类型,也就是所操作的数据类型被指定为一个参数
Java的泛型是伪泛型,因为再编译期间,所有的泛型信息都会擦除掉,这就是类型擦除
泛型一般有3种方式:泛型类 、泛型方法、泛型接口

4. 方法重载和重写的区别?
重载的要求是 方法名相同、参数列表不同、返回值不作要求;重写是 方法名相同、参数列表相同、返回值相同
重载的 权限没有要求,子类重写的方法 权限 必须比父类的方法权限大
重载发生在一个类中,重写发生在继承关系上
重载发生在编译器,重写发生在运行期

5. 数组拷贝有哪些方法?
System.arraycopy(原数组名称,原数组开始位置,目标数组名称,目标数组开始位置,长度)
Arrays.copyOf(原数组名称,新数组长度)

6. static关键字

  1. 修饰属性:Java静态属性和类相关,和具体实例无关。同一个类的不同实例,共用一个静态属性,静态变量存放在方法区
  2. 修饰方法:静态方法属于类,而不属于对象,可以直接调用静态方法,而无需创建类的实例,静态方法可以访问静态数据成员,并可以更改静态数据成员的值
  3. 静态代码块:定义在类中方法外,静态代码块在非静态代码块执行前执行,该类不管创建多少对象,静态代码块只执行一次
  4. 修饰内部类:static只能修饰内部类,它的创建不需要依赖外围类的创建,它不能使用任何外围类的非静态成员变量和方法
  5. 静态导包

7. 封装
封装是当前属性被 private 所修饰,在类外不能够访问,只能在类内访问,意义是能够降低代码的管理复杂度,类的调用者不需要知道是怎么实现的,只需要调用get和set方法就可以,就好像我们看不到空调内部的零件信息,但是却能使用遥控器控制空调
Java提供了3个访问控制符:private、protected、public 还有一个是包访问权限(default)

private(当前类访问权限):类内部可以访问,类外部不能访问
default(当前包访问权限):类内部可以访问,同一个包中的类可以访问,其他类不能访问
protected(子类访问权限):可以被同一包中其他类访问,也能被不同包中的子类访问,其他类不能访问
public(公共访问权限):都能访问

8. new操作是怎样执行的?
new操作共分为两步:
第一步:为对象分配内存空间
第二步:调用合适的构造方法

9. this关键字
this表示的是当前类的实例的引用(当前对象的引用)

10. 实例代码块、静态代码块、构造函数执行顺序
执行顺序是:父类静态代码块、子类静态代码块、父类实例代码块、父类构造函数、子类实例代码块、子类构造函数

11. final关键字
修饰一个变量或者字段,表示常量(不能修改)
修饰类,表示类不能被继承
修饰方法,表示此方法不能被重写

12. 继承
继承是使用已存在的类的定义作为基础建立新的类,新类的定义可以增加新的数据和新的功能,但是不能选择性的继承父类,就比如描述狗和猫,两者都有名字和年龄,但是叫声不同,那就可以写一个动物类,让猫类和狗类继承动物类,继承是一个is-a的关系
好处是提高代码的复用性,程序的可维护性,提高开发效率
子类继承父类除构造方法以外的所有属性和方法
子类要帮助父类进行构造

13. 多态
多态发生的前提主要有3个:
1.父类引用引用子类对象
2.父类和子类有同名的覆盖方法
3.通过父类引用调用这个重写方法的时候,就会发生多态
将一个父类的引用指向子类的对象,称为向上转型,自动进行类型转换
此时通过父类引用调用的方法是子类覆盖或继承父类的方法,此时就发生了运行时绑定
如果父类要调用子类特有的方法,就要将一个指向子类对象的父类引用赋给一个子类的引用,称为向下转型,此时必须进行强制类型转换
如果需要向下转型就要使用instanceof来判断一个引用是否是某个类的实例,如果是,返回true,这样向下转型才安全
好处是:隐藏了子类类型,提高了代码的可扩展性
坏处是:只能使用父类的功能,无法使用子类的特有功能,功能有限制

14. super关键字
super表示获取到父类实例的引用
第一种用法:调用父类的构造器
第二种用法:调用父类的普通方法

15. this和super 的区别
this指的是当前对象的引用,super指的是获取到当前父类实例的引用
super调用构造方法时,需要写在第一行,this不需要
this 在类内使用,super在子类中使用,必须在继承关系上
this 访问本类的属性和方法,super 访问父类的属性和方法

16. 抽象类
如果一个方法被abstract修饰,这个方法就是抽象方法,抽象方法可以没有具体的实现,包含抽象方法的类称为抽象类
抽象类不能被实例化
抽象方法不可以是private
抽象类存在的意义就是被继承
一个类继承了抽象类,这个类必须重写抽象方法
抽象类继承抽象类 不需要重写抽象方法

17. 接口
接口是抽象类的一种特殊形式,使用interface修饰
接口中包含的方法只能是抽象方法,属性只能是静态常量
public abstract public static final
接口和接口是继承,接口和类是实现
接口表达的含义是 具有xxx特性

18. 接口和抽象类的区别
抽象类是一个普通类+抽象方法,普通属性和方法子类可以直接使用,子类只需要重写抽象方法,而接口只有抽象方法和静态常量,子类必须重写所有的抽象方法
一个类只能继承一个抽象方法,而一个类能实现多个接口
抽象类中的抽象方法不限定权限,而接口中的抽象方法只能是public

19. 克隆接口 Cloneable
Cloneable 是一个空接口,空接口也就是标记接口
一旦一个类实现了这个接口,那么就标记这个类是可以进行clone()的
但是要想调用clone() ,还要重写Object的clone() 方法

20. 深拷贝和浅拷贝
浅拷贝:对基本数据类型进行值传递,对引用数据类型进行地址传递,称为浅拷贝
深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,称为深拷贝

21. ==和equals()的区别
==:它是判断两个对象的地址是否相同,基本数据类型就是比较值,引用数据类型比较的是地址
equals():它是比较两个对象内容是否相同,如果是自定义类型比较是否相同,需要重写equals()方法,否则比较的还是地址

22. String、StringBuffer和StringBuilder的区别
String是被final修饰的,不能修改,如果有大量修改字符串的操作,会产生大量的中间对象,那就太影响性能
StringBuffer是为了解决大量拼接字符串时产生很多无用的中间对象的问题而提供的一个类,提供了append和add方法,它是一个线程安全的可修改的字符序列,但是线程安全的代价就是影响性能
StringBuilder 和StringBuffer本质都一样,只是去掉了线程安全的部分,所以性能比StringBuffer稍微好一点
StingBuffer和StringBuilder都是继承自abstractStringBuilder类

String的内容不可修改,StringBuffer、StringBuilder的内容可以修改
StringBuffer和StringBuilder大部分功能是相似的
StringBuffer在每个方法都加了synchronized,是线程安全的,而StringBuilder属于线程不安全的,但是性能比StringBuffer好

23. Java中的基本数据类型有哪些? 对应的包装类有哪些? 各占多少字节?
byte Byte 1个字节
short Short 2个字节
char Character 2个字节
int Integer 4个字节
long Long 8个字节
float Float 4个字节
double Double 8个字节
boolean Boolean …

24. 装箱和拆箱
什么是装箱?什么是拆箱?

  • 装箱:将基本类型用他们对应的引用类型包装起来
  • 拆箱:将包装类型转换为基本类型

装箱和拆箱是怎么实现的?

  • 装箱调用的是包装器的valueOf()方法
  • 拆箱调用的是包装器的xxxValue()方法

25. 包装类和常量池
Byte、Short、Integer、Long默认创建了数值 [ -128 ~ 127 ] 的相应类型的缓存数据,Character创建了数值在 [ 0 ~ 127 ] 范围的缓存,Boolean直接返回 true或者 false,如果超超出以上界限,会重新new一个对象

26. 面向对象和面向过程的区别?
面向过程比面向对象性能高:因为面向对象类调用需要实例化,消耗资源,面向过程不依赖对象,所以性能比较好
面向对象比面向过程容易维护、容易扩展、容易复用:因为面向对象有继承、封装、多态特性,可以设计出低耦合的系统

27. 成员变量和局部变量的区别?

  • 成员变量是属于类的,而局部变量是属于方法中定义的变量或者参数
  • 成员变量是随着对象的产生而产生,对象的销毁而销毁;局部变量是随着方法的调用而自动消失
  • 成员变量可以使用修饰限定符和static修饰,局部变量不能使用,局部变量只能使用final修饰
  • 成员变量如果用static修饰,那就是属于类,如果没有使用static 那就是属于实例,存在于堆中,而局部变量存在于栈中
  • 成员变量如果不赋初值,会自动使用默认值;局部变量不会自动赋值

28. equals()和hashCode()
hashCode() 作用是获取哈希码,也称为散列码,实际上是返回一个int整数,哈希码的作用是确定该对象在哈希表中的 索引位置;散列表存储的是 K-V ,能根据key快速检索出对应的value
两者关系:
1.没有创建散列表,那就只需要使用equals()来判断两者是否相等,使用hashCode()没有意义
2.创建了散列表,
如果两个对象equals()是相等的,hashCode()值不一定相同
如果两个对象hashCode()值相同,两个对象也不一定相等
因为在散列表中,两个对象的哈希值相同,并不一定键值对就相同
两个不同的键值对,哈希值相等;这就是哈希冲突
hashCode()在对象的内存地址基础上经过一系列特定算法返回一个hash码

equals方法用于比较对象的内容是否相等(覆盖之后)
hashCode方法只有在集合中才能使用到
当集合要添加新元素时,先调用这个元素的hashCode方法,找到它应该放置的物理位置,如果这个位置没有元素,就直接储存在这个位置,如果这个位置已经有元素了,就调用equals方法与新元素进行比较,如果相同,就不存,不相同就散列其他地址

29. 异常分类
异常顶层类是Throwable,它派生出受查异常和非受查异常,非受查异常包括 Error和运行时异常 ,受查异常包括 其他继承Exception的异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值