1.组合和继承有什么区别
1)继承是隐式的获得父类的对象,被包含类和父类对应,是is-a的关系;组合可以显式的获得被包含类(继承中称为父类)的对象,组合外部类和子类对应。
2)继承关系在编译期决定;组合关系在运行期决定。
3)继承是父类与子类之间一种紧耦合关系;组合是在组合类和被包含类之间的一种松耦合关系。
4)选择组合关系,在组合类中包含了外部类的对象,组合类可以调用外部类必须的方法;使用继承类时,父类的所有方法和变量被子类无条件继承,子类不能选择。
5)使用继承关系时,用父类变量引用子类对象,实现多态,组合无此特性。
2.java多态的实现机制是什么
依靠父类或接口的引用指向子类
3.重载和覆盖(重写)有什么区别(可查看上一篇博客笔记)
相同点:
1)都要求方法同名
2)都可以用于抽象方法和非抽象方法之间
不同点:
1)方法覆盖参数列表必须一致,而方法重载要求参数列表必须不一致。
2)方法覆盖要求返回类型必须一致,方法重载对此没有要求。
3)作用域不同:方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类中的所有方法(包括从父类中继承而来的方法)
4)方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载没有任何限制。
5)父类的一个方法只能被子类覆盖一次,而一个方法可以在所有的类中可以被重载多次。
6)对于属性(成员变量)而言,不能重载,只能覆盖。
注:重写的方法不能是final修饰的、重写的方法不能为private、重写的方法不能是static
4.抽象类和接口有什么区别?,抽象类和抽象方法?
(1)抽象类(abstract class A{//定义一个抽象类)和接口(class Demo implements MyInterface{)
1)抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2)抽象类要被子类继承,接口要被类实现。
3) 抽象类中可以做方法申明,也可以做方法实现,接口只能做方法申明
4) 抽象类中的变量是普通变量,抽象类的修饰符不能是private,接口里定义的变量只能是公共的静态的常量。
5)抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
6)抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。
7)接口可继承接口,并可多继承接口,但一个类只能继承几个抽象类。
(2)抽象类和抽象方法
1)有抽象方法的类一定是抽象类,抽象类里可以没有抽象方法
2)当子类继承抽象类时,必须要将抽象类中的抽象方法全部实现或者重写,否则子类依然是抽象类,因为继承了抽象方法
3)抽象类必须有abstract关键字修饰,不可以通过new来创建对象,抽象方法不可以写函数体,构造方法、类方法(static修饰的方法)不能声明为抽象方法。抽象方法要被实现,所以不能是静态的,也不能是私有的。
5.内部类有哪些?
内部类:将一个类定义在另一个类里面或者方法里面,这称为内部类,内部类的实例化对象存在于外部类的实例化对象中,并可直接访问包围它的实例的方法和字段,要实例化一个内部类,先实例化外部类。
(1)Java内部类有成员内部类、局部内部类、匿名内部类、静态内部类
1)成员内部类: 成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。 当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。
2)局部内部类:定义在一个方法或者一个作用域里面,访问权限仅限于方法内或者该作用域内;
3)匿名内部类:没有名字的内部类
4)静态内部类:指被声明为static的内部类,他可以不依赖内部类而实例,而通常的内部类需要实例化外部类,从而实例化。静态内部类不可以有与外部类有相同的类名。不能访问外部类的普通成员变量,但是可以访问静态成员变量和静态方法(包括私有类型) 一个 静态内部类去掉static 就是成员内部类,他可以自由的引用外部类的属性和方法,无论是静态还是非静态。但是不可以有静态属性和方法。
6.this和super的区别?
1)super访问基类中的属性;this访问本类中的属性,如果本类没有此属性则在父类中查找
2)super访问基类中的方法;this访问本类中的方法,如果本类没有此方法则在父类中查
3)super调用基类的构造方法,必须放在子类构造方法首行;this调用本类构造函数,必须放在构造方法的首行;
4)this.变量,调用当前对象的变量;super.变量直接调用父类中的变量,访问基类的数据成员
5)this()和super()不能存在于统一构造函数中,因为this语句调用当前类的另一个构造函数中包括一个父类的构造器,在调用super(),相当于调用了两次,编译器不会通过;this和super不能用于static修饰的变量、方法、代码块。因为两者都指的是对象(实例)。
7.final finally和finalize区别
1)final?修饰符(关键字):如果一个类被声明为final(final class A),此时A不能再派生出新的子类,不能作为父类被继承;一个类不能既被声明为 abstract的,又被声明为final的;将变量或方法声明为final, 被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改,修饰的变量相当于常量。被声明为final的方法也同样只能使用,不能重写
2)finally?:再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,与其匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)
3)finalize?方法名:Java 中,使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。定义在Object 类中。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用。
8.static关键字
1)static成员变量:java提供两种类型的变量,用static修饰的静态变量和没用此修饰的实例变量。静态变量属于类,在内存中有一个复制,静态成员所在的类被加载,静态变量就会被分配空间,就能被使用,引用方式有类.静态变量和对象.静态变量
实例变量属于对象,对象被创建后,实例变量才会被分配内存空间,才能被使用,在内存中有多个复制,只有“对象.实例变量”的引用方式。
2)static成员方法:static方法是类的方法,不用创建对象就可以被调用,此方法中不能使用this和super关键字,不能调用非static方法
3)实现单例模式的设计:单例模式指该类只能有一个实例,所以单例模式要隐藏类的构造函数(把构造函数声明为private),并提供一个创建对象的方法,因为构造函数被声明为private,外界无法创建这个类型的对象,只能通过通过该类提供的方法来获取类的对象,所以只能把创建对象的方法声明为static
9.数组的拷贝方式有哪些?
1)数组名.clone()
Int[] arr = {1,2,3};
Int[] brr = arr.clone();
2)Arrays.copyof(原数组,拷贝数组长度)
Int[] arr = {1,2,3,4,5};
Int[] brr = Arrays.copyof(arr,3);//底层调用system.arraycopy
3)System.arraycopy(Object src, int srcPos, Object dest, int desPos, int length))
Int[] arr = {1,2,3,4,5};
Int[] brr = new int[length];
System.arraycopy(arr,0,brr,0,arr.length)
Arr:原数组;0:原数组拷贝起始位置;brr:目标数组;0:从目标数组起始位置开始拷贝;arr.length :拷贝的长度
4)for循环
10.Arrays.sort用的是什么排序算法?怎么优化?
用的是快速排序算法:先选择一个基准,比基准小的往前,大的往后;对基准前和基准后进行同样的操作,知道排序完成。
优化:基准取中,小数组选用插入排序,