一.继承中的super关键字与this关键字
1.理解为:父类的
2.super可以用来调用父类的属性、构造器、方法
3.super的使用
3.1 当子类声明了一个属性和父类相同时,如果在子类的构造器或方法中需要使用父类的那个属性,则需要用super显示调用父类属性
3.2 当子类重写了父类的某方法时,如果在子类的构造器或方法中需要使用父类中的该方法,则需要用super显示调用父类方法。
3.3 子类的构造器中显示调用父类中声明的指定构造器 :super(形参),且必须声明在子类构造器的首行。
3.4 在类的构造器中,针对于“this(形参)和super(形参)” 只能二选一,不能同时出现。因为this(形参)也只能放在构造器的首行。
3.5 如果在子类构造器中没有显示调用this或super,则默认调用父类的super().
二 . 方法重写与属性覆盖
1.属性覆盖:如果子类声明的属性名跟父类一样,则调用该属性时得到的是子类的属性值。
2.方法重写:如果子类的方法名(形参) 与父类相同,则称子类重写了父类的该方法。
2.1 子类权限修饰符需>=父类的权限修饰符
2.2.1子类的返回值类型 必须与父类相同或是父类的子类
2.2.2如果父类的返回值类型是void,子类也得是void
2.2.3如果父类的返回值是基本数据类型,则子类也必须是对应的基本数据类型
2.2.4如果父类权限修饰符是privite,则子类不能重写该方法,只能新建一个同名同参的方法。
2.2.5子类抛出的异常必须小于父类抛出的异常。
三.封装
理解为:只暴露必要的方法或属性给使用者,对非必要的属性或方法隐藏,代码模块化。
1.属性封装:将public legs改为private legs ,提供Public setLegs()方法 防止非法赋值。
2.方法封装:将不需要对外暴露的方法设为private ,仅供自己使用。
3.构造器封装:权限修饰符只能<=类的权限修饰符,将构造器设为private ,只能在本类创建对象。如单例的创建。
四.多态性-对象的多态性
理解为:一个事物的多种形态,将父类的引用指向子类的对象。
person p=new Man();//编译看左边(父类),运行看右边(子类)。
1.当p调用子类重写父类的方法时,编译器认为他调用的是父类的方法,但实际执行时是调用的子类的方法---此时父类方法叫虚拟方法,执行时会动态调用子类方法(动态绑定)。--所以我们称多态是运行时行为。
对于多态:只有等到方法调用时,解释运行器才会确定要调用的方法的地址-动态绑定
对于重载:在方法调用之前,即声明方法后,他们的调用地址就确定了(因为形参不同)。--静态绑定
2.p不能调用子类特有的方法。只能调用person声明的结构。(编译不通过 ,编译器认为p 是Person的对象)
如何才能调用子类的特有方法?
2.1.Man m=(Man)p;//高级(父类)向低级(子类) 强制类型转换。
强转风险:精度损失 或ClassCastException
2.2 使用Instanceof
3.多态的使用前提:子类继承父类。注意所有类都继承java.lang.Object类
4.使用场景:省去形参中类型不一样的多个重载方法
4.1 test.eat(new dog());test.eat(new cat);
4.2 public method(Object o); test.method(new dog());
4.3 getConnect (Connection con); con=new MysqlConnect();con=new OracleConnect();
5.对象的多态性 只适用于方法,不适用于属性。父类引用调用属性时还是使用的父类的属性值。
五.instanceof的使用
理解: a instanceof A :判断对象a是否是类A的示例
使用场景:为了避免使用强转时出现异常,先进行instanceof判断,再强转。
P a=new A();
if(a instanceof A ) {
A b=(A)a;
b.A特有方法
}