41. super关键字
super是直接父类对象的引用,可以通过super来访问父类中被子类覆盖的方法或属性。
普通方法:可以随便调用,没有顺序限制
构造函数中:任何类的构造函数中,若是构造函数的第一行代码没有显式的调用super(...);那么java默认都会调用super(),作为父类的初始化函数,所以你这里的super(),加不加都无所谓。
42. 继承VS组合
“是”的关系就使用继承
“拥有”的关系就使用组合
43. final 关键字
修饰变量:常量
修饰方法:该方法不可被子类重写,但是可以被重载
修饰类:修饰的类不能有子类,不能被继承。比如Math,String等。
44. 封装
封装要点:
类的属性的处理
1.一般使用private。(除非本属性确定会让子类继承)
- 提供相应的get/set方法来访问相关属性,这些方法通常是public的,从而实现对属性的读取操作。(注意boolean变量的get方法是用 is 开头的)。
一些只用于本类的辅助性方法可以用private。
希望其他类调用的方法用public。
45. 多态
多态性是OOP中的一个重要特性,主要是用来实现动态联编的,换句话说,就是程序的最终状态只有在执行过程中才被决定而非在编译期间就决定了。这对于大型系统来说,能提高系统的灵活性和拓展性。
Java中如何实现多态?使用多态的好处?
引用变量的两种类型:
编译时类型(模糊一点,一般是一个父类),由声明时的类型决定。
运行时类型(运行时,具体是哪个子类就是哪个子类),由实际对应的对象类型决定。
多态的存在要有三个必要的条件:
要有继承,要有方法的重写,父类引用指向子类对象
48. 抽象类
为什么需要抽象类?如何定义抽象类?
- 是一种模板模式,抽象类为所有子类提供了一个通用模板,子类可以在这个模板基础上进行拓展。
- 通过抽象类,可以避免子类设计的随意性。通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用。
要点:
- 有抽象方法的类只能定义为抽象类
- 抽象类不能实例化,即不能用new来实例化抽象类
- 抽象类可以包含属性,方法,构造方法。但是构造方法不能用来new实例,只能用来被子类调用。
- 抽象类只能用来被继承
- 抽象方法必须被子类实现
49. interface (接口)
为什么需要接口?接口和抽象类的区别?
- 接口就是比"抽象类"还"抽象"的"抽象类",可以更加规范的对子类进行约束。全面地专业地实现了:规范和具体实现的分离。
- 接口就是规范,定义的是一组规则,体现了现实世界中"如果你是.......则必须能......"的思想。
- 接口的本质是契约,就像我们人间的法律一样,制定好后大家都遵守。
- 项目的具体需求是多变的,我们必须以不变应万变才能从容开发,此处的不变就是"规范",因此,我们开发项目往往都是面向接口编程。
- 子类通过implements来实现接口中的规范。
- 接口不能创建实例,但是可用于声明引用变量类型。
- 一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的。
- 接口支持多继承
51. 内部类 (Inner Class)
一般情况,我们把类定义为独立的单元。有些情况下,我们把一个类放在另一个类的内部定义,称为内部类。
内部类的作用
- 内部类提供了更好地封装。只能让外部类直接访问,而不允许同一个包中的其他类直接访问。
- 内部类可以直接访问外部类的私有属性,内部类被当成其外部类得到成员。但外部类不能访问内部类的内部属性。
内部类的使用场合:
由于内部类提供了更好地封装特性,并且可以很方便的的访问外部类的属性,所以,通常内部类在只为所在外部类提供服务的情况下优先使用。
内部类的分类:
1.成员内部类(可以使用private,protected,public任意进行修饰,类文件: 外部类$内部类.class)
- 非静态内部类(外部类里面使用非静态内部类和平时使用其他类没有什么不同)
1. 非静态内部类必须寄存在一个外部类对象里,因此,如果有一个非静态内部类对象,那么一定存在对应的外部类对象。非静态内部类对象单独属于外部类的某个对象。
2. 非静态内部类可以使用外部类的成员,但是外部类不能直接访问非静态内部类成员。
3. 非静态内部类不能有静态方法,静态属性,静态初始化块。
4. 静态成员不能访问非静态成员:外部类的静态方法,静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量,创建实例。
5. 成员变量访问要点:
----------a .内部类里方法的局部变量:变量名
----------b.内部类属性:this.变量名
----------c.外部类属性:外部类名.this.变量名
6.内部类的访问:
----------a.外部类中定义内部类:new innerClass();
----------b.外部类以外的地方使用非静态内部类
- 非静态内部类
使用要点:
- 当一个静态内部类对象存在,并不一定存在对应的外部类对象。因此,静态内部类的实例方法不能直接访问外部类的实例方法。
- 静态内部类看做外部类的一个静态成员, 因此外部类的方法中,可以通过:静态内部类.名字 访问静态内部类的静态成员。通过new静态内部类()访问静态内部类的实例。
- 在外部类的外面创建静态内部类
public static void main(String[] args) {
Face.Nose nose = new Face().new Nose();
nose.breath();
Face.Ear ear = new Face.Ear();
ear.listen();
}
}
class Face {
int type;
class Nose {
String type;
void breath() {
System.out.println(Face.this.type);
System.out.println("呼吸!");
}
}
static class Ear {
void listen() {
System.out.println("我在听!");
}
}
}
52. 数组(Array)
- 数组是相同类型数据的有序集合
数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。- 数组有三个特点:
- 其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
- 其元素必须是相同类型,不允许出现混合类型。
- 数组中的元素可以是任何数据类型,包括基本类型和引用类型。