Part 1 多态
1.什么是多态,多态的前提条件?
多态:一个事物在不同时刻体现出来的不同状态
多态的前提条件:
1)必须存在继承关系
2)要有方法重写,子类需要去覆盖父类的功能!
3)必须有父类引用指向子类对象!
父类名 对象名 = new 子类名(); 向上转型!
2.多态的成员访问特点?
成员变量:编译看左,运行看左!
成员方法:编译看左,运行看右!(存在方法重写!)
静态的成员方法:编译看左,运行看左(不算方法重写,静态的东西都和类相关!)
构造方法:分层初始化(父类先进行初始化,然后是子类初始化!)对数据进行初始化!
3.final关键字的特点?
final:状态修饰符,最终的,无法更改的!
修饰类,该类不能被继承! (JDK提供的String类: final class String{})
修饰成员变量,该变量此时是一个常量: (传统的自定义常量的格式:public static final 数据类型 变量名 = 初始化值)
修饰成员方法,该方法不能被重写!
4.多态的好处以及多态的弊端,如何解决多态的弊端
好处:
1)提高代码的复用性,由继承保证的!
2)提高代码的扩展性,由多态保证!
弊端:
不能访问子类的特有功能
1)创建具体的子类对象 子类名 对象名 = new 子类名();
这种方式,比较消耗内存空间(在堆内存中开辟新的空间!)
2)使用向下转型:将父类的引用强制转换子类的引用:
子类名 子类对象名 = (子类名)父类的引用;
5.java.lang.ClassCastException 是什么异常,出现的原因是什么?
向下转型使用不当,会造成一个运行时期异常-->类转换异常!
在向下转型的时候,堆内存的数据类型跟栈内存变量类型不一致!
(必须是继承关系才可以)
6.形式参数如果是引用类型--具体的类,那么调用该方法的实际参数传递的是什么?
需要传递该类的具体对象
public viod make(Fruit fruit){
}
7.接口和抽象类的区别?
成员的区别:
成员变量
抽象类:可以是常量也可是变量
接口:只能是常量: 存在默认修饰符 public static final...
成员方法:
抽象类:可以抽象方法(没有方法体),也可以非抽象方法
接口:只能是抽象方法,存在默认修饰符:public abstract
构造方法:
抽象类:存在构造方法,有参/无参,对数据进行初始化
接口:没有构造方法的!
关系的区别:
类与类:继承extends,支持单继承,不支持多继承,可以多层继承
类接口:实现implements,支持一个类继承另一个类的同时可以实现多个接口
接口与接口:继承extends,支持单继承,也可以支持多继承!
继承:存在一种局限性 ----> 面向接口编程!
设计理念的区别:
抽象类---->继承关系--->体现的是一种"is a"的关系!
接口------>实现关系--->体现的是一种"like a"的关系!
8.形式参数如果是具体类,抽象类,接口分别调用方法应该如何传递?
形式参数是具体类---->调用方法需要传递该类的具体对象!
抽象类---->调用方法需要传递该抽象类的子类对象!
接口------>调用方法需要传递该接口的子实现类对象!
9.方法的返回值如果是具体类,抽象类,接口分别调用该方法,如何返回?
方法的返回值是具体类
该方法需要返回该具体类的对象
抽象类:该方法需要返回该抽象类的子类对象
接口:该方法需要返回该接口的子实现类对象
10.static关键字的特点?
static:
1)随着类的加载而加载,类加载一次,被static修饰的也就使用一次
2)优先于对象存在
3)被static修饰的:被多个对象可以共用,被共享
4)访问方式:推荐使用类名.成员变量/成员方法()
11.封装,继承,多态的三大特征分别是什么?
封装的类----->实体类----->实体类中的这些属性需要和数据库表中的字段名称一一对应
封装:将一个类中的属性私有化(保证的数据安全性,隐藏掉了),
对外提供公共的访问方法setXXX(形参)/getXXX()方法
继承:多个类中的共性内容抽取到一个独立的类中,然后产生一种关系;
继承特点:
子类继承父类,只能继承非私有的成员变量/成员方法,私有的成员间接的通过公共访问方法来访问!
子类继承父类,子类的所有构造方法都默认访问父类的无参构造方法!(永远建议给出无参构造方法!)
Part 2 选择排序
1、选择排序的思想:
使用0索引的元素依次和后面索引的元素比较,小的往前放
第一次比较完毕,最小值出现在最小索引处,依次这样比较
在这里也顺便提一下冒泡排序思想:
两两比较,将较大的值往后放,
第一次比较完毕,最大值出现在最大索引处,依次这样比较
2、代码表示:这是选择排序、冒泡排序以及数组遍历的部分代码
private static void paiXu(int[] arr) {
for (int x = 0; x < arr.length-1; x++) {
for (int y = x+1; y < arr.length; y++) {
if(arr[y]<arr[x]) {
int temp = arr[y];
arr[y] = arr[x];
arr[x] = temp;
}
}
}
}
private static void bubleSoft(int[] arr) {
for (int x = 0; x < arr.length-1; x++) {
for (int y = 0; y < arr.length-1-x; y++) {
if(arr[y]>arr[y+1]) {
int temp = arr[y];
arr[y] = arr[y+1];
arr[y+1] = temp;
}
}
}
}
public static void printArray(int[] arr) {
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if(arr[i]==arr[arr.length-1]) {
System.out.println(arr[i]+"]");
}else {
System.out.print(arr[i]+" ,");
}
}
}
Part 3 内部类
1.内部类的划分?如何通过外部类访问成员内部类的成员?
成员内部类
在外部类的成员位置定义的类
局部内部类
在局部位置(外部类的成员方法中)定义的一个类
通过外部类名.内部类名 对象名 = 外部类对象.内部类对象();
2.外部类如何访问静态的成员内部类的成员?
外部类类名.内部类名 对象名 = new 外部类名.内部类名();
3.匿名内部类的格式是什么?它的本质是什么?
new 类名/接口名(){
重写方法;
};
匿名内部类的本质:继承了该类或者是实现了该接口的子类对象!
4.局部内部类访问局部变量,为什么这个局部变量JDK7以前要加上final修饰?
局部变量的生命周期:随着方法调用而存在,随着方法调用完毕而消失.在
当前外部类成员方法方法中创建了局部内部类对象,访问里面局部变量.堆内存不会
立即被释放,依然在访问这个变量,需要将局部变量加上final,变成常量!
public static final Integer i = new Interger(20) ;
5.获取字节码文件对象的方式?
1):Object类中的getClass()方法---->Class对象
class 包名.类名
反射中:
2)任意Java类型的class属性!
3)Class类中存在静态功能:forName("一个类的全限定名称") ; (推荐的方式)
6.分别阐述一下四个权限修饰符在不同情况下的访问权限问题?
public: 对外公开,可以在任何地方访问;
protected:当前包下及子类可以访问;
默认:没有访问控制修饰符,同一个包中可以访问;
private:只有当前类可以访问