super关键字
super是直接父类对象的引用,可以通过super来访问类中被子类覆盖的方法和属性。所有构造方法第一行都有{super();},不论你是否会写,编译器都会给加上。Object类是没有的哈。同时采用包裹对象的形式实现。
每一个普通方法中都隐式传有this,super
普通方法 :没有顺序限制,可以随便调用
构造方法中 :任何类的构造函数中 ,若是构造函数的第一行代码没有显示调用super(),那么java会默认都会调用super(),作为父类的初始化函数,所以super()加不加都无所谓。
组合:就是把父类对象声明为子类的一个属性。
Bird{
Animal a = new Animal();
}
“is a”关系使用继承
“hasa”关系使用组合
final关键字
最终的值,不能被修改
修饰变量:常量,只能 初始化一次
修饰方法:该方法不能被重写,但是可以被重载
修饰类:该类不能被继承
封装/隐藏
高内聚:类的内部数据操作细节自己完成,不允许外部干涉
低耦合:仅暴露少量的方法给外部使用
隐藏对象内部的复杂性,只对外公开简单的接口
使用访问控制符,实现封装
|
同一个类 |
同一个包 |
子类 |
所有类 |
Private |
可以 |
|
|
|
Default |
可以 |
可以 |
|
|
Protected |
可以 |
可以 |
可以 |
|
pulbic |
可以 |
可以 |
可以 |
可以 |
类的属性处理:
1. 一般使用private,除非本属性确定会被子类继承
2. 静态的 final属性可以被公开
3. 一些只用于辅助于本类的方法用private
4. 希望其它类调用的方法用public
5. Boolean类型的属性没有get方法,变成is属性()的方法,set方法是有的。
多态
多态性是OOP的重要特性,主要用于实现动态联编,程序的最终状态只有在执行过程中才被决定而非在编译期间就决定了。
引用类型的两种类型:
编译时类型:模糊一点,一般是一个父类,由声明时的类型决定
运行时类型:运行时,具体是那个子类就是那个子类,由实际对应的对象类型决定。
多态存在要有3个必要条件:
要有继承,要有方法重写,父类的引用指向子类的对象。
如Animal a = new Cat()这个是可以通过的,如果Cat继承自Animal类。
但是不能调用cat中自己的方法,可以调用继承的方法。调用 cat中的自己独有的方法
编译器是不通过的(可以认为编译器比较死板),就不能直接调用cat里面的方法,如果要调用要强制转换为Cat才行。
Binstance of A(b对象是A类的实例对象的判断)这里要注意a instanceof Cat为true,因为它本来就是Cat类的实现。
特别注意super和this两个关键字是隐式参数,决定调用那个方法,用这两个关键字能很快分析出来究竟调用那个方法。
抽象类
是一种模板方式,子类可以在这个模板基础上进行拓展
通过抽象类,可以避免子类设计的随意性。
要点:有抽象方法的类只能定义抽象类
抽象类不能实例化也就是不能用new来实例化抽象类
抽象类可以包含属性、方法、构造方法。但是构造方法不能用来new实例。只能用来被子类调用。
抽象类只能用来继承
抽象方法必须被子类实现
特别注意:调用构造方法不一定能创建对象,创建实例也不一定需要构造方法(本地函数)
必须在子类的构造方法中调用父类的构造方法,且必须是在第一行就调用父类的构造方法。super(参数列表)
接口(interface)
设计与实现分离
接口中只有:常量(默认是public static final写或者不写都是这样的),抽象方法(public abstract 写或者不写都是这样的)
接口不能创建实例,但是可以用来声明引用变量类型。接口支持多继承(implement)。
内部类
把一个类放到另一个类的内部定义,成为内部类
内部类只能被外部类直接访问,不允许同一包中的其他类直接访问,内部类可以直接访问
部类私有属性,但是外部类不能访问内部类的属性,内部类当成外部类的成员。
内部类分类
1成员内部类
非静态内部类:Face f = new Face();
Nose n = f.new nose();
非静态内部类不能有静态方法和属性
静态内部类:类似静态属性
Eare = new Face.ear();
2匿名内部类
用的相当少,就是只有实现,没有名字。那就没法在其它地方调用。