2.JAVA基础面试题:面向对象

二.JAVA基础面试题:面向对象


1.面向对象和面向过程的区别

2.如何创建一个对象?对象实体和对象引用的区别?

3.对象相等和引用相等的区别

4.构造方法的作用是什么

5.一个类未声明构造方法,程序能否执行

6.构造方法的特点

7.类的封装,继承和多态

8.接口和抽象类的共同点和区别

9.深拷贝,浅拷贝和引用拷贝的区别


1.object类中的==和equals的区别

2.object类中的hascode的作用

3.object类中的equals和hascode结合使用


1.String类,Stringbuffer和StringBuilder的区别

2.String为什么不可变

3.字符串的拼接的三种方式的区别

4.字符串常量池的理解

4.String的intern方法理解?


二.JAVA基础面试题:面向对象

1.面向对象和面向过程的区别

  • 面向对象:先抽象出对象,然后通过对象.方法完成问题。
  • 面向过程:把解决问题拆分成一个一个方法

2.如何创建一个对象?对象实体和对象引用的区别?

  • 通过new关键字创建对象,并且对象存储在堆内存中。
  • 对象实体和对象引用
    对象引用指向对象实体。
    对象引用存储在栈内存中,对象实体存储在堆内存中。
    对象引用可以指向一个对象实体。
    对象实体可以有多个对象引用。

3.对象相等和引用相等的区别

  • 对象相等:是对象在堆内存存储的地址是否相等。
  • 引用相等:是引用指向具体的堆内存地址是否相等。

4.构造方法的作用是什么

  • 构造方法主要是完成对象的初始化工作

5.一个类未声明构造方法,程序能否执行

  • 可以执行,一个类未声明构造方法,JAVA会默认提供默认无参个构造器。
  • 如果自己添加了构造器,那么JAVA则不会提供默认构造器
  • 使用时要提供无参有参构造器

6.构造方法的特点

  • 名字与类名相同
  • 可以重载
  • 无返回值
  • 生成对象时自动调用

7.类的封装,继承和多态

  • 封装性:把一个对象的信息隐藏在对象内部,不允许外部直接访问。
  • 继承性:用已存在的类的定义为基础建立新的类。
    子类拥有父类的全部结构,不能直接调用私有结构但是拥有。
    子类可以对父类进行扩展。
    子类可以重写父类的方法。
  • 多态性:父类的引用指向子类的对象。
    必须为子父类关系。
    引用类型调用的方法必须为父类所有。(不一定执行)。
    引用类型具体调用的方法在运行时确定。(子类重写后的方法)

8.接口和抽象类的共同点和区别

  • 共同点
    都有抽象方法。都可以有默认实现。都无法实例化。
  • 区别
    类继承一个类,实现多个接口。
    抽象类的成员变量无限制,接口的成员变量默认修饰符为public static final

9.深拷贝,浅拷贝和引用拷贝的区别

  • 引用拷贝:两个不同的引用指向同一个对象。
  • 浅拷贝:
    创建一个新对象。
    对象内部的引用变量属性仍然为引用拷贝。
  • 深拷贝:
    创建一个新对象。
    对象内部的引用变量属性仍然为新创建的对象。
  • 实现
    实现Cloneable接口。重写clone方法。
    深拷贝内部成员变量也实现,浅拷贝内部成员变量不用实现。

1.object类中的==和equals的区别

  • ==
    基本类型:值
    引用类型:地址值
  • equals
    基本类型:无法使用
    引用类型:未重写的则是==,重写后一般比较属性值。

2.object类中的hascode的作用

  • 类无散列结构则hascode无作用
  • 类由散列结构则hascode获取哈希码,确定在哈希表中的位置

3.object类中的equals和hascode结合使用

  • ①类无散列表结构
    equals和hascode无关
  • ②类有散列表结构
    equals相等,则hascode一定相等。
    hascode相等,equals不一定相等。
  • ③过程:
    hascode先确定索引位置,位置有值时则用equals来比较值是否相等。

1.String类,Stringbuffer和StringBuilder的区别

  • String 不可变 线程安全 性能较差
  • StringBuffer 可变 线程安全 性能较差
  • StringBuilder 可变 线程不安全 性能较好
  • 少量数据:用String
    单线程且大量使用数据:用StringBuilder
    多线程且大量使用数据:用StringBuffer

2.String为什么不可变

  • 保存字符串的数组被final修饰且私有化
  • string类未提供修改字符串的方法

3.字符串的拼接的三种方式的区别

  • “+”
    本质为 new StrinrgBuilder . append . append .toString
  • StringBuilder.append
  • String,concat
    每次产生新的String对象(用数组拼接)
  • 多次拼接时应该使用第二种,生成的对象最少

4.字符串常量池的理解

  • ①方法区中有专门存放字符串的常量池
  • ②String a = “abc”
    在常量池中生成了abc字符串,然后引用变量a直接赋值为常量池中的地址
  • ②String b = new String(“abc”)
    若常量池已有abc,在堆中生成String对象,然后value指向常量池
    若常量池没有abc,则先在常量池生成abc,再最后用value指向常量池

4.String的intern方法理解?

  • ①String a = “a” + “b”
    编译期常量会直接合并,故a指向常量池
  • ②String b = “a” + a
    生成StringBuilder对象后生成String对象,value指向常量池
  • ③String c = (“abc” + a).intern()
    此时c由value指向常量池直接转化c直接指向常量池

未更新

你可能感兴趣的:(面试题,java,jvm,面试)