1.多态
P a1=new B();
根据传入子类对象,自主选择重写的方法,没有重写则用父类P。但这并不意味着这个对象是子类B对象,相反它自转为父类PB对象,不能使用子类B的特有方法,属性。
-
从生活多态概念:同一种操作行为,由于条件环境不同,得到的结果不同
-
从Java多态概念:同一种方法,由于面向的子类对象不同,得到不同的子类对象的结果
-
从内存理解多态:父类引用指向子类对象 *
-
Cut咔声
-
导演:暂停
-
医生:动手术
-
理发师:理发
-
CutMan咔声的男人*
-
多态的步骤:
-
1.先写父类
-
2.子类继承父类
-
3.重写父类的方法
-
4.使用多态语法:父类 对象名 = new 子类(); *
-
多态的三种使用:
-
1.父类引用指向子类
-
2.父类作为返回值
-
3.父类作为参数传递 * *
-
多态的好处:
-
1.提高了重用性和维护性
-
2.优化了代码,简化代码
-
3.得到不同的子类结果
-
多态的缺点:
-
1.不能够直接访问子类自己的方法,需要使用向下转型解决
-
使用instanceof 关键字判断,这个instanceof是用来判断引用数据类型
-
左边父类是否属于右边的子类的真实实例,返回true,否则false
2.重写与重载
-
方法重写:
-
当父类的需求不能满足子类的需求的时候,这个时候就需要用到方法重写
-
方法重写的特点:
-
1.在子类中使用
-
2.方法名称相同
-
3.方法的参数列表相同(个数、类型、顺序)
-
4.方法的返回值相同或者是父类的子类
-
5.父类的私有方法是不能够重写
-
6.父类的静态方法是不能够被子类覆盖为非静态方法
-
7.父类的非静态方法也不能够被子类所重写为静态方法
-
8.在定义方法的时候子类不能比父类抛出更大的异常
-
9.override重写
-
重载overload *
-
方法重写和方法重载的区别:
-
位置不同:子类(重写),本类(重载)
-
返回值不同:返回值相同或者是其子类(重写),返回值无关(重载)
-
修饰符不同:修饰符不能比父类的更严格(重写),修饰符无关(重载)
-
参数列表不同:(重写参数列表要一致)(重载参数列表不一致)
-
方法名称相同点:(重写和重载都方法名称相同)
子类问题就是指引用数据类型
私有private不能被直接访问或调用,有可能(父类公共方法有调用时)通过父类公共方法间接调用。
@Override检测重写,非必要
3.instanceof
解决对象所属子类问题,先判断再由父类向子类型强转
-
引用类型转换:向上转型和向下转换
-
基本类型转换:自动类型转换和强制类型转换
-
向上转型:(理解自动类型转换)
-
语法格式:父类 对象名 = new 子类();
-
把右边的子类转换成左边的父类类型
-
向下转型:(理解强制类型转换)
-
把右边的父类大类型转换成左边的子类小类型
-
(小类型)子类 对象名 = (子类类型)父类;
public class Test {
public static void main(String[] args) {
// Pets pp1=new Penguins();
// Dogs p1=(Dogs) pp1;
// p1.getStrain();//Dogs特有的方法
// //d1.feed();
// p1.selfSay();
// p1.feed();
// p1.specialDo();//编译不报错,这种相对难发现
//Exception in thread "main" java.lang.ClassCastException: w2day8.demo1.Penguins cannot be cast to w2day8.demo1.Dogs
// at w2day8.demo1.Test.main(Test.java:11)
//cannot be cast
Pets pp1=new Penguins();
//Dogs p1=(Dogs) pp1;
if(pp1 instanceof Dogs){
Dogs p1=(Dogs) pp1;
p1.getStrain();
//d1.feed();
p1.selfSay();
p1.feed();
p1.specialDo();
}
if(pp1 instanceof Penguins){
Penguins p1=(Penguins) pp1;
//d1.feed();
p1.selfSay();
p1.feed();
p1.specialDo();
}
}
}