java基础-面向对象

java基础-面向对象

1 面向对象和面向过程的区别(解决问题的方式不同)

​ 面向过程吧解决问题的过程拆成一个个方法,通过一个个方法执行解决问题。
​ 面向对象会抽象出对象,然后用跪下只想方法的方式解决问题。
​ 面向对象开发的程序一般更容易维护,易复用,易扩展。

2 如果一个类没有声明构造方法,该程序能正确执行吗?

​ 能,有默认的不带参构造方法

构造方法有哪些特点?是否可以被重载?重写?

​ 1名字与类相同,
​ 2没有返回值,但不能用void声明构造函数;
​ 3生成类的对象时自动执行,无需调用。
​ 4不能被重写,但可以被重载

3 面向对象三大特征

封装

​ 封装是指把一个对象的状态信息(也就是属性)隐藏在对象内部,不允许外部对象直接访问对象的内部信息。但是可以提供一些可以被外界访问的方法来操作属性。

继承

​ 不同类型的对象,相互之间经常有一定数量的共同点。
​ 关于继承如下 3 点
​ 子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有。
​ 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
​ 子类可以用自己的方式实现父类的方法。

多态

​ 多态,顾名思义,表示一个对象具有多种的状态,具体表现为父类的引用指向子类的实例。

多态的特点

​ 1对象类型和引用类型之间具有继承(类)/实现(接口)的关系;类的方法。
​ 2引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定;
​ 3多态不能调用“只在子类存在但在父类不存在”的方法;如果子类重写了父类的方法,真正执行的是子类覆盖的方法,如果子类没有覆盖父类的方法,执行的是父

4 接口和抽象类有什么共同特点和区别?

共同点

​ 1 都不能被实例化
​ 2 都可以包含抽象方法
​ 3 都可以有默认实现的方法

区别

​ 1 接口主要用于类的行为i进行约束,你实现了某个接口就具有了对应的行为。抽象类主要用于代码复用,强调的时所属关系。
​ 2 一个类只能继承一个类,但可以实现多个接口。
​ 3 接口的成员变量只能时public static final类型的,不能被修改且必须有初始值,而抽象类的成员变量默认时default,可以在子类中被重新定义,也可以被重新赋值。

5 深拷贝和浅拷贝、引用拷贝

浅拷贝

会在堆上创建一个新的对象,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。

深拷贝:

会完全复制整个对象,包括这个对象所包含的内部对象

引用拷贝:

如:两个不用的引用指向同一个对象。

6 Java常见的类

1 object类:是所有类的父类

Object类常见的方法
native 方法,用于返回当前运行时对象的 Class 对象,使用了 final 关键字修饰,故不允许子类重写。public final native Class<?> getClass()

== 和 equals() 的区别

​ == 对于基本类型和引用类型的作用效果是不同的:
​ 对于基本数据类型来说,== 比较的是值。
​ 对于引用数据类型来说,== 比较的是对象的内存地址。
​ equals() 不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等。
​ equals() 方法存在两种使用情况:
​ 类没有重写 equals()方法 :通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象,使用的默认是 Object类equals()方法。
​ 类重写了 equals()方法 :一般我们都重写 equals()方法来比较两个对象中的属性是否相等;若它们的属性相等,则返回 true(即,认为这两个对象相等)。

hashCode() 有什么用?
	hashCode() 的作用是获取哈希码(int 整数),也称为散列码。这个哈希码的作用是确定该对象在哈希表中的索引位置。

为什么重写 equals() 时必须重写 hashCode() 方法?

因为两个相等的对象的 hashCode 值必须是相等。也就是说如果 equals 方法判断两个对象是相等的,那这两个对象的 hashCode 值也要相等。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R3SCKbgV-1677161869701)(null)]

思考回答:重写equals()时没有重写hashCode()可能会导致equals方法返回true,而hashCode方法却返回false。这样会导致hashmap、hashset等类中存储多个一模一样的对象,这与Java的思想不符(hashMap只能有唯一的key,hashSet只能有唯一的对象)

String、StringBuffer、StringBuilder的区别?

​ String是对象不可变的。可以理解为常量,故而线程是安全的;

不可变的原因是:

1 保存字符串的数组被 final 修饰且为私有的,并且String 类没有提供/暴露修改这个字符串的方法。
2 String 类被 final 修饰导致其不能被继承,进而避免了子类破坏 String 不可变。
StringBufferStringBuilderr都继承自AbstractStringBuilder类,在 AbstractStringBuilder 中也是使用字符数组保存字符串,不过没有使用 final 和 private 关键字修饰,最关键的是这个 AbstractStringBuilder 类还提供了很多修改字符串的方法比如 append 方法。
StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。(出现的原因: 为了弥补String类每次拼接,都会构建一个新的String对象,既耗时,又浪费空间.)
StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

对于三者使用的总结:

1操作少量的数据: 适用 String
2单线程操作字符串缓冲区下操作大量数据: 适用 StringBuilder
3多线程操作字符串缓冲区下操作大量数据: 适用 StringBuffer

7 同步锁(synchronized)

把有可能出现问题的代码包起来,一次只让一个线程执行。通过sychronized关键字实现同步

特点:

​ 前提1,同步需要两个或者两个以上的线程。
​ 前提2,多个线程间必须使用同一个锁。
​ 同步的缺点是会降低程序的执行效率, 为了保证线程安全,必须牺牲性能。
​ 可以修饰方法称为同步方法,使用的锁对象是this。
​ 可以修饰代码块称为同步代码块,锁对象可以任意。

8 字符串拼接用“+” 还是 StringBuilder?

​ 字符串对象通过“+”的字符串拼接方式,实际上是通过 StringBuilder 调用 append() 方法实现的,拼接完成之后调用 toString() 得到一个 String 对象 。
​ Java 语言本身并不支持运算符重载,“+”和“+=”是专门为 String 类重载过的运算符,也是 Java 中仅有的两个重载过的运算符。
​ 如果使用在循环内进行”+“拼接字符,会出现明显的缺陷:编译器不会创建单个StringBuilder来复用,会导致创建过多StringBuilder对象
​ 如果直接用StringBuilder对象进行字符拼接便不会存在这个问题;

9 String#equals() 和 Object#equals() 有何区别?

​ String 中的 equals 方法是被重写过的,比较的是 String 字符串的值是否相等。 Object 的 equals 方法是比较的对象的内存地址

10 字符串常量池的作用了解吗?

​ 字符串常量池 是 JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。

11 intern 方法有什么作用?

12 对象的相等和引用相等的区别

​ 对象的相等一般比较的是内存中存放的内容是否相等。

​ 引用相等一般比较的是他们指向的内存地址是否相等。

思维导图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kokotao

你的鼓励就是的创作的最大动力,

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值