JavaSE-day06
一、继承
1.认识继承
1)子类继承父类用extends实现,继承的出现减少了冗余代码,提高了代码的复用性。
2)子类继承父类的非私有成员(父类中成员变量还是定义成private,子类继承父类public修饰的get和set方法)
3)子类的对象是由父类和子类共同创建的,是完整的。
2.权限修饰符:基本成员变量都private,方法都是public,protected和无修饰的依据具体情况
1)private:只能当前类访问
2)缺省(无修饰符):只能当前类和同一个包下的其他类访问
3)protected:只能当前类、同一个包下的其他类、子孙类访问
4)public:所有类都可以访问
3.继承的特点
1)Java只支持单继承(即只能继承一个父类,不支持多继承)
2)Java可以多重继承(子类继承父类,父类继承爷爷类)
3)所有的类都是Object的子类(所有类都直接、间接、默认的继承Object类)
4)就近原则:访问对象和方法时优先访问自己类中的
若对象在当前方法和子类中都有重名,则优先访问当前方法中的对象,访问子类中的对象用this.对象名指定
若对象在当前方法、子类、父类中都有重名,则优先访问当前方法中的对象,访问父类中的对象用super.对象名指定
方法的访问同上
4.方法重写
1)方法名称、形参列表必须相同称为方法重写(注意与方法重载区别)
2)当子类继承父类的方法无法满足自身的要求时,重写父类方法
3)重写加@Override注解,本方法重写,可以帮助判别有无书写错误,可读性也增强了
4)私有、静态方法不能重写(因为无法访问,类自己持有),重写时返回值和修饰符范围都要更大或一样(基本上一样)
5)应用场景
每个类都是Object的子类都继承了toString方法,当直接输出对象时默认调用此方法s.toString(toString默认省略)
不重写默认生成地址返回,在实体类重写toString方法生成的就是当前类的成员信息(toString可自动生成)
5.子类构造器
1)子类全部构造器器执行时,必须先执行父类构造器(默认带super();未显示可省略)
2)子类构造器默认执行父类的无参构造器,也可以调用有参构造器(为对象中有父类成员变量的值进行赋值)
3)应用场景:当调用有参构造器(全部参数)时,当子类创建对象有父类的成员变量时
先调用父类的有参构造器传入父类成员变量值super(name,sex)(此时super不可省略)
再执行自己的有参构造器如this.skill等语句
4)this(...)调用兄弟构造器
应用场景:在子类构造器中第一行要么super调用父类构造器,要么this调用兄弟构造器(兄弟在调用父类构造器)
当传入数据需要加默认值时,如类有四个参数,创建对象调用3个参数构造器,为减少冗余代码直接
另一个参数默认,则在此构造器(构造器参数只有三个)中一行this(a,b,c,默认值);即可
(注:重写toString时子类要用get方法获取父类的成员变量值,不能直接赋值因为被private了)
二、多态:在继承/实现情况下的一种行为
1.多态有两种:对象多态(父类变量创建子类对象)、行为多态(子类方法重写父类方法)
2.多态条件:有继承关系,父类变量指向子类对象,子类重写父类方法
3.方法和对象具有多态:编译看左;执行看右
4.成员变量不具有多态:编译看左;执行也看左
5.多态的优点:Animal w = new Wolf();解耦合的形式,右边的对象可以改变Animal w = new cat();
便于拓展和维护:定义方法时形参用父类的类型,接收一切的子类对象都可以
6.多态的一个问题:当形参用父类的类型时,只能调用子类对象传入,只能调用子类对象重写的方法,不能调用子类的独有方法!
7.解决问题:多态下的类型转换(解决了多态下不能调用子类独有方法)
1)自动类型转换:对象的多态,父类变量指向子类对象,自动转换成子类类型
2)强制类型转换:子类类型 变量名 = (子类类型)父类变量名 (注:变量名是重新定义的,与数据类型之间的强转一样)
3)强转之后可以调用子类独有方法了
4)强转的注意事项:
存在继承关系的强转编译阶段不会报错,但运行阶段可能报错、
当父类变量的真实类型不是强转类型时,会出现ClassCastException类型转换异常错误
解决方法,每次强转时判断真实类型:if(变量名 instanceof 类型)

浙公网安备 33010602011771号