- this表示当前对象,主要存在于两个位置:
构造器中: 就表示当前创建的对象.
方法中: 哪一个对象调用this所在的方法,那么此时this就表示哪一个对象. -
当一个对象创建之后,JVM会分配一个引用自身的引用:this.
-
使用this场景:
① 解决成员变量和参数(局部变量)之间的二义性,必须使用;一般set方法里
② 同类中实例方法间互调(此时可以省略this,但是不建议省略)。
③ 将this作为参数传递给另一个方法;
④ 构造器重载的互调,this([参数])必须写在构造方法第一行;当多个构造器重载时,或者多个方法重载时,一般的,我们是少参数的调用多参数的.
⑤ 将this作为方法的返回值(链式方法编程);
⑥ static不能和this一起使用;
-
-
给对象设置数据:
1):setter注入(属性注入).
2):构造注入. -
继承关系:子类可以继承父类原来的某些定义,也可以增加原来父类所没有的定义,或者覆写父类中的某些特性。只允许单继承,允许多重继承.
Object类要么是一个类直接父类,要么是一个类间接父类.
- 继承关系的作用:
1):解决了代码的重复问题.
2):真正的作用,表示出一个体系. - 以后,我们定义新的类去继承于框架中/组件中提供的父类.
- 子类继承父类之后,可以拥有父类的某一些状态和行为(子类复用了父类的功能或状态).
子类到底继承了父类的哪些成员(根据访问修饰符来判断):
1):如果父类中的成员使用public修饰,子类继承.
2):如果父类中的成员使用protected修饰,子类也继承,即使父类和子类不在同一个包中.
3):如果父类和子类在同一个包中,此时子类可有继承父类中 缺省修饰符的成员.
4):如果父类中的成员使用private修饰,子类打死都继承不到.因为private只能在本类中访问.
5):父类的构造器,子类也不能继承,因为构造器必须和当前的类名相同. -
方法覆写的原则(一同两小一大):Override
一同:
① 实例方法签名必须相同。 (方法签名= 方法名 + 方法的参数列表)
两小:
② 子类方法的返回值类型是和父类方法的返回类型相同或者是其子类。
子类可以返回一个更加具体的类.
③ 子类方法声明抛出的异常类型和父类方法声明抛出的异常类型相同或者是其子类。
子类方法中声明抛出的异常小于或等于父类方法声明抛出异常类型;
子类方法可以同时声明抛出多个属于父类方法声明抛出异常类的子类(RuntimeException类型除外);
一大:
④ 子类方法的访问权限比父类方法访问权 限更大或相等。
private修饰的方法不能被子类所继承,也就不存在覆盖的概念. -
解决子类继承父类之后,可能父类的某一个方法不满足子类的具体特征,此时需要重新在子类中定义该方法,并重写
只有方法存在覆盖的概念,字段没有覆盖.
6.super: 当前对象的父类对象.
7. super关键字的使用场景: 子类种有父类应用super;static不能和super以及this共存.
1):可以使用super解决子类隐藏了父类的字段情况.该情况,我们一般不讨论,因为破坏封装.
2):在子类方法中,调用父类被覆盖的方法,引出super的例子,此时必须使用super.
3):在子类构造器中,调用父类构造器,此时必须使用super语句:super([实参]). -
子类初始化过程:创建子类对象的过程.
在创建子类对象之前,会先创建父类对象.
调用子类构造器之前,在子类构造器中会先调用父类的构造器,默认调用的是父类无参数构造器..1): 如果父类不存在可以被子类访问的构造器,则不能存在子类.
2):如果父类没有提供无参数构造器,此时子类必须显示通过super语句去调用父类带参数的构造器. -
所谓隐藏就是“遮蔽”的意思。不叫覆盖
① 满足继承的访问权限下,隐藏父类静态方法:若子类定义的静态方法的签名和超类中的静态方法签名相同,那么此时就是隐藏父类方法。注意:仅仅是静态方法,子类存在和父类一模一样的静态方法.遵守一同两小一大不?怎么访问
② 满足继承的访问权限下,隐藏父类字段:若子类中定义的字段和超类中的字段名相同(不管类型),此时就是隐藏父类字段,此时只能在子类通过super访问被隐藏的字段。
③ 隐藏本类字段:若本类中某局部变量名和字段名相同不管类型,此时就是隐藏本类字段,(作用域)此时只能通过this访问被隐藏的字段。
-
class SuperClass{ public String name = “superClass.name”; public static void ooxx(){} } class SubClass extends SuperClass { public int name = 18; //隐藏了父类的name字段 public void doWork() { boolean name = false;//隐藏了本类中的字段 System.out.println(name);//false System.out.println(this.name);//18 System.out.println(super.name);//superClass.name } public static void ooxx(){}//隐藏,不叫覆盖 }