继承
super
super();
super调用父类的构造方法,且必须在构造方法的第一行。this();
调用本类的构造方法。- super只能出现在子类的方法或者构造方法中。
- super和this不能同时调用构造方法。
- this 代表 调用当前类的对象
- super 代表 调用父类的对象
- this 在没有继承的情况下也能使用
- super 只能在继承条件下才能使用
方法的重写
-
重写的意义:父类的功能,子类不一定需要,或者不一定满足。
-
只能子类重写父类的方法。
-
方法名必须相同。
-
参数列表必须相同(不同就是重载)。
-
修饰符:范围可以扩大但不能缩小:public>Protected>Default>private
-
抛出的异常范围可以缩小但是不能扩大:ClassNotFoundException-->Exception(大)
-
A a = new A();
创建了一个A
类的对象,并将其引用赋值给一个类型为A
的变量a
。B b = new A();
创建了一个A
类的对象,并将其引用赋值给一个类型为B
的变量b
。这种情况下,尽管实际对象是A
类的实例,但通过b
变量只能访问B
类中定义的方法和属性(除非这些方法在A
类中被重写) -
引用赋值:引用赋值(reference assignment)是指将一个对象的引用(即内存地址)赋值给一个变量。这样,变量实际上并不存储对象本身,而是存储一个指向对象的内存地址。多个变量可以引用同一个对象,这样的变量可以被用来访问和修改同一个对象的状态。
多态
- 多态是方法的多态
- 父类和子类,有联系 。否则类型转换异常ClasscastException!
- 存在条件:继承关系,方法需要重写,父类引用指向子类对象!
Father f1 = new Son();
调用方法时会执行子类中重写的方法。无论是通过父类的引用还是子类的引用,只要子类没有重写该方法,都会调用父类的方法 - 无法重写:1. static修饰的方法,属于类,它不是实例;2. final 定义的为常量;3. private方法。
instanceof
Person person = new Student();
X instanceof Y
instanceof
用于检查一个(X)对象(不是类型)是否是(Y)某个类(或其子类)的实例。
具体两个步骤:
- 编译时类型检查:编译器首先检查操作数的静态类型(编译时类型),确保这些类型(X和Y)之间有继承关系。如果没有继承关系,编译器就能确定
instanceof
判断的结果永远为false
,因此会报编译错误。 - 运行时类型检查:如果编译时类型检查通过,
instanceof
运算符将在运行时进行实际的对象(new Student属于Student的实例同时也属于Person、Object的子类)类型检查,以确定对象是否是特定类或其子类的实例。
类型转换
- 父类的引用指向子类的对象形如
Person student = new Student();
- 子类转换为父类为向上转型不需要强制转换,但是会丢失子类的一些方法。
- 父类转换为子类为向下转型需要强制转换。
- 作用:方便方法的调用,减少重复的代码,提高利用率
static
- 与类一起加载(最快),只加载一次。
- 匿名代码块和对象一起产生,在构造器之前。经常用于赋初始值
- final修饰的类不能被继承
抽象类
- 不能new这个抽象类,只能靠子类去实现它
- 有抽象方法的类必须设置为抽象类,但抽象类里面可以有普通方法
- 意义:作为一种标准框架设计并节约开发成本
接口
- 接口通过定义方法让不同的人实现,即一种方法有多种实现方式。
- interface定义接口,之前都是class定义为类。
- 接口可以多继承。
- 接口中所有定义的方法都是抽象的。
public abstract
只不过省略了。所有定义的属性都是常量 - 接口必须要有实现类,同时实现类必须重写接口中的方法。
- 接口不能被实例化,接口没有构造器
- implement可以实现多个接口(多久继承)
异常
错误
异常和错误的区别
异常的处理机制
- try(监控)-catch(捕获异常)-finally(善后工作)
- throw抛出异常,可以让catch捕获到。这是一种向下抛出
- throws在方法中捕获异常,相当于在方法中的异常向上抛出