大纲:
一、两个重要概念
① 请说明类和对象的区别
类是对某一类实物的描述,是抽象的;对象是一个实实在在的个体,是类的一个实例;
② 解释一下什么是类加载机制、双亲委派模型,好处是什么?
类加载机制:
双亲委派模型:
某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;
只有父类加载器无法完成此加载任务时,才自己去完成。
好处:
二、java类及类的成员
① 重写(Overriding)与重载(Overloading)的区别?
重载:重载指的是同一个类中的两个方法,方法名相同,参数列表(参数的类型、个数、顺序)不同;对返回值类型没有要求;
重写:重写发生在子类与父类之间,子类重写父类的方法,要求与被重写的方法的参数列表和返回值相同;
具体不同:
1 重写与重载都是实现多态的方式,区别在于重载实现的是编译时的多态,重写实现的是运行时的多态;(在了解下)
2 重写后,子类方法的访问修饰权限不能小于父类的访问修饰权限;
3 重写后,子类不能比父类被重写方法声明更多的异常;
② 什么是构造函数?什么是构造函数重载?什么是复制构造函数?
构造函数(构造器):
当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序中没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数 。
构造函数重载:
java中构造函数的重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数都必须有他唯一的参数列表。
复制构造函数:
java不支持像C++中那样的复制构造函数 , 这个不同点是因为如果你不自己写构造方法的情况下,Java不会创建默认的复制构造方法。
三、面向对象的三大特征
① 面向对象的特征,解释下?
具体的注意点说明:
封装性:我们可以将类的属性私有化, 只有通过公共的get/set方法才能进行访问,在get/set方法中我们可以对内部逻辑进行封装处理,外部的调用方不必关心我们的处理逻辑。
继承性:
1 java不支持多继承;
2 类中的构造函数不能被继承;如果构造函数被private修饰 ,那么该类就不能被其他类继承;
3 方法的重写;
多态性:
1 方法的重载(与重写);
2 向上转型和向下转型;
参考链接:https://www.cnblogs.com/liyanyan665/p/11198602.html
四、java关键字
static关键字:
① 是否可以在static环境中访问非static变量?
② 解释一下static关键字,java中是否可以重写一个private或者是static的方法?
static关键字:static是表示静态的意思,它可用来修饰成员变量和成员函数,被静态修饰的成员函数只能访问静态成员,
不能访问非静态成员。静态是随着类的加载而加载,因此可以直接用类进行访问。
private或者是static的方法都不能被重写:
覆盖,也就是我们常说的重写,是子类继承父类,且子类中的方法和父类中的方法,方法名、参数列表和返回值都相同。
private修饰的方法,不能被继承,所以也不存在重写(覆盖);
static修饰的方法,可以被继承,但不能被重写。 因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。
③ 静态与非静态的区别?
这里的静态,指以static关键字修饰的,包括类,方法,块,字段。静态变量和静态方法都属于静态对象非静态,指没有用static 修饰的。
静态有一些特点:
1.全局唯一,任何一次的修改都是全局性的影响
2.只加载一次,优先于非静态
3.使用方式上不依赖于实例对象。直接用 类名.静态方法名 或者 类名.静态变量名就可引用并且直接可以修改其属性值,不用get和set方法。
4.生命周期属于类级别,从JVM 加载开始到JVM卸载结束。
5.static final用来修饰成员变量和成员方法,可简单理解为“全局常量”。对于变量,表示一旦给值就不可修改;对于方法,表示不可覆盖。
6.静态方法和静态变量创建后始终使用同一块内存。
7.静态方法优点是效率高,缺点是不自动进行销毁。
final关键字:
④ 说明一下final、finally、finalize的区别?
final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。
⑤ 说明一下final怎么用的?
五、其他知识点
① 请列举你知道的Object类的方法并简要说明
Object()默认构造方法。
clone() 创建并返回此对象的一个副本。
equals(Object obj) 指示某个其他对象是否与此对象“相等”。
finalize()当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
getClass()返回一个对象的运行时类。
hashCode()返回该对象的哈希码值。
notify()唤醒在此对象监视器上等待的单个线程。
notifyAll()唤醒在此对象监视器上等待的所有线程。
toString()返回该对象的字符串表示。
wait()导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
wait(long timeout)导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。
wait(long timeout, int nanos) 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。
六、抽象类和接口
① 抽象类和接口的区别?
抽象类:
1 抽象类必须在类前用abstract关键字修饰。如果一个类中有抽象方法,那么这个类也是抽象的;
2 子类必须实现抽象类中的抽象方法,如果有未实现的,那么子类也是抽象类,必须用 abstract 修饰 ;
3 抽象类默认的权限修饰符为public,可以定义为 public 或 procted,如果定义为 private,那么子类则无法继承;
4 抽象类不能创建对象, 抽象类就是为了继承而存在的;
接口( interface ):
1 接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误);
2 接口中的方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误);
3 接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法;
区别:
1 一个类只能继承一个抽象类,而一个类却可以实现多个接口;
2 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
3 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型;
4 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;(java 8开始,接口中可以有静态方法)
② java是否支持多继承?
Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。
但是java中的接口支持多继承,即一个子接口可以有多个父接口。(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能)。