1.重写和重载的区别?
重载:发生在一个类中,同名的方法如果有不得参数列表(类型不同,个数不同,参数不同)视为重载。
重写:重写发生在子类与父类之间,子类重写父类的方法与被重写的方法返回相同的返回类型,比父类的方法更好的访问,且不能比父类声明更多的异常。
2.String,StringBuffer,StringBuilder的区别是什么?
不可变性
String:String是不可变的,即一旦创建了String对象,就不能修改他的值,每次对String操作都会创建一个新对象,导致内存开销较大
StringBufrfer和StringBuilter:它们允许修改自己的字符串内容,对于频繁的字符串操作使用它们可以避免频繁的创建新对象,提高性能。
安全性:
String:是线程安全的,因为它的不可变性,这使得在多线程的环境下可以使用同一个String对象,不会出现并发修改的问题。
StringBuffer:是线程安全的,他的方法都是同步的,因此在多线程环境下可以安全的对字符串进行操作,但是由于方法是同步的,它的性能相对较低。
StringBuilter:是线程非安全的,因为它的方法没有同步,这使得它在多线程的环境下需要自行保证线程的安全。
性能:
String:由于String的不可变性,导致在对String操作时频繁的创建对象,从而导致内存浪费和频繁的回收,对性能有一定影响。
StringBuffer和StringBuilter:它们允许修改自己的字符串内容,不会频繁的创建对象,性能相对较高,StringBuilterbiStringBuffer性能高,因为StringhBuliter的方法没有同步。
3.== 与 equals 的区别?
"=="操作符:
- 对于基本数据类型,"=="比较的是值是否相等。
- 对于引用类型(对象),"=="比较的是对象的引用是否相等,即两个对象是否指向同一个内存地址。
"equals()"方法:
"equals()"方法是Object类的方法 , 默认情况下,Object类的"equals()"方法比较的是两个对象的引用是否相等,等价于"=="操作符。 通常,我们需要在自定义类中重写"equals()"方法,根据类的实际需求来定义两个对象是否相等的判断逻辑。 比如:`String str1 = "Hello"; String str2 = new String("Hello"); boolean result = str1.equals(str2); // true`
4.抽象类和接口的区别是什么?
抽象类(Abstract Class)和接口(Interface)是Java中用于实现抽象类型的两种机制,他们的区别如下:
实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
构造函数:抽象类可以有构造函数;接口不能有。
实现数量:类可以实现很多个接口;但只能继承一个抽象类【java只支持单继承】。
访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的抽象方法可以使用Public和Protected修饰.
设计层面:抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。
5. 面向对象的特点
面向对象编程(Object-Oriented Programming,简称OOP)具有以下特征:
封装:
封装是将数据和对数据的操作封装在一个单元中,通过定义类来实现。
类通过公共接口(方法)来控制对内部数据的访问,隐藏了内部实现的细节,提供了数据的安全性和保护。
继承:
继承是通过定义一个新的类来继承现有类的特性(属性和方法)。
继承实现了代码的重用,可以建立类之间的层次关系,并通过父类的特性扩展子类的功能。
子类可以继承并重写父类的方法,实现多态性。
多态性:
多态性指的是同一类型的对象,在不同的情境下表现出不同的行为。
多态性通过方法的重写和方法的重载实现。
多态性使得程序可以更加灵活和可扩展,提高了代码的可读性和可维护性。
这些特征共同构成了面向对象编程的核心思想和基本原则,使得代码具有可重用性、可扩展性、可维护性和可理解性。面向对象编程使得程序更易于设计、实现和维护,提高了软件开发的效率和质量。