#### 1.面向对象的三大特性

封装

定义:封装就是把一个对象的属性私有化,同时提供一些可以被外界访问属性的方法,不允许外部程序直接访问;

优点:

1. 保护类中的信息,阻止在外部的代码随意访问内部的代码和数据;

2. 隐藏细节信息

3. 降低代码的耦合性,提高系统独立性;

继承

定义:子类继承父类,子类可以吸收父类已有的属性、行为,并扩展新的能力.

特点:

Java是单继承,C++是多继承;

子类拥有父类的属性和方法(private私有权限除外),同时也可以对父类进行拓展,拥有自己的属性和方法;

缺点:

继承加剧了类之间的耦合性,耦合性高意味着代码之间关系越密切,独立性越差,这也是继承的一个缺点。

优点:

继承可以降低代码编写的冗余度,提高编程的效率。

多态( java实现多态有三个必要条件:继承、重写、向上转型。)

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

特点:

对象类型和引用类型之间具有继承(类)/实现(接口)的关系;

对象类型不可变,引用类型可变;

方法具有多态性,属性不具有多态性;

引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定;

多态不能调用“只在子类存在但在父类不存在”的方法;

如果子类重写了父类的方法,真正执行的是子类覆盖的方法,如果子类没有覆盖父类的方法,执行的是父类的方法

优点:

多态可以让我们不用关心某个对象到底具体是什么类型,就可以使用该对象的某些方法

提高了程序的可扩展性和可维护性

#### 2.JDK和JRE有什么区别

JRE:顾名思义是Java运行时环境,包括JVM和Java基本类库。是Java程序运行的软件环境,是提供给需要运行Java程序的用户使用的。

JDK:顾名思义是Java开发工具包,有程序员编写Java程序所需用到的Java开发工具包。JDK包含JRE同时还包括Java语言编译器Javac,Java程序的调试工具和分析工具,Java编写需要的文档等。

#### 3.==和equals的区别是什么

==:

基本数据类型用"=="比较的是数值

引用数据类型"=="比较的内存地址

equals:

它的作用是判断两个对象是否相等,它不能用于比较基本数据类型的变量。

equals() 方法存在两种使用情况:

情况 1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==” 比较这两个对象。使用的默认是 Object 类 equals() 方法。

情况 2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的属性内容是否一致.(String类 Date类 File类)

#### 4.两个对象的hashCode()相同,则equals()也一定为true,对吗

hashCode()相等的两个对象他们的equals()不一定相等。因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样,是算法的问题,所以hashCode()只能说是大部分时候可靠,并不是绝对可靠.

#### 5.equal()相等的两个对象他们的hashCode()肯定相等。

所有对于需要大量并且快速的对比的话如果都用equal()去做显然效率太低。所以解决方式是,每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等,如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!

#### 6.深拷贝和浅拷贝

java中的拷贝需要实现java.lang.Cloneable接口,然后重写clone()方法,这个无论深、浅拷贝都需要这样做。

浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,不会重新创建对象,此为浅拷贝。

深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。

#### 7.是否可以继承String类

在Java中,被final修饰的类,就是不能被继承的。

#### 8.String类的常用方法有哪些

indexOf():返回指定字符的索引。

charAt():返回指定索引处的字符。

replace():字符串替换。

trim():去除字符串两端空白。

split():分割字符串,返回一个分割后的字符串数组。

getBytes():返回字符串的 byte 类型数组。

length():返回字符串长度。

toLowerCase():将字符串转成小写字母。

toUpperCase():将字符串转成大写字符。

substring():截取字符串。

equals():字符串比较。

#### 9.final finally finalize的区别

final

final是java中的一个关键字.

final修饰类:该类不能被继承,所以一个类不能既被final修饰,又被abstract声明。

final修饰方法:该方法不能被重写。

final修饰变量:是常量,并且需要给定初始值,只能被赋值一次,赋值之后不能被修改.

finally

一般和try catch在捕获异常一起进行使用,finally中的代码是一定要执行的,不管try中有没有出现异常,比如资源释放,断开连接等等,这些代码块就应该放到finally代码块中.

finalize

首先,他是一个方法名,是又Object类里面定义的一个方法.在Java中存在垃圾回收机制,当检测到这个对象没有被引用的时候,就会自动调用这个方法,当然我们可以重写这个方法,去进行定制化的清理内存等功能。

#### 10.new一个对象的过程和clone一个对象的区别

new

new对象是根据后面的类型进行内存的分配的,分配完内存之后才调用构造方法,填充对象中的各个域,进行初始化。构造方法返回后一个对象就创建成功了。同时可以将对象的地址发布到外部,在外部就可以用这个地址操作这个对象了。

clone

clone 在第一步是和 new 相似的,都是分配内存,但它的分配内存是根据原对象的内存进行分配的,也就是原对象有多大内存,它就得到多大的内存,然后使用原对象中各个域填充新对象各个域,完成后clone方法返回,同样可以将这个新对象地址发布到外部,可以从外部对其进行操作了。

#### java中为什么要用clone

需要一个和现有对象相同的对象,在 Java 语言中,要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单,也是最高效的手段。

####11. Java中操作字符串都有哪些类它们之间有什么区别

String :

fifinal修饰,不可变类,即对String对象的任何改变都不影响到原对象,对字符串的修改操作都会生成新的对象。 线程安全

private final char value[] ,所以 String 对象是不可变的。

StringBuffer :

可变, 对字符串的操作的方法都加了synchronized,保证线程安全,效率低.

StringBuilder :

可变,不保证线程安全,操作效率高.

对于三者使用的总结:

1. 操作少量的数据: 适用 String

2. 单线程操作字符串缓冲区下的大量数据: 适用 StringBuilder

3. 多线程操作字符串缓冲区下的大量数据: 适用 StringBuffer

####12. this和super关键字的用法

this有两个用法:

1.用来代表当前对象

2.一般用于区分同名的成员变量和局部变量。

3.用来调用当前类的构造器,this(参数列表),而且要放在调用者构造器的第一句。

super两个用法:

1.super代表了父类空间的引用

2.引用直接父类的实例变量。调用用直接父类方法

3.代表父类的构造器,super(参数列表),必须放在子类构造器的第一句。

this和super的区别

1.代表的事物不同

super代表的是父类空间的引用

this代表的是所属函数的调用者对象

2.使用前提不同

super必须要有继承关系才能使用

this不需要继承关系也能使用

3.调用的构造函数不同

super:调用父类的构造函数

this:调用所属类的构造函数

####13. break,continue,return的区别及作用

1. continue :指跳出当前的这一次循环,继续下一次循环。

2. break :指跳出整个循环体,继续执行循环下面的语句。

3. return 用于跳出所在方法,结束该方法的运行。

4. return; :直接使用 return 结束方法执行,用于没有返回值函数的方法

5. return value; :return 一个特定值,用于有返回值函数的方法

#### 14.抽象类和接口的异同

抽象类

如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

- 被abstarct修饰的类叫做抽象类,被abstract修饰的方法叫做抽象方法

- 抽象类不能被实例化

- 子类继承抽象类有两种解决方式,要么还是一个抽象类,要么重写所有的抽象方法

- 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

- 抽象类中的抽象方法只是声明,不包含方法体.

接口

接口在JAVA语言中是一个抽象类型,是抽象方法的集合.

- 接口用interface修饰

- 不能被实例化

- 接口支持多继承,多实现

- 接口中的方法均为抽象方法.

- 注:JDK 1.8 以后,接口里可以有静态方法和默认方法。

注:JDK 1.9 以后,接口可以有私有方法.

- 接口中方法也是隐式抽象的,接口中的方法会被指定为 public abstract

- 接口中可以含有变量,会被隐式的指定为 public static final 变量

优点:

接口是对外暴露的规则,是一套开发规范

接口提高了程序的功能拓展,降低了耦合性

区别

1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。

2. 抽象类中的变量可以是各种类型的,而接口中的变量只能是 public static final 类型的。

3. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

4. 从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。

#### 15.什么是方法?谈谈你对方法的理解

1.概念

方法其实是具有一定功能的代码块,我们可以把需要多次使用的功能提取成一个方法,这样多次使用的时候也不需要重复的写相同的代码,造成代码的冗余。

2.格式

方法定义的格式:修饰符 返回值类型 方法名(参数列表){方法体}

方法签名:方法名(参数列表)

3.注意事项

注意:我们这里说的是返回值类型而不是返回值,如果一个方法有返回值,那么返回值类型必须设置为与返回值相同的类型,并且返回值需要使用return关键字来返回。

方法的重载(overload):

定义:在同一个类中出现方法名相同但参数列表不同(参数类型不同、个数不同、顺序不同)的方法的现象

意义:是为了方便外界对方法进行调用,什么样的参数程序都可以找到对应的方法来执行,体现的是程序的灵活性

方法的重写(override):

定义:子类继承父类以后,如果子类对父类的功能不满意,可以重写父类的方法

两同:方法名相同,参数列表相同

两小: 子类方法的返回值类型 <= 父类方法的返回值类型

​ 子类方法抛出的异常类型 <= 父类方法抛出的异常类型

一大:子类方法的修饰符范围 >= 父类方法的修饰符范围

注意:子类不可以重写父类的私有方法,还是因为不可见

意义:是在不修改源码的前提下,进行功能的修改和拓展

####16. 什么是向上转型/向下转型?

向上转型:可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,统一调用标准。

向下转型(较少):子类的引用的指向子类对象,过程中必须要采取到强制转型。这个是之前向上造型过的子类对象仍然想执行子类的特有功能,所以需要重新恢复成子类对象

#### 17.面向对象和面向过程的区别

面向过程是一种编程思想,它强调的是过程,意思是我们做任何事,都需要亲力亲为。

面向对象也是一种编程思想,相对于面向过程,我们的身份可以由原来问题的执行者变为指挥者,进而把生活中很多复杂的问题变得简单化。

例如:当我们想吃一道菜,其实并不需考虑这道菜是怎么做的,怎么送达的,只需点菜即可.传菜和做菜都有具体的对象来完成具体的功能.我们不需要关注实现的过程,只需要关注结果就好。

性能:

面向过程性能比面向对象好。 因为类调用时需要实例化,开销比较大,比较消耗资源,比如单片机、嵌入式开发、Linux/Unix 等一般采用面向过程开发。

面向对象易维护、易复用、易扩展。因为面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统.

#### 18.**在Java中定义一个不做事且没有参数的构造方法的作用

Java 程序在执行构造方法之前,会先调用父类中的构造方法。如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用 super() 来调用父类中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。

#### 19.成员变量与局部变量的区别有哪些?

语法形式:

- 成员变量是属于类的,而局部变量是在方法中定义的变量

- 成员变量可以被修饰符所修饰,而局部变量不能被访问控制修饰符及static所修饰

- 成员变量和局部变量都能被 final 所修饰。

存储方式:

- 成员变量是对象的一部分,对象存在于堆内存,局部变量则存在于栈内存。

赋值方式:

- 成员变量如果没有被赋初值,则会自动赋默认值(一种情况例外:被 final 修饰的成员变量也必须显式地赋值),而局部变量则不会自动赋值.

#### 20.构造方法有哪些特性?

1. 名字与类名相同。

2. 没有返回值,但不能用 void 声明构造函数。

3. 生成类的对象时自动执行,无需调用。

#### 21.静态方法和实例方法有何不同

1. 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法使用"对象名.方法名"方式。

2. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制

#### 22.为什么重写 equals 时必须重写 hashCode 方法

重写equals的目的是为了比较两个对象的属性内容是否相等.根据Java判断对象是否相等的规则,会先判断hashCode 再去判断equals,首先我们就要保证hashCode相同的条件下,才能去比较equals,所以要重写hashCode去保证hashCode值要相等.

####23. 谈谈你对static的了解

1.static方法

static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法

注意:虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。

2.static变量

static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本【存放在方法区】,它在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

3.static代码块

static关键字还有一个比较关键的作用就是用来形成静态代码块以优化程序性能,因为静态资源只会加载一次。static块可以置于类中的任何地方,类中可以有多个static块。

初始化的顺序 静态代码块 > 构造代码块 > 构造函数

4.静态内部类

内部类被static修饰—并不常用!浪费内存!访问静态类中的静态资源可以通过”. . . ”链式加载的方式访问.

5.静态导包

静态导包就是java包的静态导入,用import static代替import静态导入包是JDK1.5中的新特性。